プロが教えるわが家の防犯対策術!

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となるのは分かるんですが・・・

A 回答 (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,ht …
    • good
    • 2
この回答へのお礼

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

お礼日時:2007/08/07 19:13

人と人とが手をつなぐイメージかな。

(人=構造体)
ポインタは次の人(もしくは前の人)と手をつなぐための手(ハンドル)です。
nextは、次の人へ。
prevは、前の人へ。(質問者さんの例にはないですが。)

データをくさり状につないでおくと、いろいろ処理がやりやすくなります。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/07 19:12

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

    • good
    • 1
この回答へのお礼

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

お礼日時:2007/08/07 18:45

構造体の中にあるのは構造体ではなく「構造体へのポインタ」です。



構造体の中の「構造体へのポインタ」は別(次)の構造体を指すポインタで、構造体が鎖のようにつながったデータ構造を表現しています。

□→□→…→□

鎖の最後にある構造体の中の「構造体へのポインタ」にNULLを設定することで、鎖の末尾を表現します。
    • good
    • 0
この回答へのお礼

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

お礼日時:2007/08/07 18:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています