我对这个结构有一个问题,很想得到明确的解释。
typedef struct exp{
int x;
struct exp *parent;
struct exp **children;
}
父母和孩子是什么意思? “parent”是这个结构的数组? 孩子们的意思是什么?它是一个数组数组?! 我真的无法理解..
最后一件事,如果我正在添加一个元素,它会成为某个父母的特定孩子,我怎样才能到达父母的所有孩子?不应该是一个结构“列表”(使用下一个等...?)?
谢谢!!答案 0 :(得分:4)
此图显示了可能的情况:
使用此代码和DDD
获取#include <stdio.h>
#include <stdlib.h>
struct exp{
int x;
struct exp *parent;
struct exp **children;
};
int main ()
{
struct exp *x = calloc(1, sizeof(x[0]));
x->x = 42;
x->parent = calloc(1, sizeof(x[0]));
x->children = calloc(5, sizeof(x->children[0]));
x->children[0] = calloc(1, sizeof(x[0]));
x->children[2] = calloc(1, sizeof(x[0]));
x->children[3] = calloc(1, sizeof(x[0]));
x->children[4] = calloc(1, sizeof(x[0]));
return 0;
}
基本上,children
字段是指向struct exp
的指针的向量。你决定放在那里的元素和其他东西。
PS:代码只是一个演示,它的质量还不是很好。
答案 1 :(得分:3)
它是一个指向指针的指针,在这种情况下,它似乎被用作struct exp
的列表。
每个struct exp
都有一个引用它的“父”,以及一个指向子列表struct exp
的指针。
typedef struct exp{
int x;
struct exp *parent;
struct exp **children;
} element;
// create ROOT elemnt
element * root = (element*) malloc(sizeof(element)); //alocate mem. for 1 element
一旦我们有了“root”,我们就可以添加子代,以下是伪代码
for 1 to 10{
child = new element;
child->parent = root; // tell the child who is his parent
addToRoot( root , child); // call a function that inserts elemnts to root
}
所以现在我们应该root
包含10个元素的列表:
_______________ _______________
| | (children) | | - (parent) points to struct exp, root
| root | - points to list of struct exp -> | child 0 |
| | | | - (children) points to null; // if it's empty
_______________ _______________
_______________
| | - (parent) points to struct exp, root
| child 1 |
| | - (children) points to null; // if it's empty
_______________
_______________
| | - (parent) points to struct exp, root
| child 2 |
| | - (children) points to null; // if it's empty
_______________
_______________
| | - (parent) points to struct exp, root
| child 3 |
| | - (children) points to null; // if it's empty
_______________
.
.
.
_______________
| | - (parent) points to struct exp, root
| child 9 |
| | - (children) points to null; // if it's empty
_______________
类似的东西......它有帮助吗?
答案 2 :(得分:1)
这是一个指向子节点的指针数组 - 这看起来像某种树结构。
每个节点都有一个父节点,每个节点都有一个或多个子节点。您可以通过
从父母到其中一个孩子旅行expInstance->children[i];
其中i是表示其中一个子节点的数字。目前还不清楚这个定义有多少个子节点 - 它可能是一个,两个,或一百万个。但鉴于这些信息,你可以循环使用它们。与
一起for(i=0; i<NUMBER_OF_CHILDREN_NODES;i++){
expInstance->children[i];
}
如果您事先知道数组的长度或有点奇怪
while(expInstance.children[i++]){
expInstance->children[i];
}
(有几种不同的聪明方法可以做到这一点,但必须在结构中内置假设,在此数组的最后一个插槽中将有一个空指针,以便终止它。)
答案 3 :(得分:0)
如果没有看到更多代码,很难说。你想要实现一棵树吗?从这个定义来看,这对我来说是显而易见的:
答案 4 :(得分:0)
首先,请记住结构不能包含自身的实例。 IOW,你不能做像
这样的事情struct exp {
int x;
struct exp parent;
...
};
这样做的主要原因是,在您尝试声明parent
成员时,结构类型不是完整;由于尚未完成对类型的描述,编译器不知道parent
成员应该有多大。更不用说parent
成员本身会有parent
struct exp
成员parent
,而成员struct exp
类型为parent
成员{反过来会有struct exp
struct exp
类型的struct exp
成员等等,等等。你最终会得到一个需要无限量存储的对象。
所以你不能拥有struct foo *pf
类型的成员。但是,可以对struct bar *pb
类型的对象有指针;您可以创建指向不完整类型的指针,并且所有结构指针类型具有相同的大小和表示(IOW,struct foo
和struct bar
将具有相同的大小,即使{{ 1}}和parent
没有)。
所以struct exp
成员(可能)只是指向struct exp
类型的单个实例(children
的每个实例都有一个父实例)。同样地,struct exp
成员(可能)是指向atruct exp
的单维指针数组({{1}}的每个实例可以有零个,一个或多个子项)。