了解链接列表教程

问题描述:

我正在阅读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++会有更好的结构,使用构造函数和自动内存处理。 –

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

@詹姆斯:只有当你想要一个更长的列表:) –

这并不是在所有

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

导体然后被设置为根,这意味着同时 循环的 地址绝不会达到吧?

如果root0然后conductor也非0,所以while()循环将肯定达到了。

你是对的,在这个例子中while循环应该被跳过,因为conductor-> next从开始就是0。

这可能是一个简单的错误,作者想要展示列表通常遍历的方式 - 而且他的代码实际上是完全正确的。我最好的猜测是,他复制&将此代码粘贴到一个(可能是他自己的)LinkedList类中,并尝试组装一个快速示例,而不进行测试或彻底思考。现在它的工作方式,while循环基本没有意义,因为它没有任何作用 - 但这可能不是作者的意图。

你的例子中的代码虽然可能描述了一些东西,但在我眼中却没有做任何有效的工作:)。由于while循环之前导体以相同的东西,并指向该对象的未来包含。所以while循环永远不会触发。之后,我们创建一个新节点,并让下一个指向它。然后,我们改为指向指挥到节点并将其设置为下一个到。这会导致内存泄漏。

next = 0标记列表的结尾,类似于以零结尾的字符串。这是一般的链接列表约定。在填充列表时,将向前移动零终止的next指针(在列表中)。所有其他节点都有一个有效的next值指向列表中的下一个节点。