2012-07-13 104 views
7

我讀到有關鏈接列表上的一些基本操作,我看到了兩種類型的循環遍歷被主要用於使用遍歷鏈表


struct node { 
    int data; 
    struct node *next; 
}*start=NULL,*tmp; 

第一個循環是形式的

for(tmp=start;tmp->next!=NULL;tmp=tmp->next); 

使用上述循環,現在朝在列表中的最後一個節點tmp指針指向

第二個循環是形式

tmp=start; 
while(tmp!=NULL) 
{ 
    // do something 
} 

我認爲他們兩個做同樣的工作,但我不知道。有什麼區別嗎?

+0

你錯過了'TMP = TMP->未來;'while循環 – Musa 2012-07-13 03:03:41

+2

@Musa:'//做something'覆蓋它。 – user7116 2012-07-13 03:11:18

+0

問:「for循環」習語是否相當於相應的「while循環」?答:是的。問:這個例子是否有缺陷,因爲這個特定的「for()循環」碰巧有一個bug? - 答:是的,也是:) – paulsm4 2012-07-13 04:52:53

回答

11

我想你的while循環是這樣的。

temp=start; 
while(temp!=NULL) 
{ 
    // do something 
    temp= temp->next; 
} 

在你的代碼迴路,當你走出的for循環,溫度不指向NULL。 temp指向鏈表的末尾。但在情況下,while循環,你臨時指向NULL你與你,如果退出while循環後你沒有尾巴(除非你臨時分配給任何其他臨時變量來改變程序的邏輯)你想在後面的步驟中使用它。這是唯一的區別。除了沒有太大的區別。

你可以寫一個小程序和打印結果檢查它。我建議你這樣做。

+0

如果我改變temp變量,它會改變原來的鏈表嗎? – User 2015-02-26 06:22:03

+0

只有當你的臨時變量是一個指針。 – Trent 2016-04-27 23:20:44

1

問:實際上, 「無」。沒有任何實質性差異;他們都做同樣的工作。

你可以總是使用等效的「while()」編碼「for()」循環。

+0

我想知道,如果在循環結束時,「tmp」指針指向最後一個節點在這兩種情況下? – OneMoreError 2012-07-13 02:57:52

+0

@CSSS正如你現在所定義的那樣,while循環終止的**唯一方法是'tmp == NULL'。相比之下,for循環終止的**唯一方法是'tmp-> next == NULL'。所以似乎只有for循環有可能將'tmp'指向最後一個節點。也就是說,每個for循環都有一個等價的while循環(反之亦然),所以你可以使它們的行爲相同。 – 2012-07-13 03:18:26

+0

當'tmp-> next!= NULL'爲false時,for循環退出,所以當'tmp-> next'爲NULL時,tmp指向最後一個節點時退出。當'tmp!= NULL'爲false時,while循環退出,所以當'tmp'爲NULL時退出,所以tmp沒有指向最後一個節點(它沒有指向任何東西)。請注意,for循環的主體永遠不會在tmp指向最後一個節點的情況下執行,因爲那是循環退出的時候。 – 2012-07-13 03:19:23

5

循環不相同。實際上,您的for循環有問題。考慮在輸入for循環之前start==NULL時會發生什麼情況。

for(tmp=start;tmp->next!=NULL;tmp=tmp->next); 

分配starttmp,然後解引用tmpNULL指針。我想你想要的是以下。

for(tmp=start;tmp!=NULL;tmp=tmp->next); 

這種變化使得forwhile循環一樣。

0

我用while循環,當我需要改變鏈表。對於例如

while (root->next) 
{ 
    if(0 == strcmp(root->data,root->next->data)) 
    { 
     temp = root; 
     root = root->next; 
     free(temp) 
    } 
    else 
    { 
     root = root->next; 
    } 
} 

我使用for循環時,我需要一個只讀訪問鏈接列表。