例題 33 つの整数を順に読み込み, それらを逆順に並べたリストを作りなさい.
(例)入力順: 2, 3, 5
コーディング例1 /* 2 * プログラミング演習 第 9 回 3 * [例題 3] 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 int x, i; 19 20 /* データを繰り返し読み込みながら連結していく */ 21 for ( i = 0; i < 3; i++ ){ 22 scanf("%d", &x ); 23 sample[i].data = x; 24 25 if ( i == 0 ){ 26 sample[i].next = NULL; 27 } 28 else{ 29 sample[i].next = &sample[i-1]; 30 } 31 } 32 head = &sample[2]; 33 34 /* リストの内容を表示 */ 35 p = head; 36 while ( p != NULL ){ 37 printf("%d ", p->data); 38 p = p->next; 39 } 40 printf("\n"); 41 42 return 0; 43 }
※左端の数字は行番号であり,ソースコードには含まれない点に注意!
コンパイル & 実行例$ gcc example9_3.c [Enter] $ ./a.out [Enter] 2 3 5 [Enter] 5 3 2 解説基本的な考え方は, sample[0], sample[1], sample[2] の順にデータを格納しつつ, それらを逆順に連結していくというものである.まず読み込みに関しては素直に繰り返し scanf を使用する: 21 for ( i = 0; i < 3; i++ ){ 22 scanf("%d", &x ); 23 sample[i].data = x; その繰り返しの中で,ノードを逆順に連結させていく: 25 if ( i == 0 ){ 26 sample[i].next = NULL; 27 } 28 else{ 29 sample[i].next = &sample[i-1]; 30 } 31 } 32 head = &sample[2];最初に読み込んだ sample[0] (i == 0 の場合)が末端のノードになるので, 25〜27 行目 25 if ( i == 0 ){ 26 sample[i].next = NULL; 27 }のように next 部を NULL にしておく. 一方 sample[1], sample[2] (i != 0 の場合) については,それぞれ sample[0], sample[1] がその後ろに続けばよい. これがポイントで, 29 行目の 29 sample[i].next = &sample[i-1];がこの関係を形成している. つまり, i 番目のノードの後ろには i-1 番目のノード が連結するようにしていく. リストの先頭は 2 番目のノード(sample[2])になるので, その番地を head に代入しておく(32行目). |