2017-03-22 3 views
0

私はCでグラフを学習しようとしていますが、現時点では、与えられたデータ構造でグラフを初期化する関数を記述しようとしています。 ので、私が持っている構造は、以下のとおりです。Cでグラフを初期化するときにメモリを割り当てる方法は?

typedef struct linked list{ 
int index; 
struct linked list *next; 
} List; 

typedef struct { 
char *name; 
List *outlist; 
int outdegree; 
} Node; 

typedef struct { 
int maxSize; 
Node *table; 
} Graph; 

と私は3つの機能があります。私は現在、最初の関数に苦しんだ

int initialise_graph(Graph *mygraph, int maxSize) 
{ 
} 

int insert_graph_node(Graph *mygraph, int n, char *name) 
{ 
} 

int insert_graph_link(Graph *mygraph, int source, int target) 
{ 
} 

を。 私は最初の関数で各データ構造体にメモリを割り当てる必要があることを知っていますが、forループを通して各構造体のメモリをmallocする方法はわかりません。もし誰かがそれを私に助けてくれたら、私はそれを感謝します。

+1

_I'mは現在..._最初の関数に苦労します。 –

+1

Cのシンボル名( 'struct linked list')にはスペースを入れることができません。他のほとんどのプログラミング言語ではそうではありません。 – unwind

+0

int initialise_graph(Graph * mygraph、int maxSize)の最初の関数を書き込もうとしています。 –

答えて

0

私は現在、最初の機能に苦しんでいます。私は私が最初の関数内の各データ構造にメモリを割り当てるために持っていることを知っているが、私はあなたのグラフオブジェクトがmaxSizeメンバーを持っているので、ループ

ためを通じて、各構造体のメモリををmallocする方法がわからないと、 NodeNodeへの単一のポインタにはリンクがありませんが、明らかにあなたはノードの配列を割り当てて初期化します。

最初に空のグラフ内の未使用のノードすべてに分かりやすい値が必要です。私はNULL(まだ指定されていません)、NULLoutlist(つまり空です)、0outdegreeです。

私はスペースを割り当て、そのスペースのすべてのバイトをゼロにするノードに対してcallocを呼び出すことでこれを行います。

int initialise_graph(Graph *mygraph, int maxSize) 
{ 
    mygraph->maxSize = maxSize; 
    mygraph->table = calloc(maxSize, sizeof *table); 
    return 0; 
} 

これで完了です。しかし

:あなたはtableが非nullであることを確認するには、いくつかのコードを配置したい場合があります

  • 。これについての意見は異なりますが、通常、私はプラットフォームのメモリ保護を利用してそれを拾いますが、あなたが組み込みの世界にいる場合、動作しない可能性があります。
  • NULLポインターは、すべて0バイトのパターンで表す必要はないので、上記のコードは厳密にはポータブルではありません。それが問題であれば、ループを使ってノードを初期化してください。 (NULLチェックをもう一度省略する)。私たちは間違って何を伝えることのために、それ以外の場合は難しい、あなたがして苦労しているコードを表示:

    mygraph->table = calloc(maxSize, sizeof *table); 
    // Null check would go here 
    for (i = 0 ; i < maxSize ; ++i) 
    { 
        table[i].name = NULL; 
        table[i].outlist = NULL; 
        table[i].outdegree = 0; 
    } 
    
+0

thatsは完璧な答えです、ありがとう!他の2つの挿入方法についても同じ戦略を実行する必要がありますか? –

+0

いいえ、insert_graph_nodeの場合は、表の空の要素を選択して詳細を入力する必要があります。 onsert_graph_linkでは、mallocを使ってListオブジェクトを作成し、それを関連ノードに追加する必要があります。 – JeremyP