单链表创建链表出现问题,一开始以为是length函数有错,但是排查不出来,经过博客问答,知到了问题的根本原因,随便还改正了代码混乱的毛病

博问链接: https://q.cnblogs.com/q/134034/

错误代码:

#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++;
  }

}

根据https://q.cnblogs.com/q/134034/ 纠正后的代码:

#include<stdio.h>
#include<stdlib.h>
//定义单链表的数据类型
typedef struct book
{
	char name[10];
	char code[10];
	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%s%f",&c.name,&c.code,&c.price);
	while (c.price>0)
	{
		s=(LNode*)malloc(sizeof(LNode));
		s->next=p->next;
		p->next=s;
		s->data=c;
	    printf("请输入书名,编码和价格:\n");
		scanf("%s%s%f",&c.name,&c.code,&c.price);
	}
	printf("creatList函数执行,创建链表成功\n");
	return head;
}

//单链表的长度
int length(struct LNode *L)
{
	int i=0;
	LNode *p;
	p=L;
	while (p->next!=NULL)
	{
		i++;
		p=p->next;
	}
	return i;
 }

 //单链表的插入
 LNode* insertheadList(struct 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;
    Book b;
    int i;
    Q=&L;

    InitLNode(&L);
    L=*creatList();
    printf("请输入书本的name,code和price:\n");
    scanf("%s%s%f",&b.name,&b.code,&b.price);
    insertheadList(&L,1,b);
    int y=length(&L);
    printf("单链表的length:%d\n",y);

  //按链表的存储顺序输出
     i=1;
     while (Q->next!=NULL)
    {
         Book book=search(&L,i);
         Q=Q->next;
  	    printf("name:%s,code:%s,price:%f\n",Q->data.name,Q->data.code,Q->data.price);
  	     i++;
     }

}
04-04 12:54