如何定义包含指向自身的指针的 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 Nodetypedef struct Node 不同。授予我的代码按预期编译和运行,但是,我在分配 nextprev 时收到很多警告(警告:来自不兼容的指针类型的分配)。我猜这与我在 Node 结构中定义它们的方式有关。 我上传了完整的源码here

那么,如果这确实是问题所在,我应该如何在typedef struct Node 中定义nextprev

我担心这可能是一个转贴,但找不到我要找的东西。谢谢。

【问题讨论】:

你的链表对我来说看起来很奇怪。当你有 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 的引入及其在nextprev 中的用法,直到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 结构?的主要内容,如果未能解决你的问题,请参考以下文章

19-typedef

typedef struct bitree char data; struct bitree *lc,*rc; bitree,*btree;

typedef struct 后接指针

我可以将 typedef 结构与指针一起使用吗?

如何在类向量中存储/使用外部函数指针

C语言中typedef定义结构体指针的区别?