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

时间:2014-08-06 23:09:32

标签: c pointers

这是我的功能:

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类型成员以及一个自引用指针。

1 个答案:

答案 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