【问题标题】:What is the issue with this C++ simple linked list implementation?这个 C++ 简单链表实现有什么问题?
【发布时间】:2016-08-26 18:30:51
【问题描述】:

这是一个相当简单的项目,我花了大约 20 个小时在它上面绕了一圈,一点进展都没有。一开始我似乎朝着正确的方向前进,但我有一个 TA 试图向我解释它,它扭曲了我的大脑,让我回到了原点。

我知道这很可能是一个简单的错误,所以我将发布代码以及我的解释。注意:断言函数不是问题

在 H 文件中

struct Node {
    int num;
    Node *next;
};   

CPP 文件

void Intset::insert(int key)
{
   Node * current;
   current->num = key;
   current->next = NULL;
   assert (!find(key));
   if(head == NULL)
   {
      head = current;
   }
   else if(head->num >= key)
   {
      head->next = head;
      head = current;
   }
   else if(head->num < key)
   {
      head->next = current;
   }

所以我在这个函数(将键插入排序链表)背后的想法是创建一个新节点 current 并用用户输入的键填充其 num 字段,并使其下一个字段等于 NULL。我的第一个检查是查看 head 是否为空,以及是否将 current 的内容复制到它。我的第二个检查是查看 head 的 num 字段是否包含大于或等于用户输入键的数字。

如果是这样,我将头节点移动到下一个节点并用当前节点替换它(前面的数字较小)。我的第三次检查查看 head 中的数字是否小于用户输入的密钥,如果是这样,它将用 current 填充 head 的下一个字段(较小的数字首先出现)。到目前为止,我遇到了段错误错误,我不确定我分配不正确。

【问题讨论】:

  • 你需要为新节点声明内存。你不能就这样简单地插入它。
  • 调试器是解决此类问题的正确工具。 询问 Stack Overflow 之前,您应该逐行浏览您的代码。如需更多帮助,请阅读How to debug small programs (by Eric Lippert)。至少,您应该 [编辑] 您的问题,以包含一个重现您的问题的 Minimal, Complete, and Verifiable 示例,以及您在调试器中所做的观察。
  • 找出链表的最佳方法是使用铅笔和纸。画出列表中的节点。绘制节点之间的连接。然后在您对其进行操作、插入和删除等操作时重新绘制列表和任何其他涉及的节点...

标签: c++ insert linked-list


【解决方案1】:

从这里开始:

Node * current;
current->num = key;
current->next = NULL;

current 指向哪里?您正在取消引用未初始化的指针。这是undefined behavior,它很可能会导致段错误。

【讨论】:

  • 谢谢 Ben 是这里需要的新功能还是我应该合并成一行?
  • @Riossm,对不起,但根据我的回答,我认为该评论没有意义,您是什么意思?
  • 前。当前 = 新节点(键,NULL);
  • @Riossm 这是一个开始,是的,但请确保您阅读了有关newdelete 以及它们的作用,以确保您不会导致内存泄漏。
  • 谢谢 Ben 我最终使用 Node * current;当前=新节点;当前->数字=键;当前->下一个 = NULL;
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 2015-02-16
  • 2018-10-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多