C中的自引用结构

时间:2012-10-02 05:10:31

标签: c pointers data-structures linked-list

我想声明一个自引用结构,如下所示

    typedef struct
    {
            entry_t *entry;
            node_t *next;
    }node_t;
对于链表

而不是如下所示

  struct node
  {
         entry_t *entry;
         struct node *next;
  }*head;

这在C中有用吗?如果没有,为什么不呢?

2 个答案:

答案 0 :(得分:6)

它无效,因为node_t声明中的符号/名称next未知:

typedef struct
{
    entry_t *entry;
    node_t *next; /* <-- Error: unknown type */
} node_t;

您的结构在其声明中需要一个名称才能成为“自我引用”。但是,您可以保留typedef:

typedef struct node
{
    entry_t *entry;
    struct node *next; /* <-- type struct node is known */
} node_t;

现在,您可以使用struct nodenode_t来创建新节点。

答案 1 :(得分:4)

您第二次提到的版本被广泛使用,您可以制作类型的

typedef struct some_struct_name {
    /* other fields, etc... */
    struct some_struct_name *next;
} *some_type;

如果您真的,非常希望尽早声明结构本身的类型名称,您可以使用不完整类型的前向声明:

typedef struct node *node_t;

struct node {
    int data;
    node_t next;
};

C89也接受了这一点:

enter image description here