了解链表教程

Understanding Linked Lists tutorial

本文关键字:教程 链表 了解      更新时间:2023-10-16

我正在阅读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循环永远不会到达,对吗?

如果这个例子没有演示链表的使用(即添加更多的节点,并遍历它们),我就不理解它的目的。

我对代码的分析是否正确?

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

这可能是一个简单的错误,作者想展示列表的遍历方式,而他的代码实际上是完全正确的。我最好的猜测是他抄袭了&将这段代码从一个(可能是他自己的)LinkedList类中粘贴出来,并试图在不进行测试或仔细思考的情况下组装一个快速示例。按照现在的工作方式,while循环基本上没有意义,因为它什么都不做——但这可能不是作者的意图。

这根本没有意义

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

这里conductor不能为空-检查没有意义,然后

while(conductor->next != 0) {

这里conductor等于root,所以conductor->next是空

conductor->next = new node;

此外,当程序结束时,所有创建的节点都会泄漏。这个样本没有显示任何东西。

然后将导线设置为根的地址,表示时间循环永远不会到达,对吧?

如果root是非0,那么conductor也是非0,那么肯定会达到while()循环。

您的示例中的代码虽然可能在描述一些东西,但在我看来并没有起到任何作用:)。因为在while循环之前,导体指向同一个对象,并且该对象的下一个包含0。所以while循环永远不会启动。之后,我们创建一个新节点,并让next指向它。然后,我们将导体指针指向该节点,并将其next设置为0。这将导致内存泄漏。

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

创建新的CCD_ 14&将CCD_ 15指针初始化为CCD_。

conductor = root; 

conductor指针设置为root 的地址

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

为了添加一个新节点,需要导航到链接列表的末尾,上面的while循环可以做到这一点。

可能,这个示例代码是通过从现有的链接列表代码中组装片段而快速组合在一起的。如果您知道链接列表中只有一个节点,那么这个while循环就没有必要了。可能,它是一些函数的一部分,比如原始代码中的addNodeToList(),在向列表添加新节点之前,它需要导航到列表的末尾。

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