首页 新闻 会员 周边

单链表的length()函数出现问题

0
悬赏园豆:10 [已解决问题] 解决于 2021-04-04 08:54
#include<stdio.h>
#include<stdlib.h>
//定义单链表的数据类型
typedef struct book{
	char name[10];
	int code;
	float price;
}book; 
typedef book Book;
//定义单链表 
typedef struct LNode{
	Book data;//存储节点值 
	struct LNode *next;//链表下一节点的地址 
}LNode,*LinkList;
//初始化
void InitLNode(struct LNode*L)
{
	L=(LNode*)malloc(sizeof(LNode));//建立头节点 
	if(!L){
		printf("分配空间出错,初始化失败!");
		exit(1);
	}
	L->next=NULL;//置单链表为空 
} 
//头插法,创建单链表 
LNode* creatList(void)
{
	LNode *head;//头指针 
	LNode *s;//新节点指针
	LNode *p;//工作指针
	Book c;
	head=(LNode*)malloc(sizeof(LNode));
	p=head;
	p->next=NULL;
	printf("请输入新节点的数据,当最后输入的值小于等于0时建表完成,该值不接入链表\n");
	scanf("%s%d%f",&c.name,&c.code,&c.price); 
	while(c.price>0){
		s=(LNode*)malloc(sizeof(LNode));
		p->data=c;
		s->next=p->next;
		p->next=s;
		printf("请输入书名,编码和价格:\n");
		scanf("%s%d%f",&c.name,&c.code,&c.price); 
	}
	printf("creatList函数执行,创建链表成功\n");
	return head;
	 
}
//单链表的长度
int length(LNode *L)
{
	int i=0;
	LNode *p;
	p=L;
	while(p->next!=NULL){
		i++;
		p=p->next;
		
	}
	return i;
 } 
 //单链表的插入
 LNode* insertheadList(LNode* L,int i,Book b)
 {
 LNode *s,*p;
 	p=L;
 	int j=0;
 if(i<=0){
 	printf("插入越界!\n");
 	exit(1);
 }
 while(p->next!=NULL){
 		if(j==i-1){
 		s=(LNode*)malloc(sizeof(LNode));
 		s->data=b;
 		s->next=p->next;
 		p->next=s;
 		printf("inserheadList函数执行,在第%d个位置插入了元素\n",j+1);
 		break;
	 }
 	p=p->next;
 	j++;
 }
	
	return L;
  } 
//单链表查询
Book search(struct LNode*L,int i)
{
	int j;
	Book b;
	LNode *p;
	p=L;
	if(i<0){
		printf("查询的节点越界了!");
		exit(1); 
	}
	j=1;
   while(p->next!=NULL){
   	p=p->next;
   	if(j==i){
   		b=p->data;
   		break;
	   }
   	j++;
   }
	
	return b;
 } 
void main()
{
  LNode L,*Q; 
  Q=&L;
  int i;
  InitLNode(&L);
  creatList();
  Book b;
 printf("请输入书本的name,code和price:\n");
 scanf("%s%d%f",&b.name,&b.code,&b.price);
  insertheadList(&L,1,b);
  //测试出length()函数有问题 
  printf("zzzzzzzzzzzzzzzzz\n");
  int y=length(&L);
  printf("length:%d\n",y);
  printf("qqqqqqqqqqqqqqqqqqq\n");
  
  //按链表的存储顺序输出 
  i=1;
  while(Q->next!=NULL){
  Book book=search(&L,i);
     Q=Q->next;
  	printf("name:%s,code:%d,price:%f\n",Q->data.name,Q->data.code,Q->data.price);
  	i++;
  }
  
}

加上length函数:

去掉length函数:

云雨归海的主页 云雨归海 | 初学一级 | 园豆:187
提问于:2021-04-03 19:24
< >
分享
最佳答案
0

length函数没问题,有问题的是你的createlist函数没有产生作用
1. 你的createList函数并没有对L,进行任何操作
2. 你的createList只是对head进行操作,最后返回了一个head,但是head没有赋值给变量,相当于作废了
3. 你把求长度函数注释之后,后面的打印链表也只会打印插入函数插入的内容
4. 我把createList函数返回值赋给L之后,将出现下面图片的情况(length函数能正常运行)
5. 之所以你的length没能正常运行是因为你的L是空的

