我在列表中插入节点时出现问题,以便按顺序显示。这是我将节点插入列表的功能:
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
有人可以解释我的插入功能有什么问题吗?谢谢,
答案 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;
}