2017-06-02 72 views
-1

我里面INT主要代码:将节点添加到链表(C++)的末尾?

 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

做自己的忙,并且不要分配一个新的节点,直到你的管理指针放在应该插入节点的地方。你在cutline下面设置'temp'是完全错误的,你从来没有正确地连接temp-> next。而且,你的帖子应该包括*期望的*顺序结果以及失败的结果。 *以前的结果虽然有趣,但并不真正相关。 – WhozCraig

回答

1

当你初始化new node,你的next指针设置为NULL

temp = new node(); 
temp -> prev = run; 
temp -> value = xb; 
temp->next = NULL; 

然后,您将搜索现有列表以查找插入新节点的位置。然后将其插入:

run -> next = temp; 

如果你支付任何注意,你会立刻发现tempnext指针仍然非常多,一个NULL。关于它没有做任何事情。

因此,由于新插入的节点将始终具有NULL指针,所以指向其余列表的指针会丢失。

0

嘛,你不应该让TEMP->未来= NULL当你插入一个元素到链接列表,因为你会在那里你插入into.You需要这个发生之后失去了你的节点TEMP-> next = run-> next在插入后连接你的节点。这是你程序的主要问题。 另一个问题是您修改代码之后,得到的答案是不是你预期:

10 20 30 40 50 60 70 80 90 100 105

这里的问题

while (run -> next -> value > xb) 
{ 
    run = run -> next; 
} 

正如你所看到的,运行 - >下一步 - >值> XB( 20> 105?)总是假的,所以你应该做你想插入在列表的尾部节点此

while (run->value < xb && run->next != NULL) 
{ 
    run = run -> next; 
} 

链接列表的初始化代码是相当不好。如果,你应该记住的最后一个节点EA CH时间,而不是旅行的list.Consider验证码:

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; 
     } 
    } 
0

我尊重,如果这是一个C训练。如果是的话,你已经得到了很好的支持。 但是,如果您正在制作产品代码,则应该使用std :: list。它可能会有性能损失,但您将免于调试。

如果你更喜欢训练模式,我建议你包含一个结束指针,以避免在每次'for'迭代中冗长乏味的端到端。这将显着改善性能,特别是对于大型链表。

+0

虽然恒星建议(使用标准库容器而不是自行滚动,使用终点指针策略以实现更快的端点插入),但这并没有解决OP在代码呈现时所遇到的问题。 – WhozCraig