声明中第一个"节点"的目的是什么:"typedef struct node { - - - } Node;"?

Her*_*sor 11 c

我正在研究我教授的代码示例,以便更好地了解链接数据结构.

在我们的linked-list.c示例中,教授定义了一个类型Node,如下所示:

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

小写节点有什么意义?我的印象是你可以写,例如:

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

然后使用Node作为自己的类型.它是否与以下事实有关:如果您不包含小写节点,那么当编译器评估代码时,它将无法理解"struct node*next"的含义?

duD*_*uDE 16

看看这个声明:

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

typedef struct node Node;
Run Code Online (Sandbox Code Playgroud)

这可以合并为一个语句(简化声明):

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

  • 精彩的回答. (5认同)
  • 您还可以使用:`typedef struct node Node; struct node {int data; 节点*下一个; };`.typedef命名一个不完整的类型; 后面的`struct node`完成了不完整的类型,但可以在里面使用名称`Node`. (2认同)

Dan*_*her 10

它是否与以下事实有关:如果你不包含小写,node那么当编译器在评估代码时,它将无法理解" struct node *next"的含义是什么?

是.

nodestruct node标签与结构类型.如果你给struct一个标签,你可以从标签完成的那一刻起引用那个类型,所以

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

所述struct node *next;声明了一个构件next是一个指向结构类型被定义.在到达定义结束Node之前,typedef名称不可用;.

如果省略标记,则在typedef完成之前不能以任何方式引用所定义的类型,因此在

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

该行struct node *next;声明了一个新的,不相关的,不完整的struct类型,其中node包含next指向的标记.

这是有效的,但没有任何关于struct node已知的(除非它被定义在其他地方),所以你不能使用next指针而不将其转换为指向任何地方的完整类型的指针(不是到处都是,Node foo; foo.next = malloc(12);等等仍然有效).