2016-11-18 81 views
0

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

有帮助吗?

编辑:用delete也不要工作,见截图 - >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

你真的应该使用'new'和'delete'在C++中,如果你有做手工的内存分配。 'malloc'和'free'不适用于C++中的非标准布局类类型。 – NathanOliver

+0

请学习如何使用调试器,以及如何逐行执行代码。 –

+0

哦!谢谢 !!!我使用新的内存分配。应该使用免费的删除。 – pZCZ

回答

1

如果头戴式>值匹配,你改变这个函数内部头,但不会在其他地方改变头。调用者现在有一个指向已删除节点的无效指针,无法找到实际节点。这可能是这个无效的指针,导致以后的调用失败。另外,如果head-> value不匹配,那么您搜索列表,但稍后会拒绝对它执行任何操作,因为它不是头像。没有其他条款。

+0

感谢您的评论。我修复了我的代码。我希望通过参考通过头部添加和功能及其工作。 – pZCZ

2

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

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

但是这条线:nodeToDelete = nodeToDelete->nextNode;有问题。

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

我认为遵循的逻辑是:

  1. 点的头到下一个节点。

  2. 让头戴式>以前点nodeToDelete->以前

  3. 制作nodeToDelete->下一点头

  4. 删除nodeToDelete

这样,你将有你以前指向下一个,你的下一个指向前一个,中间的一个被删除。

喜欢的东西:

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

while(nodeToDelete != NULL)是没有必要的,你可以用if检查,如果你想要的,但循环,这不是一个好主意。

这是我做的一个辉煌的绘画,也许它会有所帮助。对不起,我真的不好......

enter image description here