• ベストアンサー

構造体の中の構造体

typedef struct number{ int x; struct number *next; }Num; 初心者な質問で申し訳ないんですが、構造体の中に構造体があるのはどう解釈していいんでしょうか? typedef struct number{ int x; int y; }Num; の場合はNum a,b;がint a.x,a.y,b.x,b.yとなるのは分かるんですが・・・

質問者が選んだベストアンサー

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

★構造体の中の構造体とは。 ・構造体Aに構造体Bや構造体Cが入っていても普通の変数と同じに解釈すれば良いです。  例えば  // 構造体A  typedef struct tagA_t {   int a;  } tagA;  // 構造体B  typedef struct tagB_t {   int b;  } tagB;  // 構造体C(AとBを含む)  typedef struct tagC_t {   tagA A;   tagB B;   int c;  } tagC; ・この場合は構造体Cに構造体Aと構造体Bが入れ子として入っています。  『tagC CC;』と宣言すると  『int CC.A.a』とか  『int CC.B.b』というアクセスが出来ます。 本題: ・今回は構造体の中に自分自身の『構造体ポインタ』が入っています。  これは『自己参照構造体』と呼ばれ『単方向リスト』、『双方向リスト』、『二文木』とかで  データを管理できる構造を持っています。 ・質問では『next』ポインタが1つですので『単方向リスト』を構成する構造体でしょう。  他の回答者さんと同じですが『鎖』のように次々に『next』ポインタで繋げるのです。  アクセス方法は  Num a; // Num 構造体の実体  Num *pa; // Num 構造体のポインタ    pa = &a; // pa に a ポインタをセット  pa->x = 123;  pa->next;  ↑  ここまでは分かりますよね。 ・もし next に2つ3つの構造体 Num がポインタで繋がれている状態ならば  pa->next->x = 456;  とか  pa->next->next->x = 789;  としてもアクセス(代入,参照)できます。  ※詳しくは下の『参考URL』をどうぞ。 ・以上。

参考URL:
http://www9.plala.or.jp/sgwr-t/c/sec15-5.html,http://tdweb.cssa.chs.nihon-u.ac.jp/ds/ds02.html
blade3322
質問者

お礼

詳しい説明ありがとうございます。 おかげで構造体というものがわかってきました。

その他の回答 (3)

  • hidebun
  • ベストアンサー率50% (92/181)
回答No.3

人と人とが手をつなぐイメージかな。(人=構造体) ポインタは次の人(もしくは前の人)と手をつなぐための手(ハンドル)です。 nextは、次の人へ。 prevは、前の人へ。(質問者さんの例にはないですが。) データをくさり状につないでおくと、いろいろ処理がやりやすくなります。

blade3322
質問者

お礼

なるほど、それが双方向リストですね。

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.2

「自己参照構造体」あるいは「線形リスト」で調べてみてください。

blade3322
質問者

お礼

わかりました。調べてみます。

回答No.1

構造体の中にあるのは構造体ではなく「構造体へのポインタ」です。 構造体の中の「構造体へのポインタ」は別(次)の構造体を指すポインタで、構造体が鎖のようにつながったデータ構造を表現しています。 □→□→…→□ 鎖の最後にある構造体の中の「構造体へのポインタ」にNULLを設定することで、鎖の末尾を表現します。

blade3322
質問者

お礼

なるほど・・・分かりやすい解説どうもです。 大体の感じがつかめてきました。

関連するQ&A