單連結串列建立連結串列出現問題

雲雨歸海發表於2021-04-04

單連結串列建立連結串列出現問題,一開始以為是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++;
     }
  
}

相關文章