例題 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行目). |