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