如何"递归"定义链表节点?

Luy*_*uyw 7 c linked-list

我们今天刚刚被介绍到链表,我得到了概念,但声明困扰我,这里是代码:

struct Node 
{ 
    int data; 
    struct Node *next; 
}; 
Run Code Online (Sandbox Code Playgroud)

为什么这不是一个无限的声明循环?

编译器如何识别struct Node内部struct Node?

在对第二个问题视而不见之后,我看到它的方式如下:

  1. 创建一个struct,其中有一个整数和一个指向同一类型结构的指针.
  2. 创建第一个结构中指针指向的结构,它包含一个整数和一个指向同一类型结构的指针.
  3. 创建第二个结构中指针指向的结构,该结构是第一个结构中指针指向的结构.
  4. ...

Sto*_*ica 10

  1. 创建第一个结构中指针指向的结构,它包含一个整数和一个指向同一类型结构的指针.

这是你的推理失败的地方.创建指向某个东西的指针不会自动创建它应该指向的东西.因此,第一个对象是用指针创建的,这并不意味着指针指向有效的东西.就像我写的:

int *p;
Run Code Online (Sandbox Code Playgroud)

它没有任何意义.指针的值是不确定的.我可以初始化指针:

int *p = NULL;
Run Code Online (Sandbox Code Playgroud)

它仍然没有任何意义.但我可以给它一些东西的地址:

int i = 1;
int *p = &i;
Run Code Online (Sandbox Code Playgroud)

现在是点的东西.与节点中的指针相同.该节点只能用于保存某个节点的地址,但不一定要.这就是链表不仅仅是一个节点的声明,而且还是一组函数(操作)的原因.这些函数旨在确保列表处于有效状态.每个节点指向另一个节点或明确定义的终结点.

  • 我知道了.但是"指针的价值是不确定的".你的意思是如果我没有将它初始化为NULL,它可能指向一个随机的内存块? (2认同)
  • @Luyw - 否.该类型用于静态类型检查.你必须不断地演绎char*.你可能会想,好吧我会使用void*.但无论哪种方式,您都会失去编译器的好处,验证列表仅包含正确类型的结构.这不是很好的软件制作. (2认同)
  • @Luyw - 所有结构指针都是相同的,这是有保证的.巧合的是,这足以制作有用的数据类型.其他指针可能会有所不同.但这超出了问题的范围. (2认同)