C ++链接列表打印......我得到了无限循环

时间:2013-04-14 00:58:39

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

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

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 ----&gt; A2,但我得到的是A1 ----&gt; A1 ----&gt;

我认为我的添加功能存在问题。

这是我使用的功能

  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 个答案:

答案 0 :(得分:0)

您的案件有点多余。应由此特定插入函数处理的案例包括。

  1. d == head(需要将头改为newNode)
  2. head == tail(需要更改头部和尾部,当列表为空时也是这种情况,因为head == tail == NULL)
  3. 您也可以考虑访问TA或教师办公时间。

    你对很基本的概念有很多疑问,如果你没有从你的讲义中收集足够的信息来理解这些想法背后的逻辑(来自你的所有帖子),那么你应该试着联系到您的教练,助教或其他在校园内获得帮助的选择。因为这些是非常重要的想法,可以完全理解定制数据结构和应用程序开发的未来发展。

答案 1 :(得分:0)

这一行

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

看起来不正确。在tail->prev = n之后,您将使用n->next修改tail->prev->next = ...,而不是tail->prev->next。实际上,你在这里有未定义的行为,因为你修改然后在表达式中使用相同的变量(tail->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; 
    }

你遇到类似上述问题的问题。

使用调试器。但在此之前,要在纸上解决所有问题。