如何“递归”定义链表节点?

时间:2019-02-06 12:54:45

标签: c linked-list

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

struct Node 
{ 
    int data; 
    struct Node *next; 
}; 

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

编译器如何识别struct Node中的struct Node?

对第二个问题视而不见后,我的观察方式如下:

  1. 创建一个结构,里面有一个整数和一个指向结构的指针 相同类型的
  2. 创建第一个结构中的指针所指向的结构,它包含一个整数和一个指向相同类型结构的指针。
  3. 在第二个结构中创建指针所指向的结构,这是第一个结构中的指针所指向的结构。
  4. ...

2 个答案:

答案 0 :(得分:10)

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

这是您无法进行推理的地方。创建指向某物的指针不会自动创建它应该指向的物。因此,第一个对象是在其中创建一个指针的事实,并不意味着该指针将指向有效的对象。就像我写:

int *p;

它没有指向任何东西。 pointer 的值不确定。我可以初始化指针:

int *p = NULL;

它仍然没有指向任何东西。但是我可以给它一些地址:

int i = 1;
int *p = &i;

现在现在指向某物。节点中的指针也是如此。只能使该节点保留某个节点的地址,但不必这样做。这就是为什么链表不仅是节点的声明,而且是一组功能(操作)的原因。这些功能旨在确保列表处于有效状态。每个节点都指向另一个节点,或者指向一个定义良好的终止符。

答案 1 :(得分:1)

  

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

首先确定指针指针,它指向intchar,{{1} }或double本质上是某些内容开始的内存地址,其大小由体系结构确定。这就是为什么您可以在刚创建的struct中声明指针的原因。如果运行此代码:

struct

这会给您带来错误,因为struct node { int val; struct node next; // NOTE: I omitted * so it is not pointer it is struct }; 未知,因此其大小也是未知的。所以相比:

struct node

指针类型是已知的,此处未知的是指针所指向的类型。指针的大小也是已知的,因此您不会递归。

指向指针。在C中:

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

是完全合法的,并且程序员应对此进行跟踪。因此,底行int a = 5; int *p = &a; char *c = p; 是指向下一个节点(的地址)的指针。这就是为什么您没有struct node *next发生的原因。

  

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

不是!!!这就是为什么我的第一个示例不起作用!!它识别指针类型。您基本上可以这样写:

recursion

与您的计算机相同:

struct node {
    int val;
    void *next;
};

希望这对您有所帮助。