如何定义包含指向自身的指针的typedef结构?

时间:2010-10-21 13:40:53

标签: c struct typedef

我在C中编写LinkedList,下面的代码代表我的Node定义。

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

我理解(或认为我这样做)struct Nodetypedef struct Node不同。当然,我的代码编译并按照预期运行,但是,在分配nextprev时,我会收到很多警告(警告:从不兼容的指针类型分配)。我猜这与我在Node结构中定义它们的方式有关。 我上传了完整的来源here

那么,如果这确实是问题,我应该如何在next内定义prevtypedef struct Node

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

2 个答案:

答案 0 :(得分:64)

您需要按此顺序执行此操作:

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结构的字段。

答案 1 :(得分:25)

另一种可接受的方式,对OP代码的更改最少如下:

typedef struct NodeT {
    int value;
    struct NodeT * next;
    struct NodeT * prev;
} Node;

请注意NodeT的介绍及其在nextprev中的用法,直到Node可用。