1

構造体を作成し、C で同じ型の構造体の配列を作成する方法はありますか?

例えば

typedef struct Vertex{
    char letter;
    Vertex edges[];
}Vertex; 

同じ構造内に構造の配列が必要です。これはCで何らかの方法で可能ですか?

4

4 に答える 4

3

次のようなことができます。

typedef struct _Vertex {
    char letter;
    struct _Vertex* pEdges;
} Vertex; 

Vertix v;
v.pEdges = (Vertex*)malloc(sizeof(Vertex) * n);
v.pEdges[0].letter = '0';

各配列にいくつのアイテムがあったかを知る/追跡する方法が必要です。

于 2012-11-17T01:55:53.553 に答える
1

ジョナサンウッドとウアが言ったようにやってください。Cでは、配列(実際には構造体自体)を構造体に入れることはできません。ただし、構造体へのポインタは非常にうまく機能します。たとえば、Cによるリストを実現する場合、次の構造体を使用することがよくあります。

struct listname{
    void *value;
    struct listname *next;
}

次に、配列を配置するために、構造体の配列を指すポインターをその中に配置します。

于 2012-11-17T06:10:31.527 に答える
1

別の答えへのコメントに基づいて、あなたが本当に探しているものを知っていると仮定しましょう:特定の頂点のエッジとして制限された数の頂点構造を参照する方法、およびこれはすべての頂点レコードに対して複製する必要がありますあなたの有限集合で。

それが頂点構造の線形リストであるとします。realloc()特定のサイズの割り当てられた配列 (またはアルゴリズムを介して継続的に拡張):

-----------------------------------------
| Vertex[0] | Vertex[1] | Vertex[2] ... |
-----------------------------------------

上記のそれぞれの末尾で、それを調整する何らかの方法が必要であるとします。

Vertex    Edges
------    -------
[0]       [1],[2]
[1]       [0],[2]
[2]       [0],[1]

単純な三角形を使用して申し訳ありませんが、これは私が思いついた最も簡単な例でした。とにかく進みます。これが探しているモデルである場合、次のように頂点構造を定義できます。

typedef struct Vertex
{
    char value;     // node 'value'
    int n;          // number of edge indices.
    int *edges;     // dynamic edge index list. [0..(n-1)]
} Vertex;

上記の例を定義すると、次のようになります。

  1. グローバル リスト内のどの Vertex エントリが現在のエントリのエッジであるかを判断します。
  2. これらのエッジ「ID」のスロットを保持する動的インデックス リストを割り当てます。
  3. 各エッジ頂点インデックスをインデックス リストに割り当てます。

単純な (非常に) 例が保証されます。

Vertex vtx[3];

// wire vtx[1] and vtx[2] as edges of vtx[0].
vtx[0].value = 'a';
vtx[0].n = 2;
vtx[0].edges = malloc(2 * sizeof(int));
vtx[0].edges[0] = 1;
vtx[0].edges[1] = 2;


// wire vtx[0] and vtx[2] as edges of vtx[1].
vtx[1].value = 'b';
vtx[1].n = 2;
vtx[1].edges = malloc(2 * sizeof(int));
vtx[1].edges[0] = 0;
vtx[1].edges[1] = 2;


// wire vtx[0] and vtx[1] as edges of vtx[2].
vtx[2].value = 'c';
vtx[2].n = 2;
vtx[2].edges = malloc(2 * sizeof(int));
vtx[2].edges[0] = 0;
vtx[2].edges[1] = 1;

vtx[0] があるとします。どうやって彼の最初のエッジに到達しますか?

Vertex *edge = vtx[ vtx[0].edges[0] ];

そこから、そのエッジの最初のエッジに移動できます

edge = vtx[ edge->edges[0] ];

など。百聞は一見に如かず。

-------------------------------------
| Vertex[0] | Vertex[1] | Vertex[2] |
| value = a | value = b | value = c |
| count = 2 | count = 2 | count = 2 |
|-----------|-----------|-----------|
|edges[0]=1 |edges[0]=0 |edges[0]=0 |
|edges[1]=2 |edges[1]=2 |edges[1]=1 |
-------------------------------------

free()クリーンアップでは、グローバル リストの各頂点にインデックス リスト ポインターが必要です。グローバル リスト自体が動的に割り当てられている場合は、free()それも同様です。上記のサンプルでは、​​そうではありません。

少なくとも、malloc-nutz に移動してデータをあちこちにコピーすることなく、これを行う方法についてのアイデアが得られることを願っています。要約すると、この例では、頂点ノード リストを利用して、頂点ノードのコピーをまったく作成することなく、本当に必要な情報 (エッジ) を維持できます。

于 2012-11-17T02:35:48.923 に答える
0
typedef struct Vertex{
   char letter;
   struct Vertex *edges;
   int n;
}Vertex; 

また

typedef struct Vertex Vertex;
struct Vertex{
   char letter;
   Vertex *edges;
   int n;
};

例えば:

Vertex bla;
const int n = 42;
bla.n = n;
bla.edges = malloc(n * sizeof (*bla.edges));  
于 2012-11-17T01:49:28.430 に答える