メンバに同じ型へのポインタを持つ構造体


構造体メンバには、自分自身と同じ型へのポインタを持たせることができるのです。
struct data {
  char name[32];
  int age;
  struct data *nextdata;
};
というような感じです。このような構造体を自己参照的構造体(self-referential structure)といいます。テンプレートの作り方は分かったと思いますが、いったいこんなものどうやって使うのでしょうか。

ソースコード

源文件
  1|/* type04.c */                                                                        
  2|
  3|#include <stdio.h>
  4|
  5|typedef struct _tagDATA {
  6|  char name[32];
  7|  int age;
  8|  struct _tagDATA *nextdata;
  9|} DATA;
 10|
 11|int main(void)
 12|{
 13|  DATA a = {"Polo", 28},
 14|       b = {"Mou", 26},
 15|       c = {"fei", 27};
 16|
 17|       DATA *lpdata;
 18|
 19|       a.nextdata = &b;
 20|       b.nextdata = &c;
 21|       c.nextdata = NULL;
 22|
 23|       for(lpdata = &a; lpdata; lpdata = lpdata->nextdata){
 24|         printf("%s (%d歳)\n", lpdata->name, lpdata->age);
 25|       }                                                                              
 26|       return 0;
 27|}

実行結果

Polo (28歳)
Mou (26歳)
fei (27歳)

a の nextdata メンバは b のアドレス、b の nextdata メンバには c のアドレス、そして c の nextdata メンバは NULL を代入しておきます。

そうすると、for 文でこんなに簡単に、全部の構造体のすべてのメンバを表示することができるのです。

for 文の初期設定で、lpdataに構造体 a のアドレスを代入しています。継続条件式は lpdata です。これが NULL になると for 文が終了します。再設定式では、lpdata に nextdata メンバを代入しています。つまり、次の構造体を指すようになるわけです。



Chapte8 @ C言語目録 @ HomeWork List @ 昭亮's Homepage