2012-03-11 64 views
0

你好我的代碼問題是在我的第二個else循環;我從不輸入它,因此我從不爲我的列表創建新的節點。誰能幫我看看我錯過了什麼?爲什麼我的插入函數不能爲列表創建新節點?

bool List::Insert(int data) 
{ 
    Node* P = new Node; 
    if(P==NULL) 
    { 
     return false; 
    } 
    else 
    { 
     P ->info = data; 
     P ->next = NULL; 
      if(Head == NULL) 
      { 
       Head = P; 
      } 
      else 
      { 
       Node* lastNode; 
       for(lastNode = Head; lastNode ->next != NULL; lastNode = lastNode ->next) 
       { 
        lastNode ->next = P; 
       } 
      } 
     return true; 
    } 
} 
+0

其他不是一個循環。我在這裏只看到一個循環。 「我的第二個循環」是什麼意思? – abelenky 2012-03-11 02:34:50

+0

@abelenky,「2nd else loop」將是「2nd else內部的循環」:-)換句話說,就像你說的那樣,唯一的循環。你可以把它看作是「2nd(else loop)」(錯誤,因爲只有一個,沒有這樣的野獸)或「(2nd else)循環」(在這種情況下是右邊的)。 – paxdiablo 2012-03-11 02:37:36

回答

3

此:

Node* lastNode; 
for(lastNode = Head; lastNode ->next != NULL; lastNode = lastNode ->next) 
{ 
    lastNode ->next = P; 
} 

是完全錯誤的。它將更改next指針,爲當前在列表中的每個單個節點指向您的新節點。你只需要改變指針在最後節點:

Node* lastNode = Head; 
while (lastNode->next != NULL) 
    lastNode = lastNode->next; 
lastNode->next = P; 

您也可以,爲提高效率,要保持一個獨立的Tail指針(除了你Head),這樣就可以簡單地更換整個操作與:

Tail->next = P; 
Tail = P; 

這樣,你不必每次都想遍歷整個列表追加一個新的節點。那麼你的代碼變得像(不穿越,並與更新尾指針以及):

// Prepare new node. 

Node *P = new Node; 
P->info = data; 
P->next = NULL; 

// If list empty, set head and tail to new node, otherwise 
// append it. 

if (Head == NULL) { 
    Head = P; 
    Tail = P; 
} else { 
    Tail->next = P; 
    Tail = P; 
} 

我會突然停止批評的事實,你Insert方法實際上插入而是追加。我近乎肛門保持性的挑剔性質不太可能讓我對你感興趣:-)

+0

太棒了!但我應該如何初始化lastNode B/C我得到一個運行時錯誤B/C其未初始化。 – Jake 2012-03-11 02:34:39

+0

Opps,抱歉@Jake,沒有從'for'循環中結束。我修改了代碼以正確初始化'lastNode'。 – paxdiablo 2012-03-11 02:36:38

+0

美麗!謝謝!!! – Jake 2012-03-11 02:37:11

1

lastNode - > next = P; //這必須後去

+0

它是後爲? – Jake 2012-03-11 02:31:53

+0

離開身體後爲身體放置這條線 – vfiskewl 2012-03-11 02:33:19

相關問題