Q我似乎无法成功定义一个链表。我试过
typedef struct { char *item; NODEPTR next; } *NODEPTR;但编译器给出了错误消息。C 中的结构不能包含指向自身的指针吗?
AC 中的结构体确实可以包含指向自身的指针;K&R 第 6.5 节的讨论和示例对此说得很清楚。
这个例子中的问题在于 typedef。typedef 为类型定义了一个新名称,在更简单的情况下 [脚注],你可以同时定义一个新的结构体类型和它的 typedef,但在这种情况下不行。typedef 声明在定义之前是不能使用的,而在上面的片段中,它在声明next字段时还没有定义。
要修复这段代码,首先给结构体一个标签(例如,“struct node”)。然后,将字段声明为简单的nextstruct node *,或者将 typedef 声明与结构体定义分开,或者两者都做。一个修正后的版本是你也可以在 struct 声明前加上 typedef,在这种情况下,你就可以在声明
typedef struct node { char *item; struct node *next; } *NODEPTR;NODEPTR类型时使用这个 typedef,因为此时字段已经声明完毕next,毕竟
typedef struct node *NODEPTR; struct node { char *item; NODEPTR next; };(在这种情况下,你声明了一个包含struct node的新 typedef 名称,尽管struct node尚未完全定义;这是允许的。[脚注])
最后,这是一个结合了两个建议的重排版本
struct node { char *item; struct node *next; }; typedef struct node *NODEPTR;
(选择哪种方法是风格问题;参见第 17 节。)
参考文献:K&R1 第 6.5 节 p. 101
K&R2 第 6.5 节 p. 139
ISO 第 6.5.2 节、第 6.5.2.3 节
H&S 第 5.6.1 节 pp. 132-3