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

Ken*_*son 34 c struct typedef

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

typedef struct {
    int value;
    struct Node* next;
    struct Node* prev;
} Node;
Run Code Online (Sandbox Code Playgroud)

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

所以,如果这确实是问题,我应该如何定义nextprev内部typedef struct Node

我担心这可能是一个转贴,但无法找到我想要的东西.谢谢.

unw*_*ind 66

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

typedef struct Node Node;

struct Node
{
  int value;
  Node *next;
  Node *prev;
};
Run Code Online (Sandbox Code Playgroud)

这并不完全符合您的要求,但它解决了问题,并且通常是如何完成的.我不认为有更好的方法.

这种前向声明在数据隐藏方面具有第二种用法.如果列表是在库中实现的,那么您可以只typedef使用公共头文件以及以下函数:

Node * list_new(void);
Node * list_append(Node *head, Node *new_tail);
size_t list_length(const Node *head);
Run Code Online (Sandbox Code Playgroud)

这样,库的用户就无法轻松访问库的内部,即Node结构的字段.

  • 实际上,只需在OP代码中的第一个`struct`之后添加`Node`就可以了. (7认同)
  • 是.前瞻性声明(http://en.wikipedia.org/wiki/Forward_declaration)正是所需要的. (2认同)

Aru*_*run 26

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

typedef struct NodeT {
    int value;
    struct NodeT * next;
    struct NodeT * prev;
} Node;
Run Code Online (Sandbox Code Playgroud)

请注意引入NodeT及其在next以及prev之前的用法Node.