gpt4 book ai didi

c - 链接列表程序停止工作错误

转载 作者:行者123 更新时间:2023-11-30 16:39:46 25 4
gpt4 key购买 nike

我正在用 C 语言编写一个链表程序

问题出在创建函数上。Create() 在第一次运行时工作得很好。然后,当我退出菜单并再次调用创建函数时,程序崩溃并显示消息“linkedlist 已停止工作”提示:linkedlist 是我的 prgrm 的名称。

void create()
{
do
{
printf("Enter the num:");
head=(NODE *) malloc(sizeof(NODE));
scanf("%d",&head->num);
head->next=NULL;
if(start==NULL)
start=ptr=head;
else
{
ptr->next=head;
ptr=head;
}
printf("Do you want to enter more elements:(1/0)");
scanf("%d",&ch);
}
while(ch==1);
}

最佳答案

我从您的代码中观察到您正在使用 ptr 作为指向链表最后一个节点的指针,如 create() 函数的以下几行所示:-

if (start==NULL)
start = ptr = head;
else
{
ptr->next=head;
ptr=head;
}

在显示功能中,您再次初始化

ptr = start;

然后遍历到循环末尾,其中 ptr 变为 null,如下所示:-

while(ptr!=NULL)
{
printf("%d->",ptr->num);
ptr=ptr->next;
}

(类似地,在 delast() 和 delany() 函数中,您正在执行以下操作:-

free(ptr);

这将再次导致 ptr = null,从而导致段错误。 )

因此,当您第一次创建列表时,代码可以正常工作,因为 ptr 的值被保留,但是,一旦您显示列表或删除任何元素,然后再次返回创建列表(菜单选项 1) ),ptr的值变为null,所以,

ptr->next = head;

导致段错误

因此,一种可能的解决方案是在 create() 函数中使用新指针 *end 而不是 *ptr,并且永远不要使 end 的值 = null;如下图:-

void create()
{
do{
printf("Enter the num:");
head=(NODE *) malloc(sizeof(NODE));
scanf("%d",&head->num);
head->next=NULL;
if(start==NULL)
start=end=head;
else
{
end->next=head;
end=head;
}
printf("Do you want to enter more elements:(1/0)");
scanf("%d",&ch);
}
while(ch==1);
}

或者,你在创建列表时,可以遍历到列表的末尾来添加新元素,而不是直接使用结束指针(这样,不需要保存额外的结束指针)。

void create()
{
do{
printf("Enter the num:");
head=(NODE *) malloc(sizeof(NODE));
scanf("%d",&head->num);
head->next=NULL;
if(start == NULL)
start = head;
else
{
ptr = start;
while (ptr->next != NULL){
ptr = ptr->next;
}
ptr->next = head;
}
printf("Do you want to enter more elements:(1/0)");
scanf("%d",&ch);
}
while(ch==1);
}

关于c - 链接列表程序停止工作错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46936350/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com