質問: いつもお世話になっています。C言語初心者でただいま勉強中です。構造体について質問させていただきます。 ``` typedef struct{ int ID; char name[11]; int score[3]; } Record; /* struct declaration */ //struct node { //int key; //struct node *next; //}; typedef struct node *NodePointer; struct node { Record data;/*構造体の入れ子*/ NodePointer next;/*ポインタのメンバ*/ }; NodePointer head; ``` ここのNodePointer nextとNodePointer headがどんなメンバを持っているのかがよく分かりません。 自分の考えでは、 Record dataは、data.Id,data.name,data.scoreのメンバにアクセスできる。 NodePointer nextは、node型のポインタのメンバ NodePointer headは、(*head).data.Id,(*head).data.name,(*head).data.score,(*head).nextのメンバにアクセスできる。 この考えであっていますか? また、NodePointer nextとNodePointer headの違いも教えて下さい。よろしくお願いします。
回答: このnode構造体は、メンバーにnode構造体へのポインタを含む再帰構造体です。 自己参照構造体ともいうようです。 struct node { Record data;//レコード構造体 NodePointer next;//node構造体へのポインタ }; と注釈を入れると分かりやすいかも知れません。 メンバーnextはポインターですから、格納されるのはアドレスです。 名前からして、リスト構造の次のノード(node構造体)のアドレスでしょう。 ここまではnode構造体のタグ宣言で、実体は未定義です。 次の行で NodePointer head; と1つの構造体を宣言しています。 名前は head ですから、リストの先頭ということでしょうか。 そして、リスト構造のノードに対応した構造体を宣言していき、メンバーnextでつないでいくわけです。