将节点添加到链表的末尾(C ++)?

时间:2017-06-02 10:29:27

标签: c++ linked-list insert nodes

我在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

3 个答案:

答案 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”迭代中进行冗长的重复操作。这将显着提高性能,尤其是对于大型链接列表。