※教科書第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に格納します.その際、以下のルールに従います。
たとえば、次のように初期化してデータを格納できます。
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を用いて先頭から順番に出力するプログラムを完成させよ。