gpt4 book ai didi

C-尝试删除链表中的第一个节点时出现双重释放错误

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

我正在尝试编写一个删除函数,从链表中删除节点。其结构及功能定义如下:

struct dog{
int number;
char dog_name[NAME_LEN+1];
char owner_last_name[NAME_LEN+1];
char breed[NAME_LEN+1];
struct dog *next;
};

struct dog *delete_from_list(struct dog *dogs)
{
struct dog *cur, *prev;
int delete_number;

printf("\nEnter the patient number of the dog you want to delete: ");
scanf("%d", &delete_number);

for(cur = dogs, prev = NULL; cur != NULL && (cur->number != delete_number);
prev = cur, cur = cur->next)
;

if(cur == NULL)
{
printf("Dog not found.\n"); /*dog not found in list*/
return dogs;
}else if(prev==NULL)
{
dogs = dogs->next; /*dog now points to the second node*/
}else
prev->next = cur->next; /*dog is in another node*/

printf("Deleted: Dog name: %s, Breed: %s, Owner's last name: %s\n",
cur->dog_name, cur->breed, cur->owner_last_name);
free(cur);
return dogs;
}

当我运行程序时,删除功能将一直工作,直到我尝试删除第一个节点。我使用调试器发现 dogs = dogs->next; 是发生错误的地方,但我不明白为什么如果我移动 dogs 的新头就会导致问题 到第二个节点。有人可以帮我吗?

最佳答案

根据您的评论,您将其称为:

delete_from_list(dog_list);

这在第一个元素被删除的情况下不起作用,因为在这种情况下delete_from_list将返回新的列表头(以前是列表的第二个元素),但是 dog_list调用者中的 仍将指向现在已删除的前第一个元素。要解决此问题,您所需要做的就是将其更改为:

dog_list = delete_from_list(dog_list);

这样dog_list将在调用者中更新,并且不再指向已删除的列表元素。

关于C-尝试删除链表中的第一个节点时出现双重释放错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36828854/

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