0

我怎样才能拥有包含自身类型的结构。

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;

没有错误,但程序无法正确执行。

编辑:我添加了更多我的代码。

最终:创建无限递归是我的错误。我将继续删除此威胁。很抱歉您花费了这么多时间。

4

2 回答 2

3

那是因为您正在存储一个指向该结构的指针数组。那是完全不同的。

您不能在其内部拥有相同的结构。那将是一个无限递归的定义。

现在,如果您想展示更多您的程序,我们或许可以帮助您了解为什么您的程序没有按您预期的方式运行。您可能没有初始化指针,因为对它们到底是什么感到困惑。

[编辑]现在您已经发布了一些代码,并且忽略了您没有确切说明出了什么问题,我希望您在检查图形时尝试遍历整个指针列表,但您从未初始化它。

当你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;
}
于 2013-02-12T02:39:23.397 回答
1

您的代码是完全有效的 - 在结构中具有指向相同结构的指针是可以的。

于 2013-02-12T02:40:31.807 回答