【问题标题】:C++ Linked List Printing... I get the infinite loopC++ 链表打印...我得到了无限循环
【发布时间】:2013-04-14 00:58:39
【问题描述】:

我在我的主要功能中使用了它,但它不起作用

void LinkedList::TraPrinHead(const LinkedList& p)
{
  Nodes* currentNodes = header->next;
  while( currentNodes != tail ) {
     cout << currentNodes->elem << " ----> ";
     currentNodes = currentNodes->next; }
}

我希望从中打印整个列表...但我一直在无限循环。

   cout << currentNodes->elem << " ----> ";
   currentNodes = currentNodes->next;
   cout << currentNodes->elem << " ----> ";
   currentNodes = currentNodes->next;

即使我简化它只是为了打印出列表中的前两个元素 我没有得到无限循环,但对于不同的两个节点不断得到相同的东西

例如,我的第一个节点是 A1,第二个是 A2,但具有该功能 我希望得到 A1 ----> A2 但我得到的是 A1 ----> A1 ---->

我认为我的添加功能有问题。

这是我使用的功能

  void LinkedList::InsertDoublyBefore(Nodes* d, const string& e) {

  if (header->next == tail) 
  { 
     Nodes* n = new Nodes;
     n->elem = e; 
     n->next = tail;
     n->prev = tail->prev;
     tail->prev->next = tail->prev = n; 
     header->next = n; // very important!!!!
  }
  else
  {
       if (d==tail) 
        {
         Nodes* n = new Nodes;
         n->elem = e;
         n->next = tail;
         n->prev = tail->prev;
         tail->prev = n;
         }
       else
       {
         Nodes* n = new Nodes; 
         n->elem = e; 
         n->next = d; 
         n->prev = d->prev;
         d->prev->next = d->prev = n; 
        }
      }

     }

     void LinkedList::InsertDoublyAfter(Nodes* d, const string& e) 
     {
         InsertDoublyBefore(d->next, e);
     }

   void LinkedList::addtoFront(const string& e)  { InsertDoublyBefore(header->next, e); }
   void LinkedList::addtoBack(const string& e) { InsertDoublyBefore(tail, e); } 

【问题讨论】:

  • 我有 2 个查询。调用函数时,d 指向什么?它是列表的第一个元素还是最后一个?另一个问题,headertail 在哪里被初始化?在您的代码中,我没有观察到 tail 正在更新。这是预期吗?

标签: c++ pointers data-structures linked-list graph-theory


【解决方案1】:

您的案例有点多余。这个特定的插入函数应该处理的情况包括。

  1. d==head(需要将head改为newNode)
  2. head==tail(需要改变head和tail,当list为空时也是这种情况head==tail==NULL)

您还可以考虑访问您的助教或教师的办公时间。

您对非常基本的概念有很多疑问,如果您没有从讲义中收集足够的信息来理解这些想法背后的逻辑(从您的所有帖子中),那么您应该尝试联系您的讲师、助教或其他在校园内寻求帮助的选项。因为这些对于未来定制数据结构的开发和应用程序开发来说是非常重要的思想。

【讨论】:

  • 哦,谢谢您的建议...根据您对节点的简要概念,我刚刚找到了正确的方法!
【解决方案2】:

这一行

    tail->prev->next = tail->prev = n;

看起来不对。在tail-&gt;prev = n 之后,您将用tail-&gt;prev-&gt;next = ... 修改n-&gt;next,而不是真正的tail-&gt;prev-&gt;next。实际上,您在这里有未定义的行为,因为您修改然后在表达式中使用相同的变量 (tail-&gt;prev),这更糟糕。

这里

   if (d==tail) 
    {
     Nodes* n = new Nodes;
     n->elem = e;
     n->next = tail;
     n->prev = tail->prev;
     tail->prev = n;
     }

您似乎只修改了一半的链接。

这里

   {
     Nodes* n = new Nodes; 
     n->elem = e; 
     n->next = d; 
     n->prev = d->prev;
     d->prev->next = d->prev = n; 
    }

你有类似上述的问题。

使用您的调试器。但在此之前,把所有事情都写在纸上。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-28
    相关资源
    最近更新 更多