我在int main中的代码是:
node *run=NULL, *head=NULL, *temp=NULL;
for (int x = 1; x <= 10; x++)
{
temp = new node();
temp->value = x*10;
temp->next = NULL;
temp -> prev = NULL;
if (head == NULL)
{
head = temp;
}
else
{
run = head;
while (run->next != NULL)
{
run = run->next;
}
temp -> prev = run;
run->next = temp;
}
}
run = head;
cout << "ORIGINAL:" << endl;
while (run != NULL)
{
printf("%d\n", run->value);
run = run->next;
}
cout << endl << endl;
//=============== ADD AT THE END ========================
int xb = 105; //Value I want to add
run = head;
while (run -> next -> value > xb)
{
run = run -> next;
}
temp = new node();
temp -> prev = run;
temp -> value = xb;
temp -> next = NULL;
run -> next = temp;
run = head;
cout << "ADDED 105:" << endl;
while (run != NULL)
{
printf("%d\n", run->value);
run = run->next;
}
我一直试图找出在我的代码中添加新节点(105)的问题,但我所做的一切似乎都没有用。原始的工作完全正常并输出
10 20 30 40 50 60 70 80 90 100
但插入的代码只输出
10 105
而不是
10 20 30 40 50 60 70 80 90 100 105
答案 0 :(得分:1)
初始化new node
时,将其next
指针设置为NULL
:
temp = new node();
temp -> prev = run;
temp -> value = xb;
temp->next = NULL;
然后搜索现有列表以查找插入新节点的位置。然后你插入它:
run -> next = temp;
如果你正在注意,你会立即注意到temp
的{{1}}指针仍然是next
。没有采取任何措施。
因此,指向列表其余部分的指针会丢失,因为新插入的节点将始终为其NULL
指针NULL
。
答案 1 :(得分:0)
嗯,当你将一个元素插入一个链接列表时,你不应该让 temp-&gt; next = NULL ,因为你会在你插入的地方之后丢失你的节点。你你需要这个 temp-&gt; next = run-&gt; next 来插入你的节点。这是你的程序的主要问题。 另一个问题是在您修改代码后,答案不是您所期望的:
10 20 30 40 50 60 70 80 90 100 105
这是问题
while (run -> next -> value > xb)
{
run = run -> next;
}
如您所见,run-&gt; next-&gt; value&gt; xb(20> 105?)总是假的,所以你应该这样做
while (run->value < xb && run->next != NULL)
{
run = run -> next;
}
你的链接列表的初始化代码非常糟糕。如果你想在列表尾部插入一个节点,你应该记住每次最后一个节点而不是旅行列表。考虑这段代码:
node *run=NULL, *head=NULL, *temp=NULL, *last=NULL;
for (int x = 1; x <= 10; x++)
{
temp = new node();
temp->value = x*10;
temp->next = NULL;
temp -> prev = NULL;
if (head == NULL)
{
head = temp;
last = temp;
}
else
{
/*run = head;
while (run->next != NULL)
{
run = run->next;
}*/
temp->prev = last;
last->next = temp;
last = temp;
}
}
答案 2 :(得分:0)
我尊重这是否是C培训课程。如果是这样,您将获得极好的支持。 但是如果要制作生产代码,则应该使用std :: list。它可能会有性能损失,但您可以免于调试。
如果您更喜欢训练模式,我建议您添加一个结束指针,以避免在每次“for”迭代中进行冗长的重复操作。这将显着提高性能,尤其是对于大型链接列表。