struct内部结构类型相同?

时间:2013-02-12 02:37:44

标签: c struct

我如何拥有包含其自身类型的结构。

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:我创造了一个无限递归,这是一个错误。我将继续删除此威胁。抱歉你花了很长时间。

2 个答案:

答案 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;
}

您还可以测试是否存在从ab的边缘:

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)

您的代码完全有效 - 将指针指向结构内的同一个结构即可。