gpt4 book ai didi

c - 仅删除链表第一个节点时收到 "double free or corruption"

转载 作者:太空宇宙 更新时间:2023-11-04 02:22:27 24 4
gpt4 key购买 nike

这个程序的目的是在链表的末尾添加一个可以通过ID删除的节点。

除了第一个节点,我能够毫无问题地删除每个节点。在删除第一个节点后尝试做任何事情会导致意外行为,例如如果我添加更多节点,链表将被完全清除,在尝试显示链表内的数据时出现无限循环,或者出现错误“double free or corruption” ".

删除节点

struct node* delete_node(struct node *list)

{

struct node* p = list;
struct node* prev, *temp;
int id;

printf("\nEnter ID: ");
scanf("%d", &id);

while(p != NULL)
{
if(p->id == id)
{
temp = p;
p = p->next;
prev->next = p;

free(temp);
printf("\nNode Deleted");
return list;
}
prev = p;
p = p->next;
}

printf("\nID not found");
return list;
}

添加节点

struct node *add_node(struct node *list)

{

struct node *p;
int id;

printf("\nEnter ID: ");
scanf("%d", &id);

for(p = list; p != NULL; p = p->next)
{
if(p->id == id)
{
printf("\nUser with this ID already exists.");
return list;
}
}

struct node *new_req;
struct node *q = list;

char username[UNAME_LEN], password[UNAME_LEN];

printf("\nEnter username: ");
read_line(username, UNAME_LEN);
printf("\nEnter password: ");
read_line(password, UNAME_LEN);

new_node = malloc(sizeof(struct node));
if(new_node == NULL)
{
printf("\nError allocating memory!");
return list;
}

strcpy(new_node->username, username);
strcpy(new_node->password, password);
new_node->id = id;

if(list == NULL)
{
new_node->next = NULL;
list = new_node;
return list;

}


while(q->next != NULL)
q = q->next;

new_node->next = q->next;
q->next = new_node;

return list;

}

如果我在删除第一个节点后退出程序,我将得到“double free or corruption”,如果我在删除第一个节点后添加一个新节点并尝试显示数据,它将导致无限循环。如果我删除第一个节点,并添加 2 个额外的节点,链表将是清晰的,我可以退出而不会出错。

最佳答案

当您删除列表中的第一个节点时,您的删除代码无法正常工作。修复它的方法可能是:

    if(p->id == id)
{
if(p == list)
list = list->next;
else
prev->next = p->next;

free(p);
printf("\nNode Deleted");
return list;
}

并且不再需要 temp 变量。

关于c - 仅删除链表第一个节点时收到 "double free or corruption",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55779507/

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