标题 c语言中链表只能输出第一个节点的数据
这是一个能输出全部学生信息的代码
#include <stdlib.h>
struct student
{
int num;
int score;
struct student *next;
};
#define lex sizeof(struct student )
struct student * creat(void)
{
struct student *head,*p1,*p2;
p1=malloc(lex);
printf("输入学生信息:");
scanf("%d %d",&p1->num,&p1->score);
p2=head=p1;
while(p1->num!=0)
{
p2=p1;
p1=malloc(lex);
printf("输入学生信息:");
scanf("%d %d",&p1->num,&p1->score);
p2->next=p1;
}
p2->next=NULL;
return head;
}
void main()
{
struct student *p3;
p3=creat();
while(p3->next!=NULL)
{
printf("%d %d\n",p3->num,p3->score);
p3=p3->next;
}
printf("%d %d",p3->num,p3->score);
}
这里是一个只能输出第一个学生信息的代码
在这里插入代码片
#include <stdlib.h>
struct student
{
int num;
int score;
struct student *next;
};
#define lex sizeof(struct student )
struct student * creat(void)
{
struct student *head,*p1,*p2;
p1=malloc(lex);
printf("输入学生信息:");
scanf("%d %d",&p1->num,&p1->score);
p2=head=p1;
while(p1->num!=0)
{
p1=malloc(lex);
printf("输入学生信息:");
scanf("%d %d",&p1->num,&p1->score);
p2=p1;
p2->next=p1;
}
p2->next=NULL;
return head;
}
void main()
{
struct student *p3;
p3=creat();
while(p3->next!=NULL)
{
printf("%d %d\n",p3->num,p3->score);
p3=p3->next;
}
printf("%d %d",p3->num,p3->score);
}
在这里插入代码片
对比上面的两个代码,可以发现只有编写链表的部分不一样
(1)
{
p2=p1;
p1=malloc(lex);
printf("输入学生信息:");
scanf("%d %d",&p1->num,&p1->score);
p2->next=p1;
}
p2->next=NULL;
在这里插入代码片
(2)
{
p1=malloc(lex);
printf("输入学生信息:");
scanf("%d %d",&p1->num,&p1->score);
p2=p1;
p2->next=p1;
}
p2->next=NULL;
在这里插入代码片
(1)是先p2=p1再开辟新节点;(2)是先开辟新节点再p2=p1;
第一个节点的next没有指向任何东西
只能输出第一个节点的数据