0

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

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); } 
4

2 回答 2

0

这条线

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

看起来不对。在tail->prev = n你要修改之后n->nexttail->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; 
    }

您遇到与上述问题类似的问题。

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

于 2013-04-14T01:20:52.913 回答
0

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

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

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

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

于 2013-04-14T01:13:02.327 回答