Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 结构X中的结构X?_C_Recursion_Struct - Fatal编程技术网

C 结构X中的结构X?

C 结构X中的结构X?,c,recursion,struct,C,Recursion,Struct,这可能真的很简单,但如何才能使结构x位于C中的结构x中呢?例如: typedef struct _Node { Node node; } Node; 我做了一些研究并尝试使用指针,如下所示: typedef struct _Node { struct Node *node; } Node; 虽然这将变量节点作为指针保留(我不希望这样),但我只希望它是节点结构的一个实例。谢谢你的帮助。:) 编辑: 基本上我想做的是: Node current = createNode(...)

这可能真的很简单,但如何才能使结构x位于C中的结构x中呢?例如:

typedef struct _Node {
    Node node;
} Node;
我做了一些研究并尝试使用指针,如下所示:

typedef struct _Node {
    struct Node *node;
} Node;
虽然这将变量节点作为指针保留(我不希望这样),但我只希望它是节点结构的一个实例。谢谢你的帮助。:)

编辑:

基本上我想做的是:

Node current = createNode(...);
while (true) {
    Node node = createNode(..., &current);
    addToList(node);
    current = somethingElse();
}
正如您可能想象的那样,我想要一个常规节点进入createNode()函数:

Node createNode(..., Node node) {}
这将导致“无限递归”。换句话说,它的规模将是无限的。编译器无法回答这个问题:分配多少内存?因此,它将抛出一条诊断消息

这就是为什么必须使用指针来创建自引用类型

typedef struct node {
    struct node *node;
} node_s;

顺便说一下,以下划线开头,后跟下划线或大写字母的标识符将保留给实现。

这是不可能的。因为它属于不完全类型。没有
struct节点
内部
struct节点
内部
struct节点
…等等。。。。这使得你原来的结构不完整。因此,类型定义不完整

原因是,

  • 为了使字段位于结构内部,它必须是已知类型
  • 但是当我们看到
    struct Node
    内部
    struct Node{}
    时,它还没有确定
  • 只有在扫描
    struct Node{}
    的所有定义后才能确定,但这只有在知道
    struct Node
    的类型后才可能,这会导致
    悖论
  • 但是如果包含
    struct Node*
    ,情况就不同了

  • 当您到达结构节点*时,您知道它是指针类型。无论指针的类型是什么,都需要固定的存储量
  • 因此,它成功地扫描了它并完成了
    struct Node{}
    的定义。因此它是一个完整的类型

  • 你不能那样做。要理解递归,您必须首先理解递归。@d那么什么是理想的解决方法?使用指针,就像您在研究中发现的那样,如果
    Node
    类型的变量包含一个名为
    Node
    Node
    类型的成员,然后,该成员还包含一个名为
    Node
    Node
    类型的成员。。。这将是一个无限的链条。因为里面没有其他的东西,你不能用这个变量做任何事情,只能沿着无限链走到任何地方。
    typedef struct node {
        struct node *node;
    } node_s;