收获园豆:10
Conan-jine | 小虾三级 |园豆:1272 | 2021-04-03 23:40

(你的代码缩进太乱了)
1. 粗略改了改你的代码,你的createList函数是错的,导致了输出未正确存储信息
2. 也就是说你单链表还得仔细学学
3. 改了一下的代码如下,能存储信息了,有点小BUG我也不想改了

#include<stdio.h>
#include<stdlib.h>
//定义单链表的数据类型
typedef struct book{
    char name[10];
    int code;
    float price;
}book; 
typedef book Book;
//定义单链表 
typedef struct LNode{
    Book data;//存储节点值 
    struct LNode *next;//链表下一节点的地址 
}LNode,*LinkList;
//初始化
void InitLNode(struct LNode*L)
{
    L=(LNode*)malloc(sizeof(LNode));//建立头节点 
    if(!L){
        printf("分配空间出错,初始化失败!");
        exit(1);
    }
    L->next=NULL;//置单链表为空 
} 
//头插法,创建单链表 
void creatList(LNode *head)
{
    LNode *s;//新节点指针
    LNode *p;//工作指针
    Book c;
    p=head;
    p->next=NULL;
    printf("请输入新节点的数据,当最后输入的值小于等于0时建表完成,该值不接入链表\n");
    scanf("%s%d%f",&c.name,&c.code,&c.price); 
    while(c.price>0){
        p->next=(LNode*)malloc(sizeof(LNode));
        p->data=c;
        p=p->next;
        printf("请输入书名,编码和价格:\n");
        scanf("%s%d%f",&c.name,&c.code,&c.price); 
    }
    printf("creatList函数执行,创建链表成功\n");
     
}
//单链表的长度
int length(LNode *L)
{
    int i=0;
    LNode *p;
    p=L;
    while(p->next!=NULL){
        i++;
        p=p->next;
        
    }
    return i;
 } 
 //单链表的插入
 LNode* insertheadList(LNode* L,int i,Book b)
 {
 LNode *s,*p;
     p=L;
     int j=0;
 if(i<=0){
     printf("插入越界!\n");
     exit(1);
 }
 while(p->next!=NULL){
         if(j==i-1){
         s=(LNode*)malloc(sizeof(LNode));
         s->data=b;
         s->next=p->next;
         p->next=s;
         printf("inserheadList函数执行,在第%d个位置插入了元素\n",j+1);
         break;
     }
     p=p->next;
     j++;
 }
    
    return L;
  } 
//单链表查询
Book search(struct LNode*L,int i)
{
    int j;
    Book b;
    LNode *p;
    p=L;
    if(i<0){
        printf("查询的节点越界了!");
        exit(1); 
    }
    j=1;
   while(p->next!=NULL){
       p=p->next;
       if(j==i){
           b=p->data;
           break;
       }
       j++;
   }
    
    return b;
 } 
int main()
{
  LNode L,*Q; 
  Q=&L;
  int i;
  InitLNode(&L);
  creatList(&L);
  Book b;
 printf("请输入书本的name,code和price:\n");
 scanf("%s%d%f",&b.name,&b.code,&b.price);
  insertheadList(&L,1,b);
  //测试出length()函数有问题 
  printf("zzzzzzzzzzzzzzzzz\n");
  int y=length(&L);
  printf("length:%d\n",y);
  printf("qqqqqqqqqqqqqqqqqqq\n");
  
  //按链表的存储顺序输出 
  i=1;
  while(Q->next!=NULL){
  Book book=search(&L,i);
     Q=Q->next;
      printf("name:%s,code:%d,price:%f\n",Q->data.name,Q->data.code,Q->data.price);
      i++;
  }
  
}
点击展示

Conan-jine | 园豆:1272 (小虾三级) | 2021-04-03 23:55

@Conan-jine:好嘞!谢谢!

云雨归海 | 园豆:187 (初学一级) | 2021-04-04 09:25
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册