それぞれのデータに次のデータが何かを覚えておくことによって配列のようにデータの列を実現することができます。
構造体では、このようなデータの並びを構造体のメンバとして自分自身と同じ型のの構造体へのポインタ変数を設定することで実現できます。ここで注意しなければいけないのは、あくまでもポインタ変数であって自分自身の型の変数ではありません。ここで、ポインタ変数に次の構造体のアドレスを代入しておくことによって、データの列を考えることができます。
このような構造体は次のようにして定義します。ここでメンバとして自分自身の型へのポインタ変数を定義しますのであらかじめ構造体のタグ名が分かっていないと定義できません。そこで、自己参照的構造体を定義するときには必ずタグ名を付けておかないといけません。リストの具体的な利用方法は次の節で紹介します。typedef struct personal_tag{ /* アドレスデータタグ */ char name[10]; /* 名前 */ char address[20]; /* 住所 */ double phone; /* 電話番号 */ struct personal_tag *personal_p; /* 自分自身の型へのポインタ変数 */ } personal_t; /* アドレスデータ型の定義 */