• 締切済み

リスト構造の設定のしかた

メンバ変数が配列のlist_before構造体に設定してあるものを、リスト構造のlist_after構造体に設定し直したいです。 どのように設定すればいいのでしょうか? また、list_before構造体とlist_after構造体を引数にした関数で設定したいのですが呼び出し元と先の引数はどう書けばいいのでしょうか? その際の構造体とメンバ変数は以下になります。 ご教授どうぞ宜しくお願いいたします。 struct list_before { char *name[5]; int size[5]; }; struct list_after { char *name; int size; struct list *next; };

みんなの回答

  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★ヒント ・単純に『list_before』構造体のメンバ配列の[0]~[4]を『list_after』のメンバにセットして  いけば良いと思います。for 文なり、while 文なりで繰り返せば簡単です。 ・あと『list_after』構造体は malloc 関数などで確保する必要がありそうですね。または、  『list_after』構造体配列の[0]~[4]にセットしてそのアドレスを『next』メンバにセットすれば  良いでしょう。→『struct list *next;』は『struct list_after *next;』ですよね。多分? ・関数に関しては1つの関数で処理させるか、『list_before』構造体の1要素で処理させるかで  代わってきますよ。引数、戻り値が…。 例えば: struct list_after *SetArrayToList( char *name, int size ); という関数があったとします。 ・この関数は引数に『list_before』構造体のメンバ変数を2つ引数で受け取って、内部で『list_after』  構造体を malloc 関数などで確保します。その後、引数 name、size をセットして確保した『list_after』  の構造体アドレスを戻り値に戻します。 ・この関数の戻り値を一時的に記憶しておく。そして、次の戻り値のアドレスを前回保存しておいた構造体の  『next』メンバにセットします。これを繰り返してセットしなおせます。なお、最後の要素の場合は、  『next』メンバに NULL をセットします。 ・さらに最初の戻り値はリスト構造の先頭ですので別に保存しておかないとメモリの解放もデータ検索も  できなくなります。注意! ・以上。おわり。→参考に!

sakur1986
質問者

お礼

ありがとうございます。 何とか動くものは作れたと思います。

すると、全ての回答が全文表示されます。
noname#26650
noname#26650
回答No.1

確認したいことがあります。 list_before構造体のメンバーが配列なのですか? 下記のような「構造体の配列」ではなくて、ですか? struct list_before {   char *name;   int size; }; struct list_before data[5];    // 構造体の配列 (注)インデントのため、全角空白を使っています。

sakur1986
質問者

補足

どうもありがとうございます。 実際は他にも配列でないメンバ変数が存在しており、このように表記してしまいました。

すると、全ての回答が全文表示されます。

関連するQ&A