2012-04-03 92 views
1

我們的教練已經顯示有這個進程鏈表功能的幾個例子(顯示所有項目,刪除在,插入頭部,插入爲尾..)C++鏈表遍歷

現在,我注意到這些例子他正在使用不同的遍歷方法。 在某些情況下,他會用

while(head !=0) 
{ 
    head=head->link; 
} 

在他使用從一個節點移動到其他節點的實例。

while(head->link !=0) 
{ 
    head=head->link; 
} 

這讓我感到困惑。是否有理由在某些操作上使用某個操作?

回答

1

的第二變型將導致段錯誤如果head最初NULL

除此之外,第一個變體將迭代N次(其中N是列表中的項目數)。第二個變體只會迭代N-1次。

1

第一個變體在遍歷後會使「head」指向一個「null」值。第二個變體假定頭必須指向一個好的(非NULL)頭值,並且頭將指向一個空值爲link的元素。因此,第二個變體對於查找列表的最後一個元素很有用,而第一個變體對於計算列表中項目的數量很有用。

0

在第一種情況下,他是覆蓋在名單可能是初始爲空的情況下(頭=無)。您通常會在循環內部執行任何處理,然後再執行

head = head->link 

行。

在第二種情況下,想必他知道名單是不是最初是空的。在這種情況下,你通常會做任何處理的

head = head->link 

線之後,雖然你可以,如果有一個理由,之前也做了一些。當然,它也有可能,這不是一個明智的決定,因爲教授也是人;-)

0

第二個例子其實有兩個問題。始終使用第一個。

第一個問題是如奧利查爾斯沃思說,因爲它會造成一個空指針(段錯誤)如果環路與頭部是NULL輸入。

的第二個問題是,不會在鏈表中的最後一個節點上出現循環頂部和head=head->link;聲明之間的任何代碼。所以如果這個更新語句在循環結尾(這是通常的做法),那麼最後一個節點將被完全繞過。所以,如果你的代碼是這樣的:

while(head->link !=0) 
{ 
    dostufftoNode(head); 
    head=head->link; 
} 

然後dostufftoNode()函數將被要求除最後一個每一個節點。

0
while(head !=0) 
{ 
    head=head->link; 
} 

這將

  1. 檢查,如果頭部不爲空
  2. 組頭頭戴式>鏈接
  3. 去一個

這將遍歷一個全氮次

while(head->link !=0) 
{ 
    head=head->link; 
} 

這將

  1. 檢查,如果頭戴式>鏈接不爲空
  2. 組頭頭戴式>鏈接
  3. 去一個

這將遍歷總數爲n-1次

+0

謝謝你的迴應。現在它更有意義。 – user1290709 2012-04-03 20:27:29

+0

如果您對回覆感到滿意,請將最佳答案標記爲答案 – 2012-04-06 04:46:56