如何定义包含指向自身的指针的 typedef 结构?
Posted
技术标签:
【中文标题】如何定义包含指向自身的指针的 typedef 结构?【英文标题】:How to define a typedef struct containing pointers to itself? 【发布时间】:2011-04-28 15:10:17 【问题描述】:我正在用 C 编写一个 LinkedList,下面的代码代表我的节点定义。
typedef struct
int value;
struct Node* next;
struct Node* prev;
Node;
我理解(或认为我理解)struct Node
与 typedef struct Node
不同。授予我的代码按预期编译和运行,但是,我在分配 next
和 prev
时收到很多警告(警告:来自不兼容的指针类型的分配)。我猜这与我在 Node 结构中定义它们的方式有关。
我上传了完整的源码here
那么,如果这确实是问题所在,我应该如何在typedef struct Node
中定义next
和prev
?
我担心这可能是一个转贴,但找不到我要找的东西。谢谢。
【问题讨论】:
你的链表对我来说看起来很奇怪。当你有 prev 和 next 为什么你需要 head 和 tail 呢?在c中找到一个好的链表并从中学习。我会推荐 Apache 运行时库。我认为它有一个链表。 具有指向头部和尾部的指针使得追加和前置 O(1) 而不是 O(n)。如果您发现其他错误,请告诉我,因为这主要是为了让我的 C 技能在这些年的 Java 之后保持新鲜。 当你尝试做my_node->next = my_other_node
时会出现警告
【参考方案1】:
另一种可接受的方式,对 OP 的代码改动最少:
typedef struct NodeT
int value;
struct NodeT * next;
struct NodeT * prev;
Node;
注意NodeT
的引入及其在next
和prev
中的用法,直到Node
可用。
【讨论】:
这实际上是我最终在我的实现中所做的。 :) 根据@R.. 的评论【参考方案2】:你需要按这个顺序做:
typedef struct Node Node;
struct Node
int value;
Node *next;
Node *prev;
;
这并不完全符合您的要求,但它解决了问题,并且通常是这样做的。我认为没有更好的方法。
这种前向声明还有第二种用途,即数据隐藏。如果列表是在库中实现的,您可以在公共标头中只包含 typedef
,以及以下函数:
Node * list_new(void);
Node * list_append(Node *head, Node *new_tail);
size_t list_length(const Node *head);
这样,库的用户无法轻松访问库的内部结构,即 Node
结构的字段。
【讨论】:
是的。前向声明 (en.wikipedia.org/wiki/Forward_declaration) 正是我们所需要的。 哇哦。我想我尝试了所有组合,除了那个!谢谢!警告全部消失! :) 对,我知道前向声明并在整个 C++ 中使用它们,但以前从未出现过这种特殊情况,更不用说 typedef/structs 了 :) 实际上,在 OP 代码中的第一个struct
之后添加 Node
就可以了。
@R.. 谢谢这对我也有用。提到的两种方法之间是否有偏好?以上是关于如何定义包含指向自身的指针的 typedef 结构?的主要内容,如果未能解决你的问题,请参考以下文章
typedef struct bitree char data; struct bitree *lc,*rc; bitree,*btree;