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;

エラーはありませんが、プログラムは正しく実行されません。

編集: コードをさらに追加しました。

FINAL: 無限再帰を作成したのは私のミスでした。この脅威の削除に進みます。お時間をいただき申し訳ありません。

4

2 に答える 2

3

これは、構造体へのポインターの配列を格納しているためです。それはかなり違います。

内部に同じ構造体を持つことはできません。それは無限に再帰的な定義になります。

さて、あなたのプログラムをもっと見せていただければ、あなたのプログラムが期待通りに動かない理由を理解するのに役立つかもしれません. ポインターが正確に何であるかについて混乱しているため、ポインターを初期化していない可能性があります。

[編集]いくつかのコードを投稿したので、何が問題なのかを正確に述べていないことを無視して、グラフを調べながらポインターリスト全体を反復しようとしていると思いますが、それを初期化していません.

するとmalloc、メモリは初期化されません。C での標準的な方法は、callocすべてのバイトをゼロに設定する代わりに使用することです。nodes配列をリストとして使用しているように見えるのでnum_edges、ノードにフィールドを追加し、2 つのノードで双方向の結合を行う関数を作成することができます。

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 に答える