不能在C ++中的双链表中释放节点

时间:2016-11-18 13:29:33

标签: c++ memory-management free doubly-linked-list

我尝试在双链表中编写删除节点的功能。 但我堆叠在第一个条件,其中nodeToDelete也是头。 当我使用该代码免费(nodeToDelete)不要释放nodeToDeleteBut nodeToDelete-> nextNode;

任何帮助?

编辑:删除也不工作看截图 - > https://s22.postimg.org/dff43kn9d/slide.jpg

编辑

void deleteNode(node *&head, int value) 

修复我的代码,谢谢。

void deleteNode(node *head, int value)
{
    node* nodeToDelete = head;

    while(nodeToDelete != NULL)
    {
        if(nodeToDelete->value == value)
        {
            if(nodeToDelete == head)
            {
                head = nodeToDelete->nextNode;
                head->previousNode = NULL;
                delete nodeToDelete;
                return;
            }

        }

        nodeToDelete = nodeToDelete->nextNode;
     }
}

2 个答案:

答案 0 :(得分:2)

您的步骤顺序错误。我画了一个带有节点和指针的快速草图,这是我发现的:

首先从两个指针开始:head和nodeToDelete,它们都指向要删除的节点。然后指向下一个节点并将其指针置为前一节点并继续删除nodeToDelete。 到目前为止没问题。

但是这一行:nodeToDelete = nodeToDelete->nextNode;是有问题的。

因为已经释放了nodeToDelete,所以你不能再使用它了,逻辑本身也不起作用。

我认为遵循的逻辑是:

  1. 指向下一个节点。

  2. make head-> previous point to nodeToDelete-> previous

  3. make nodeToDelete-> next指向head

  4. 删除nodeToDelete

  5. 通过这种方式,您可以使用上一个指向下一个,下一个指向上一个,并删除之间的一个。

    类似的东西:

    head = nodeToDelete->next;
    head->previous = nodeToDelete->previous;
    nodeToDelete->next = head;
    delete(nodeToDelete);
    

    while(nodeToDelete != NULL)不是必需的,如果需要,您可以使用if进行检查,但循环播放这是一个不错的主意。

    这是我做过的光彩画,也许它会有所帮助。对不起,我真的很糟糕......

    enter image description here

答案 1 :(得分:1)

如果head->值匹配,则在此函数内部改变头部,但这不会改变其他地方的头部。调用者现在有一个指向已删除节点的无效指针,无法找到实际节点。可能是这个无效指针导致后来的调用失败。

此外,如果head->值不匹配,则您搜索列表,但稍后拒绝对其执行任何操作,因为它不是头。没有其他条款。