双链表插入问题

时间:2013-09-26 11:56:59

标签: c++ pointers insert linked-list

我在列表中插入节点时出现问题,以便按顺序显示。这是我将节点插入列表的功能:

void LinkedList::insert(const int item)
{
   Node *newNode = new Node;
   newNode -> data = item;

   if(head == NULL)
   {//in case of empty list
      head = tail = newNode;
      newNode -> next = NULL;
      newNode -> previous = NULL;
      ++count;
   } else {

      Node *ptr = head;

      while((ptr && (ptr -> next) != NULL) && (item < (ptr -> data)))
      {//traversing the list to find the correct insertion point
         ptr = ptr -> next;
      }

      if((ptr -> previous) == NULL)
      {//the insertion point is before the head of the list
         newNode -> previous = NULL;
         newNode -> next = ptr;
         ptr -> previous = newNode;
         head = newNode;
         ++count;
      }
      else if((ptr -> next) == NULL) 
      {//end of list insertion
         newNode -> next = NULL;
         newNode -> previous = ptr;
         ptr -> next = newNode;
         tail = newNode;
         ++count;
      } else {//middle of the list insertion
        (ptr -> previous) -> next = newNode;
         newNode -> previous = ptr -> previous;
         newNode -> next = ptr;
         ptr -> previous = newNode;
         ++count;
      }
   }
}

按顺序排列的唯一节点是插入列表头部或尾部的节点。当必须将节点插入列表的中间时,节点的顺序将被超越。这是我从main()

打印出结果时得到的结果
int main()
{
    LinkedList database;

    cout<<"The count is: "<< database.lenght() << endl;

    database.insert(11);
    database.insert(1);
    database.insert(8);
    database.insert(62);
    database.insert(55);
    database.insert(100);
    database.insert(00);
    cout<< endl;

    cout<<"The count is: "<< database.lenght() << endl;

    cout<< endl;
    database.print_forwards();

return 0;
}

输出:

The count is : 0

the count is : 7

 100
 62
 55
 8
 1
 11
 0

有人可以解释我的插入功能有什么问题吗?谢谢,

4 个答案:

答案 0 :(得分:1)

您已经以ptr指向列表中>应该插入的项目中的位置的方式编写了上述循环(至少从循环条件看起来如此)。但是,(ptr -> previous) == NULL应该检查新元素是否会成为列表的新头部,而事实上它会检查列表的头部是否是元素之前的元素。您应该检查是否item < head->data而不是此检查。

同样在中间案例中,您应该使用ptr->next及其链接而不是ptr->previous。尝试在纸上绘制几个简单的例子 - 例如你在主体中试用的那个,我认为你应该能够弄清楚发生了什么。

答案 1 :(得分:1)

澄清一下,既然你说只有头部和尾部处于有序状态,那么你试图将它们从最小到最小插入?如果是这样的话,它会立即出错。查看出现问题的最简单方法是手动使用您的号码运行代码。只需按照你的代码输入11,然后1.在1之前插入1,因为你只做了项目&lt; ptr-&gt;在while循环中检查数据,你不要在if和else中再次执行。

插入11之后,当尝试插入1时,ptr-&gt; next为null,因此while循环不会运行而你直接进入

if((ptr -> previous) == NULL)
  {//the insertion point is before the head of the list
     newNode -> previous = NULL;
     newNode -> next = ptr;
     ptr -> previous = newNode;
     head = newNode;
     ++count;
  }

请注意,不会检查是否要在之前或之后插入它,只需在它之前插入1即可。您需要在if内部进行额外检查以检查项目是否&lt; ptr-&GT;数据

答案 2 :(得分:1)

这应该解决它:

if((ptr -> previous) == NULL && item > (ptr -> data))
      {//the insertion point is before the head of the list if value is greater
         newNode -> previous = NULL;
         newNode -> next = ptr;
         ptr -> previous = newNode;
         head = newNode;
         ++count;
      }
else if((ptr -> previous) == NULL && item < (ptr -> data))
      {//the insertion point is after the head of the list if value is smaller
         newNode -> next = NULL;
         newNode -> previous = ptr;
         ptr -> next = newNode;
         ++count;
      }

你的“if((ptr - &gt; next)== NULL)”块中存在类似的错误。只有当数字较小时才需要插入,否则只需插入一个中间插入:

else if((ptr -> next) == NULL && item < (ptr -> data)) 
      {//end of list insertion
         newNode -> next = NULL;
         newNode -> previous = ptr;
         ptr -> next = newNode;
         tail = newNode;
         ++count;
      }

答案 3 :(得分:0)

我认为你的“插入中间不太正确......

else {//middle of the list insertion
        (ptr -> previous) -> next = newNode;
         newNode -> previous = ptr -> previous;
         newNode -> next = ptr;
         ptr -> previous = newNode;
         ++count;
      }

这会在指向元素之前插入新元素。我相信你想在它之后插入它,例如:

else {//middle of the list insertion
         newNode->next = ptr->next;
         newNode->next->previous = newNode;
         newNode->previous= ptr;
         ptr->next = newNode;
         ++count;
      }