结构标签与花括号后面的内容有什么区别?

And*_*ani 0 c struct typedef

有人可以为我解释这段代码吗?

typedef char AirportCode[4];

typedef struct NodeTag{
  AirportCode Airport;
  struct NodeTag *link;
}Node;

Node *L;
Run Code Online (Sandbox Code Playgroud)

这是我的数据结构类的代码片段.实现这段代码是为了在链表节点中保存数据.我想要了解的是NodeTag通常用于什么?是否希望结构在其内部保持另一个迭代,因为缺少更好的单词?NodeTag与大括号之后的内容有什么区别,在本例中为"Node"?

Ric*_*ner 5

你在这里把两件事合二为一:

(1)结构声明:

struct NodeTag{
  AirportCode Airport;
  struct NodeTag *link;
};
Run Code Online (Sandbox Code Playgroud)

这需要你像这样声明你的节点:

struct NodeTag *nt; 
Run Code Online (Sandbox Code Playgroud)

结构定义的结束大括号之后的任何内容都将声明该类型的变量.

struct foo {int n;} a_global_variable;
Run Code Online (Sandbox Code Playgroud)

用(2)a typedef:

typedef ... Node;
Run Code Online (Sandbox Code Playgroud)

这让你简单地说:

Node *n; 
Run Code Online (Sandbox Code Playgroud)

但是,在struct声明中,由于typedef尚不存在,你仍然必须说struct NodeTag *nt而不是 Node *n

  • 注意,在这种情况下需要**一些**结构标记(这里是`NodeTag`),因为结构定义是递归的.但是,对结构标记和类型别名使用相同的标识符是合法且非常常见的,例如`typedef struct Node {...} Node;`. (4认同)