【问题标题】:can't free node in double linked list in C++无法在 C++ 中释放双链表中的节点
【发布时间】:2017-04-02 09:07:49
【问题描述】:

我尝试编写删除双链表中节点的函数。 但是我在第一个条件下堆叠 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;
     }
}

【问题讨论】:

  • 如果你必须手动分配内存,你真的应该在 C++ 中使用newdeletemallocfree 不适用于 C++ 中的非标准布局类类型。
  • 请学习如何使用调试器,以及如何逐行执行代码。
  • 天哪!谢谢 !!!我使用 new 进行内存分配。应该使用 delete insted of free。
  • 画出你想要做的事情并检查你的逻辑是否有效。如果确实如此,请逐行调试程序。
  • 这可能是问题所在,因为将 free() 与 new 一起使用的行为可能出乎意料。请看:Post

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


【解决方案1】:

您的步骤顺序错误。我用节点和指针画了一个速写,这就是我发现的:

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

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

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

我认为遵循的逻辑是:

  1. 将头指向下一个节点。

  2. 使 head->previous 指向 nodeToDelete->previous

  3. 使nodeToDelete->下一个指向头

  4. 删除节点删除

这样你就可以让你的前一个指向下一个,你的下一个指向前一个,中间的那个被删除。

类似:

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

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

这是我画的一幅精美的图画,也许它会有所帮助。对不起,我真的很糟糕......

【讨论】:

    【解决方案2】:

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

    另外,如果 head->value 不匹配,则搜索列表,但稍后拒绝对其执行任何操作,因为它不是 head。没有 else 子句。

    【讨论】:

    • 感谢您的评论。我修复了我的代码。我应该通过引用传递头部,只需将 & 添加到函数及其工作。
    猜你喜欢
    • 2011-09-19
    • 2011-05-04
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 2013-07-23
    • 1970-01-01
    相关资源
    最近更新 更多