2011-06-20 73 views
1

我正在閱讀cprogramming.com的教程,我對他們的鏈接列表示例有點卡住了。該代碼是下面:瞭解鏈接列表教程

#include <iostream> 

using namespace std; 

struct node { 
    int x; 
    node *next; 
}; 

int main() { 
    node *root; 
    node *conductor; 

    root = new node; 
    root->next = 0; 
    (*root).x = 12; // I was testing alt. syntax. 
    conductor = root; 

    if(conductor != 0) { 
    while(conductor->next != 0) { 
     cout << conductor->x; 
     conductor = conductor->next; 
    } 
    } 

    conductor->next = new node; 
    conductor = conductor->next; 
    conductor->next = 0; 
    (*conductor).x = 42; 

    cout << conductor->x; 

    return 0; 
} 

在該示例root->next被設置爲0conductor然後被設置爲root的地址,這意味着while循環永遠不會到達正確的位置?

我不明白該示例的目的,如果它沒有演示使用鏈表(即添加更多的節點,並遍歷它們)。

我是否正確分析代碼?

+0

可能會更好地問在 ChrisWue

+0

while循環將達到,因爲導體==根和根!= 0. – weekens

+0

爲您的信息,這個例子基本上是C與流。 C++會有更好的結構,使用構造函數和自動內存處理。 –

回答

0
root = new node; 
root->next = 0; 

創建一個新的node &初始化next指針0

conductor = root; 

conductor指針的root

if(conductor != 0) 
{  
    while(conductor->next != 0) 
    {  
     cout << conductor->x;  
     conductor = conductor->next; 
    } 
} 

地址爲了添加一個需要導航到鏈接列表的末尾的新節點,而循環確實的是,以上。

也許,這個示例代碼很快通過彙編來自現有鏈接列表代碼的代碼組合在一起。 如果您知道鏈接列表中只有一個節點,則此while循環並不是必需的。可能它是原始代碼中addNodeToList()等功能的一部分,在將新節點添加到列表之前,需要導航到列表的末尾。

+0

但是不應該接下來包含另一個節點的地址? –

+0

@詹姆斯:只有當你想要一個更長的列表:) –

0

這並不是在所有

root = new node; 
//then later 
conductor = root; 
if(conductor != 0) { 

這裏conductor意義不能爲空 - 檢查是沒有意義的,那麼

while(conductor->next != 0) { 

這裏conductor等於root,所以conductor->next爲空

conductor->next = new node; 

此外,所有創建程序結束時,d節點只會泄漏。此示例沒有顯示任何內容。

+0

這裏是例子http://www.cprogramming.com/tutorial/lesson15.html ...我覺得我浪費了我的時間與那一個。你知道一個創建鏈表的好例子嗎? –

+0

這裏有一些描述性文字:http://cplus.about.com/od/learningc/ss/pointers2.htm – inquam

+0

@James Perno:查找使用單獨函數進行單獨操作的代碼。它可以是「創建空列表」,「在開始時添加節點」,「在此節點之後刪除」等等。通過這些操作,可以清楚地瞭解前後條件是什麼,這會讓您更好地理解。 – sharptooth

0

導體然後被設置爲根,這意味着同時 循環的 地址絕不會達到吧?

如果root0然後conductor也非0,所以while()循環將肯定達到了。

1

你是對的,在這個例子中while循環應該被跳過,因爲conductor-> next從開始就是0。

這可能是一個簡單的錯誤,作者想要展示列表通常遍歷的方式 - 而且他的代碼實際上是完全正確的。我最好的猜測是,他複製&將此代碼粘貼到一個(可能是他自己的)LinkedList類中,並嘗試組裝一個快速示例,而不進行測試或徹底思考。現在它的工作方式,while循環基本沒有意義,因爲它沒有任何作用 - 但這可能不是作者的意圖。

0

你的例子中的代碼雖然可能描述了一些東西,但在我眼中卻沒有做任何有效的工作:)。由於while循環之前導體以相同的東西,並指向該對象的未來包含。所以while循環永遠不會觸發。之後,我們創建一個新節點,並讓下一個指向它。然後,我們改爲指向指揮到節點並將其設置爲下一個到。這會導致內存泄漏。

0

next = 0標記列表的結尾,類似於以零結尾的字符串。這是一般的鏈接列表約定。在填充列表時,將向前移動零終止的next指針(在列表中)。所有其他節點都有一個有效的next值指向列表中的下一個節點。