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