什么是C中的自引用结构?

时间:2016-08-25 17:13:17

标签: c linked-list structure

<snake> </snake>

在代码中,struct LinkedList { int data; struct LinkedList *next; }; 的定义中有一个指向结构本身的指针。

它是如何运作的?

3 个答案:

答案 0 :(得分:6)

所以,代码

struct LinkedList  
{  
    int data;
    struct LinkedList *next;
};

定义一个包含两个名为datanext的成员的结构类型,next成员存储相同类型的不同对象的地址。鉴于代码:

struct LinkedList Node1 = { .data = 1, .next = NULL };
struct LinkedList Node0 = { .data = 0, .next = &Node1 };

你得到的东西看起来像这样:

Node0              Node1
+---+--------+    +---+------+
| 0 | &Node1 |--->| 1 | NULL |
+---+--------+    +---+------+

(请注意,您将从不以这种方式创建链接列表,这仅用于说明)。

这可能有两个原因:

  1. C允许您声明指向不完整类型的指针;
  2. 指向struct类型的指针都具有相同的大小和表示形式。
  3. 这是一个自引用数据类型的示例,它只是意味着该类型将引用(指针)存储到相同类型的不同对象。

答案 1 :(得分:4)

你所谈论的是递归数据结构,问题是如何让数据结构引用自己。

在C中,这可以通过在数据结构的定义中声明指向自身的指针来完成,“self”意味着它自己的类型。

请注意,在编写表达式时,数据结构尚未完成。因此,不可能让数据结构包含其自身的出现,因为该定义尚未完全知道,因为数据结构将永远不会包含其自身的出现本身,...

但是你可以声明一个指向它自己的指针。编译器现在只为指针分配存储空间,如果稍后分配/取消引用指针,它知道指向的存储包含自身的出现。这就是你在你的例子中所做的。

答案 2 :(得分:2)

一个自引用指针,指向它所属的任何地址。例如,

typedef struct node {     
   char data[30]; 
   struct node *this; 
   struct node *next; 
} Node; 

*如果将指针分配给应用于的任何内容,则这是一个自引用指针。

  

显然,Cell不能包含另一个单元格,因为它变成永无止境的递归。

但是,Cell CAN包含指向另一个单元格的指针。

同时参考this post