gpt4 book ai didi

c - 当给出指向节点的指针时,删除单链表中的节点。分配指针不起作用

转载 作者:太空宇宙 更新时间:2023-11-04 08:38:17 25 4
gpt4 key购买 nike

这是我的功能:

void deleteAtPointer(struct node **toDel)
{
printf("\ndeleteAtPointer");

struct node *temp=NULL;
temp=(*toDel)->next;

//(*toDel)=temp->next;
//free(temp);
(*toDel)->next=temp->next;
(*toDel)->data=temp->data;
//(*toDel)=temp; //If I uncomment this line and comment the above two lines, the node doesn't get deleted. Why?
free(temp);
}

为什么赋值运算符不将指针 temp 赋给 (*toDel),而如果我将它的每个内容一个一个赋值,它就可以工作。

节点结构有一个 int 类型成员和一个自引用指针。

最佳答案

我想我明白了。如果您使用注释代码,会发生以下情况:

temp = (*toDel)->next;

┌───┐ ┌───┐ ┌───┐ ┌───┐
│ A │ → │ B │ → │ C │ → │ D │
└───┘ └───┘ └───┘ └───┘
↑ ↑
toDel temp

(*toDel) = temp->next;

┌───┐ ┌───┐ ┌───┐ ┌───┐
│ A │ → │ B │ → │ C │ → │ D │
└───┘ └───┘ └───┘ └───┘
↑ ↑
temp toDel

free(temp);

┌───┐ ┌───┐ ╔═══╗ ┌───┐
│ A │ → │ B │ → ║XXX║ → │ D │
└───┘ └───┘ ╚═══╝ └───┘
↑ ↑
temp toDel

(*toDel) = temp;

┌───┐ ┌───┐ ╔═══╗ ┌───┐
│ A │ → │ B │ → ║XXX║ → │ D │
└───┘ └───┘ ╚═══╝ └───┘

toDel / temp

您的节点已失效,但 toDel 仍指向它。相当危险。

未注释的代码是正确的(不要忘记 NULL 测试):

void deleteAtPointer (struct node ** toDel)
{
if (toDel == NULL ││ *toDel == NULL)
return ;

struct node * temp = (*toDel)->next;

if (temp)
{
(*toDel)->data = temp->data;
(*toDel)->next = temp->next;
free(temp);
}
else
{
free(*toDel);
*toDel = NULL;
}
}
(*toDel)->data = temp->data;

┌───┐ ┌───┐ ┌───┐ ┌───┐
│ A │ → │ C │ → │ C │ → │ D │
└───┘ └───┘ └───┘ └───┘
↑ ↑
toDel temp

(*toDel)->next = temp->next;

┌───────┐
┌───┐ ┌───┐ │ ┌───┐ │ ┌───┐
│ A │ → │ C │ ─┘ │ C │ └─> │ D │
└───┘ └───┘ └───┘ └───┘
↑ ↑
toDel temp

free(temp);

┌───────┐
┌───┐ ┌───┐ │ ╔═══╗ │ ┌───┐
│ A │ → │ C │ ─┘ ║XXX║ └─> │ D │
└───┘ └───┘ ╚═══╝ └───┘
↑ ↑
toDel temp

关于c - 当给出指向节点的指针时,删除单链表中的节点。分配指针不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25171771/

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