我如何拥有包含其自身类型的结构。
struct node { struct node *nodes[MAX]; int ID; };
struct node *node1, *node2;
node1 = (struct node*) malloc(sizeof(struct node));
node2 = (struct node*) malloc(sizeof(struct node));
node1->ID = 1;
node2->ID = 2;
node1->nodes[0] = node2;
node2->nodes[0] = node1;
没有错误,但程序无法正确执行。
编辑:我添加了更多代码。
FINAL:我创造了一个无限递归,这是一个错误。我将继续删除此威胁。抱歉你花了很长时间。
答案 0 :(得分:3)
那是因为你将一个指针数组存储到结构中。那是完全不同的。
你自己内部不能有相同的结构。这将是一个无限递归的定义。
现在,如果你要展示更多的程序,我们可以帮助你理解为什么你的程序没有按照你期望的方式运行。你可能没有初步确定指针,因为它们究竟是什么混淆。
[edit] 既然您已经发布了一些代码,并且忽略了您没有确切地说出了什么问题,我希望您在检查时尝试迭代整个指针列表你的图表,但你从未初步化它。
当你malloc
时,内存将被取消初始化。 C中的标准做法是使用calloc
代替将所有字节设置为零。由于您似乎使用nodes
数组作为列表,因此您可能希望向节点添加num_edges
字段并创建一个函数以在两个节点上执行双向连接。
struct node {
int num_edges;
struct node *nodes[MAX];
};
int join( struct node *a, struct node *b )
{
if( a->num_edges >= MAX || b->num_edges >= MAX ) return 0;
a->nodes[a->num_edges++] = b;
b->nodes[b->num_edges++] = a;
return 1;
}
您还可以测试是否存在从a
到b
的边缘:
int has_edge( struct node *a, struct node *b )
{
int i;
for( i = 0; i < a->num_edges; i++ ) {
if( a->nodes[i] == b ) return 1;
}
return 0;
}
答案 1 :(得分:1)
您的代码完全有效 - 将指针指向结构内的同一个结构即可。