- ベストアンサー
構造体の中の構造体
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となるのは分かるんですが・・・
- みんなの回答 (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』をどうぞ。 ・以上。
その他の回答 (3)
- hidebun
- ベストアンサー率50% (92/181)
人と人とが手をつなぐイメージかな。(人=構造体) ポインタは次の人(もしくは前の人)と手をつなぐための手(ハンドル)です。 nextは、次の人へ。 prevは、前の人へ。(質問者さんの例にはないですが。) データをくさり状につないでおくと、いろいろ処理がやりやすくなります。
お礼
なるほど、それが双方向リストですね。
- jacta
- ベストアンサー率26% (845/3158)
「自己参照構造体」あるいは「線形リスト」で調べてみてください。
お礼
わかりました。調べてみます。
- shirayukix
- ベストアンサー率43% (90/207)
構造体の中にあるのは構造体ではなく「構造体へのポインタ」です。 構造体の中の「構造体へのポインタ」は別(次)の構造体を指すポインタで、構造体が鎖のようにつながったデータ構造を表現しています。 □→□→…→□ 鎖の最後にある構造体の中の「構造体へのポインタ」にNULLを設定することで、鎖の末尾を表現します。
お礼
なるほど・・・分かりやすい解説どうもです。 大体の感じがつかめてきました。
お礼
詳しい説明ありがとうございます。 おかげで構造体というものがわかってきました。