【问题标题】:Printing a linked list in C++ (C++98)在 C++ (C++98) 中打印一个链表
【发布时间】:2014-02-27 22:10:02
【问题描述】:

我正在尝试打印链接列表中的节点(正向)。 定义如下:

struct Node {
  string val;
  Node* next;
  Node* prev;
};

struct Stew {
  Node* first;
  Node* last;
};

其中 Stew 有两个特殊的指针,一个指向第一个元素,一个指向最后一个元素。

我很肯定我的尝试是正确的,但实际上并非如此。

void print (const Stew& q, char direction) {
  assert (!isEmpty(q));
 {
    Node* current = new Node;

    current = q.first;
    cout << current -> val;

    while((current -> next) != NULL)
    {
        current = current -> next;
        cout << (current -> val);
    }
    delete current;
}

我知道其中存在逻辑错误,但我似乎无法确定它。任何帮助将不胜感激。

【问题讨论】:

  • 您是否考虑过对其进行调试,或者甚至绘制带有方框和箭头的图表来检查您的操作是否正确?
  • 你为什么要创建一个新节点只是为了打印你的链表?
  • 调试这个问题的最好方法是画一张图,然后指出问题所在。
  • @PaulMcKenzie 目的是让我的代码更清晰,以表明我有另一个节点正在扫描列表
  • 你为什么要删除节点只是为了打印你的链表?

标签: c++ printing linked-list c++98


【解决方案1】:

您为什么不阅读问题的答案?我已经向您展示了如何以正序和逆序打印列表。看这里。 Implementing a push function in c++

【讨论】:

    【解决方案2】:

    我认为您的问题可能是您将当前指针视为对象。 Current 是一个简单地指向内存中另一个对象的指针。因此,您的行 Node *current = new Node 毫无意义,并且您在内存中丢失了该节点。您的问题可能是您delete current 的最后一行。 Current 指向列表中的最后一项,当您调用 delete 时,您正在释放当前指向的内存。因此,您正在删除列表中的最后一个对象。只需要在内存中创建对象时使用delete,current不应该是新的item,应该是指向现有内存的指针。

    【讨论】:

      【解决方案3】:

      第一:

      Node* current = new Node;
      

      这完全没有必要。您不想从堆中创建新节点。您要做的就是将当前节点指向头节点:

        Node* current = q.first;
      

      然后假设 current 是一个有效节点,并且 next 指针将指向下一个有效节点或 NULL 表示列表的结尾,您的 while() 循环开始错误。应该是这样的:

       while(current != NULL)
       {
          cout << current->val;
          current = current->next; 
       }
      

      当然,最后去掉对“删除”的调用。

      【讨论】:

        猜你喜欢
        • 2021-01-23
        • 1970-01-01
        • 1970-01-01
        • 2016-01-21
        • 2016-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多