我正在阅读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
设置为0
。然后将conductor
设置为root
的地址,这意味着永远不会达到while循环吗?
如果没有证明链接列表的使用(即添加更多节点,并遍历它们),我不明白该示例的目的。
我是否正确分析了代码?
答案 0 :(得分:1)
你是对的,在这个例子中,应该跳过while循环,因为导体 - >接下来从开始就是0。
这可能是一个简单的错误,作者希望显示列表通常遍历的方式 - 并且他的代码实际上是完全正确的。我最好的猜测是他复制&amp;将这段代码粘贴到一个(可能是他自己的)LinkedList类中,并尝试组装一个快速示例而不进行测试或彻底思考。它现在的工作方式,while循环基本上没有意义,因为它没有做任何事情 - 但这可能不是作者的意图。
答案 1 :(得分:0)
root = new node;
root->next = 0;
创建一个新的node
&amp;将next
指针初始化为0
。
conductor = root;
将conductor
指针设置为root
if(conductor != 0)
{
while(conductor->next != 0)
{
cout << conductor->x;
conductor = conductor->next;
}
}
为了添加一个新节点,需要导航到链接列表的末尾,上面的while循环就是这样做的。
这个示例代码可能是通过汇编现有链接列表代码中的部分来快速组合在一起的。
如果您知道链接列表中只有一个节点,则此while循环不是必需的。可能它是原始代码中某些函数的一部分,如addNodeToList()
,在将新节点添加到列表之前需要导航到列表的末尾。
答案 2 :(得分:0)
这根本没有意义
root = new node;
//then later
conductor = root;
if(conductor != 0) {
此处conductor
不能为空 - 检查无意义,然后
while(conductor->next != 0) {
此处conductor
等于root
,因此conductor->next
为空
conductor->next = new node;
并补充说,当程序结束时,所有创建的节点都会泄漏。此示例未展示任何内容。
答案 3 :(得分:0)
然后将导体设置为 root的地址,意思是while 循环永远不会到达吗?
如果root
不是0
,那么conductor
也是非0
,那么肯定会达到while()
循环。
答案 4 :(得分:0)
你的例子中的代码虽然可能描述了某些内容,但在我看来并没有做任何有效的事情:)。因为在while循环之前 root 和指挥指向相同的事物,并且该对象的 next 包含 0 。所以while循环永远不会激发。之后我们创建一个新节点,让 next 指向它。然后我们将导体指向节点,并将其下一步设置为 0 。这会导致内存泄漏。
答案 5 :(得分:0)
next = 0
标记列表的结尾,类似于以零结尾的字符串。这是一个一般的链接列表的约定。在填充列表时,向前移动零终止next
指针(在列表中)。所有其他节点都有一个有效的next
值,指向列表中的下一个节点。