这是我的功能:
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类型成员以及一个自引用指针。
答案 0 :(得分:2)
我想我得到了这个。如果您使用注释代码,会发生以下情况:
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