如何对包含指向自身的指针的结构进行类型定义?

How to typedef a structure including pointers to itself?

没有 typedef 的代码(并且有效):

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

我正在尝试使用 typedef 为双向链表中的结构 "Node" 创建代码,但这不起作用:

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

有没有办法使用 typedef 解决这个问题?

在typedef内部,还不知道要定义的类型,所以需要引入并使用一个struct标签:

typedef struct Node_tag {
    int data;
    struct Node_tag *next;
    struct Node_tag *prev;
} Node;

Node_tag 是结构标记,因为它被引入的位置(而不是因为名称部分“_tag”)。它本身不是一种类型,只有 struct Node_tag 的组合是一种可用于结构成员的类型。
之后,当typedef完成时,类型Node已经被定义。
澄清一下,第二个 typedef 可能是 typedef struct Node_tag NodeToo;。这表明类型 struct Node_tag 也是可用的。这就是为什么我更喜欢使用“_tag”名称片段,以便清楚使用的内容。

您可以使用结构的前向声明

typedef struct sNode Node; // this is a typedef and a declaration of the struct
struct sNode{
    int data;
    Node *next;
    Node *prev;
};

这种方式 Node 是已知的(但未定义),在您的 struct 的定义中。

这可以像 Yunnosch 那样进行压缩。但是你需要在声明中使用 struct Name 符号。

这样,如果您的结构中有一些循环依赖项,就可以使用类型定义的名称,并且前向声明是必要的。

也可以使用结构名称作为 typedef:

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

我个人比较喜欢第一种风格,对我来说好像"clearer",但是第二个例子没什么问题,只要compiler is not from the pre-standard era (before 1989).

正如 Jens Gustedt 所指出的,如果 C++ 中包含第一种样式,则第一种样式可能不兼容。

所以也许我应该将我的偏好更改为第一个。

在结构内部,您确实必须使用编译器已知的类型。在您的情况下,符合此规则的一种方法是在声明 typedef struct Node 使用 struct Node * 类型。在这种情况下,即使编译器在结构内部遇到类型 struct Node 时定义不完整,名称是已知的,编译器也知道指针的大小(保留在内存中),所以它没有理由投诉!
此外,也可以使用与 struct 之后的类型相同的名称:您可以对两者使用 Node
这是我建议的解决方案:

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