【问题标题】:Circular Linked List [closed]循环链表[关闭]
【发布时间】:2017-03-03 10:01:33
【问题描述】:

上下文:从文件 (input.txt) 创建一个循环的双向链表,其中包含一个名称列表。姓名数量不详。

提示用户输入要删除的节点数,然后从列表中相应地删除。

假设:用户输入的数量不会超过列表中节点的实际数量。

问题:我的删除节点功能不起作用,因为当我去显示应该删除的节点中的内容时,数据仍然存在。有什么帮助吗?

我的代码:http://www.cplusplus.com/forum/general/210015/

(我正在链接到这个其他网站,因为在那里格式化更容易。)

【问题讨论】:

  • 这里应该包含代码。使用编辑器对其进行格式化,然后在此处复制/粘贴。
  • 也许,不要强迫我们依赖输入文件来提供编译后的代码。
  • 在复制/粘贴之前,将代码缩减为minimal reproducible example,并验证它是否重现了问题。

标签: c++ linked-list nodes doubly-linked-list circular-list


【解决方案1】:

我的删除节点功能不起作用,因为当我去显示应该删除的节点中的内容时,数据仍然存在。

访问已销毁(删除)的对象具有未定义的行为。

当行为未定义时,您无法预期程序的行为方式。因此,您期望 “数据不应该存在” 是没有根据的。正确的预期是数据可能存在,也可能不存在,程序可能崩溃也可能不崩溃,守护进程可能会或可能不会飞出用户的鼻子。

【讨论】:

    【解决方案2】:

    void deleteNode(struct node *&head) 的代码有很多错误。

    1. 你不检查head是否为nullptr
    2. 您不检查current->next 和/或current->prev 是否为nullptr

    访问 nullptr 指针是未定义的行为,这可能意味着崩溃或意外结果等。

    【讨论】:

    • current->nextcurrent->prev 永远不会是 nullptr。
    • 应该是,IIF链表插入正确实现。但是,基于 deleteNode() 我会安全地玩,至少在这里和那里放一些 assert() ;-)
    【解决方案3】:

    尝试使用以下删除功能删除节点。 注意:假设删除从头部开始。

      void deleteNode(struct node *&head,int deleteCount)
      {
            if(head != NULL){
                struct node *current=head; //copy of head.
                struct node *temp,*headPrev,*headNext;
                headPrev = head->prev;
                headNext = head->next;
                int count = 0;
                while(count++ < deleteCount)   
                {
                     //add code to free current node from me
                     temp = current; //get rid of this node
                     currrent = current->next; //skip all the nodes you want delete
                }
                current->prev = headPrev;
                headPrev->next = current;
                head = current;
            }
      }
    

    【讨论】:

    • 两点:循环双向链表,不会有空指针,删除节点数总是小于节点总数
    • 你要删除多少个节点?
    • 我遵循这个假设:用户输入的数量不会超过列表中的实际节点数。
    • 让我们这样说:假设 deleteCount > 1,你真正销毁了多少个节点(对它们调用了 delete)?你泄漏了多少?顺便说一句,您的代码更好地检查您的假设;-)
    • 好的,我只是从列表中删除所有节点。我们还需要为这些节点释放内存。对c++不太熟悉
    猜你喜欢
    • 1970-01-01
    • 2011-11-24
    • 2014-10-30
    • 1970-01-01
    • 2016-07-18
    • 2020-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多