指定另一个指针会改变其值

时间:2013-12-22 00:08:23

标签: c pointers linked-list

我正在尝试使用以下代码从链接列表中删除节点

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,列表就会被破坏

3 个答案:

答案 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循环时,*tempNULL。因此,(*temp)->next不是有效指针。