2017-06-02 77 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