我們的教練已經顯示有這個進程鏈表功能的幾個例子(顯示所有項目,刪除在,插入頭部,插入爲尾..)C++鏈表遍歷
現在,我注意到這些例子他正在使用不同的遍歷方法。 在某些情況下,他會用
while(head !=0)
{
head=head->link;
}
在他使用從一個節點移動到其他節點的實例。
while(head->link !=0)
{
head=head->link;
}
這讓我感到困惑。是否有理由在某些操作上使用某個操作?
我們的教練已經顯示有這個進程鏈表功能的幾個例子(顯示所有項目,刪除在,插入頭部,插入爲尾..)C++鏈表遍歷
現在,我注意到這些例子他正在使用不同的遍歷方法。 在某些情況下,他會用
while(head !=0)
{
head=head->link;
}
在他使用從一個節點移動到其他節點的實例。
while(head->link !=0)
{
head=head->link;
}
這讓我感到困惑。是否有理由在某些操作上使用某個操作?
的第二變型將導致段錯誤如果head
最初NULL
。
除此之外,第一個變體將迭代N
次(其中N
是列表中的項目數)。第二個變體只會迭代N-1
次。
第一個變體在遍歷後會使「head」指向一個「null」值。第二個變體假定頭必須指向一個好的(非NULL)頭值,並且頭將指向一個空值爲link
的元素。因此,第二個變體對於查找列表的最後一個元素很有用,而第一個變體對於計算列表中項目的數量很有用。
在第一種情況下,他是覆蓋在名單可能是初始爲空的情況下(頭=無)。您通常會在循環內部執行任何處理,然後再執行
head = head->link
行。
在第二種情況下,想必他知道名單是不是最初是空的。在這種情況下,你通常會做任何處理的
head = head->link
線之後,雖然你可以,如果有一個理由,之前也做了一些。當然,它也有可能,這不是一個明智的決定,因爲教授也是人;-)
第二個例子其實有兩個問題。始終使用第一個。
第一個問題是如奧利查爾斯沃思說,因爲它會造成一個空指針(段錯誤)如果環路與頭部是NULL輸入。
的第二個問題是,不會在鏈表中的最後一個節點上出現循環頂部和head=head->link;
聲明之間的任何代碼。所以如果這個更新語句在循環結尾(這是通常的做法),那麼最後一個節點將被完全繞過。所以,如果你的代碼是這樣的:
while(head->link !=0)
{
dostufftoNode(head);
head=head->link;
}
然後dostufftoNode()函數將被要求除最後一個每一個節點。
while(head !=0)
{
head=head->link;
}
這將
這將遍歷一個全氮次
while(head->link !=0)
{
head=head->link;
}
這將
這將遍歷總數爲n-1次
謝謝你的迴應。現在它更有意義。 – user1290709 2012-04-03 20:27:29
如果您對回覆感到滿意,請將最佳答案標記爲答案 – 2012-04-06 04:46:56