猿问

关于c语言初学链表问题,问题在注释里?

#include <stdio.h>
#include <stdlib.h>
struct node
{
int data;
struct node *next;
};
struct node *add(struct node *head);//创建节点 
void display(struct node *head);//输出链表每项数据 
int main()
{

char ans;
struct node *mylink=NULL;
printf("要加入新的节点吗?");
scanf(" %c",&ans);
while(ans!='n')
{
mylink=add(mylink);
printf("要再加入新的节点吗?");
scanf(" %c",&ans);

display(mylink);


struct node *add(struct node *head)
{

int data;
struct node *pr=(struct node *)malloc(sizeof(struct node));
if(head==NULL)
{
head=pr;
printf("输入数据"); 
scanf(" %d",&(head->data));
head->next=NULL;
}
else
{
struct node *p=head;
while(p->next !=NULL) //这里不是也有p->next!= NULL吗? 
{
p=p->next;
}
printf("输入数据"); 
scanf(" %d",&(p->data));
p->next=NULL;
}
}

void display(struct node *head)
{
struct node *p=head;
while(p != NULL) // 为什么改成 while(p->next!= NULL) 程序就会崩溃,而且不能调试,我发现在display函数里只要有 这一句程序就会崩溃,而上面的42行却没有问题 
{
printf("%d",p->data);
p=p->next;
}
}

月关宝盒
浏览 751回答 1
1回答

DIEA

把while(p != NULL)改成while(p->next!= NULL)的话,从代码看不会有崩溃的问题,只是最后一个结点的内容打印不出来。这里的逻辑应该是while(p != NULL),结点指针不为空就输出。这代码若崩溃,原因不在你说的那里,而在于函数add中的else以后的代码逻辑错误,要改成如下才行——
随时随地看视频慕课网APP
我要回答