C 中的递归类型定义

recursive type definitions in C

我正在尝试用 C 实现链表。我尝试了以下实现:

// Attempt 1
typedef struct
{
  Node *next;
  Node *prev;
} Node;

// Attempt 2
typedef struct
{
  struct Node *next;
  struct Node *prev;
} Node;

第一个版本给我的错误是:unknown type name 'Node'

第二次编译但给出警告:assignment to 'struct Node *' from incompatible pointer type 'Node *' {aka 'struct <anonymous> *'}当我这样使用它时

void link(Node * node) {
  node->next = (Node) {node, NULL}
}

在 typedef 声明中未命名结构的声明中

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

用作数据成员 nextprev 的类型说明符的名称 Node 未声明。所以编译器报错。

在 typedef 声明中未命名结构的声明中

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

引入了类型说明符 struct Node 和未命名结构的 typedef 名称 Node。它们是不同的类型说明符。也就是说 Nodestruct Node 不是相同的说明符。

您需要的是以下内容

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

现在 Node 是类型说明符 struct Node 的别名。

注意这个函数定义

void link(Node * node) {
  node->next = (Node) {node, NULL}
}

没有意义,编译器将再次发出错误。赋值语句的左操作数(你忘记放分号的地方)

  node->next = (Node) {node, NULL};

具有 Node *struct Node * 类型(如果您将更新 typedef 声明,如上所示),而右操作数是 struct Node 类型的复合文字。而且复合字面量自动保存,退出函数后不会存活

所以如果你愿意写

  node->next = &(Node) {node, NULL};

指针node->next退出函数后将失效