例題 1下図のようにデータが数珠つなぎに連なった構造を リスト構造 という.![]()
ここでの矢印による連結をポインタによって実現する.
![]() コーディング例1 /* 2 * プログラミング演習 第 9 回 3 * [例題 1] 4 * (C) 2006 Hirohisa AMAN <aman@cs.ehime-u.ac.jp, aman@computer.org> 5 */ 6 #include <stdio.h> 7 8 /* 構造体 node の宣言 */ 9 struct node { 10 int data; 11 struct node* next; 12 }; 13 14 int main(void){ 15 struct node sample[3]; 16 struct node* head; 17 struct node* p; 18 19 /* 各データを格納 */ 20 sample[0].data = 2; 21 sample[1].data = 3; 22 sample[2].data = 5; 23 24 /* 各ノードを連結 */ 25 head = &sample[0]; 26 sample[0].next = &sample[1]; 27 sample[1].next = &sample[2]; 28 sample[2].next = NULL; 29 30 /* リストの内容を表示 */ 31 p = head; 32 while ( p != NULL ){ 33 printf("%d ", p->data); 34 p = p->next; 35 } 36 printf("\n"); 37 38 return 0; 39 }
※左端の数字は行番号であり,ソースコードには含まれない点に注意!
コンパイル & 実行例$ gcc example9_1.c [Enter] $ ./a.out [Enter] 2 3 5 解説まず,データを格納するために構造体 node 型の変数を 3 つ用意します. ここでは配列としてまとめて用意しています.15 struct node sample[3];つまり,sample[0], sample[1], sample[2] という 3 つの変数を用意します. あわせて,ポインタ変数も 2 つ(head と p)用意しておきます. 16 struct node* head; 17 struct node* p; ![]() 19 /* 各データを格納 */ 20 sample[0].data = 2; 21 sample[1].data = 3; 22 sample[2].data = 5; ![]() sample[0] をポインタ変数 head に連結させます. 言い換えると,sample[0] の番地を head に格納 することで,head から sample[0] の内容にアクセスできるようにします. 24 /* 各ノードを連結 */ 25 head = &sample[0];アンパサンド(&)を変数名の前に書くと, その変数の番地が調べられることは既に学んだ通りです. これにより,次のようなリンクが形成されます. ![]() 26 sample[0].next = &sample[1]; 27 sample[1].next = &sample[2];によって,次のようなリンクが形成されます. ![]() 具体的には隣のノードを指し示すためのポインタ変数 (sample[2].next)に NULL という特別な値を書き込みます. これは「どこも指していない」ことを意味します. 28 sample[2].next = NULL; ![]()
あとはこの内容を順に表示していくだけです.
30 /* リストの内容を表示 */ 31 p = head; 32 while ( p != NULL ){ 33 printf("%d ", p->data); 34 p = p->next; 35 } 36 printf("\n");これ以上の細かい説明は省略しますが,34 行目の持つ効果のみ説明しておきます. 最初の段階(31行目)では ![]() ![]() 同様の処理が p == NULL となるまで繰り返されることにより, 全データが順に表示されていきます. |