我正在尝试使用以下代码从链接列表中删除节点
void deleteMatchNode(node **list, int match)
{
node **temp = list;
node **prev = NULL;
while (*temp != NULL)
{
if ((*temp)->member == match)
{
printf ("match found\n");
break;
}
prev = temp;
temp = &(*temp) ->next;
}
printf("gg1 %p %p\n", *temp, *prev);
(*prev)->next = (*temp)-> next;
printf("gg %p %p\n", *temp, *prev);
printList(*list);
//free(*temp);
}
但是(* temp)的分配 - >旁边(*上一页) - >接下来是更改* temp的值,有人可以指出错误。 printList按预期工作,但是一旦在* temp。
上调用free,列表就会被破坏答案 0 :(得分:1)
我认为代码中的间距会产生误导。
prev = temp;
temp = &(*temp) ->next;
这与:
相同prev = temp;
temp = &((*temp)->next);
鉴于以前的作业,您可以将其写为:
temp = &((*prev)->next);
所以temp
指向(*prev)->next
,因此自然地分配给(*prev)->next
会更改*temp
的值,因为它们是引用同一对象的两种方式。
您可能只想保存指向要从列表中删除的节点的指针,以便稍后释放:
Node *save = *temp;
(*prev)->next = (*temp)->next;
free(save);
您需要检查NULL
指针的许多可能性。如果循环在第一次迭代时退出,那么prev
将为null,如果循环退出,因为*temp
为null,那么*temp
自然为空。您需要考虑这两种情况。
答案 1 :(得分:0)
我并不完全理解您的代码,但我想在您的代码中:
(*prev)->next
等于*temp
因此,当您释放临时值时,链接列表会被破坏。
我建议你用这个:
void deleteMatchNode(node **list, int match)
{
node *temp = *list;
node *prev = NULL;
while (temp != NULL)
{
if (temp->member == match)
{
printf ("match found\n");
break;
}
prev = temp;
temp = temp ->next;
}
printf("gg1 %p %p\n", temp, prev);
if(temp == *list){
*list = temp->next;
}else{
prev->next = temp->next;
}
printf("gg %p %p\n", temp, prev);
printList(*list);
free(temp);
}
答案 2 :(得分:0)
当您离开while
循环时,*temp
为NULL
。因此,(*temp)->next
不是有效指针。