配列の添え字番号をアドレスとする方法

※教科書第9章「線形リストの実現(カーソル版)」

配列の番号をそのまま格納の順番とするのではなく、データのある位置(場所、アドレス)ととらえて、線形リストに応用する方法があります。

実現方法

次の位置(配列番号)を格納する構造体を用意すれば、線形リストを実現できます。

1.以下に示すような構造体を定義します。

typedef struct _team{
char *name; //球団名 
int next; //次の球団の位置(配列の添え字)
}Team;

次のデータを表すnextは int型ですが、なぜなら 配列の添字番号は、0.1.2.3.4....というようにint型の数値であるからということが理解できると思います。

なお、上記の例では、typdef (typedef A B でAをBと定義するという意味になる)を利用してます。

2.この構造体の配列を宣言し初期化する。

この構造体を配列で宣言して,次のデータのある配列番号を nextに格納します.その際、以下のルールに従います。

    • 最初の配列(配列番号0番)を仮のトップとする方法が一般的である
    • 終端データには,nextの値を -1にします.(べつに他の方法でもよいが、本講義ではこのようにする)

たとえば、次のように初期化してデータを格納できます。

Team teams[  ]={"",1,"Fighters",3,"Marines",4, "Buffaloes",2,"Hawks",6,"Blue Wave",-1,"Lions",5};

問題1

(1)この構造体配列のイメージを書け

(2)この例はどのような順序になっているか?ただし、0番目データが先頭であるとする。末 尾の球団においては,その次のIDは-1とする.

(3)先頭から順番に出力するプログラムを下記にしたがい完成させよ(3位まででよい)

void kadai4_1(){
struct Team teams[  ]={"",1,"Fighters",3,"Marines",4, "Buffaloes",2,"Hawks",6,"Blue Wave",-1,"Lions",5};
int t1; //1位のチームの位置(配列番号)を表す
int t2; //2位のチームの位置(配列番号)を表す
int t3; //3位のチームの位置(配列番号)を表す 
//1位の球団の位置を求める
t1 = teams[(3-1)].next;
printf("1位のチーム:%s\n",teams[t1].name);
//2位の球団の位置を求める
t2 = teams[(3-2)].next;
printf("2位のチーム:%s\n",teams[t2].name);
//3位の球団の位置を求める
t3 = teams[(3-3)].next;
printf("3位のチーム:%s\n",teams[t3].name);
}

(4) whileを用いて先頭から順番に出力するプログラムを完成させよ。