我上前学习链表.但是,我对使用struct声明链表的几种方法感到困惑.
这是一种方式,
typedef struct Nodetag {
int dataNum;
struct Nodetag* nextNode;
} NODE;
Run Code Online (Sandbox Code Playgroud)
这是另一种不使用typedef的方法
struct NODE {
int dataNum;
struct NODE* nextNode;
};
Run Code Online (Sandbox Code Playgroud)
我很好奇,当我们宣布时typedef,我知道Nodetag用来让编译器知道它是什么struct Nodetag* nextNode;.但那么,实际的标识是struct什么?Nodetag还是NODE?如果是Nodetag,何时NODE使用?
您可以选择为结构提供标记,如struct Nodetag或struct NODE.这些标记(以及union标记和枚举标记)与普通标识符位于不同的名称空间中.
该typedef版本为struct Nodetag以下内容创建了一个别名:
typedef struct Nodetag { ... } NODE;
Run Code Online (Sandbox Code Playgroud)
现在NODE是普通标识符名称空间中的类型名称,它是其同义词或别名struct Nodetag.
请注意,您还可以写:
typedef struct Nodetag NODE;
struct Nodetag
{
int dataNum;
NODE *nextNode;
};
Run Code Online (Sandbox Code Playgroud)
第一行表示"存在带有标记的结构类型,Nodetag并且NODE是此类型的别名".第二个块表示" struct Nodetag由这些项目组成",列出了NODE *其中一个成员.
请注意,这个问题标记为C,你得到了直接的C答案(这很好).但是,如果您遇到过C++,您会发现:
struct Nodetag
{
int dataNum;
Nodetag *nextNode;
};
Run Code Online (Sandbox Code Playgroud)
是有效的C++并Nodetag在普通标识符名称空间(以及Nodetag(结构)标记名称空间中的标记生成类型名称.这在C中无效.如果最终使用C++编译器编译C,可能会感到困惑但是代码.