第 9 回 - 構造体(3)

[5/29, 2006 H.Aman]
67x27(1669bytes)   67x27(1669bytes) 【課題 3】

例題 3

3 つの整数を順に読み込み, それらを逆順に並べたリストを作りなさい.

(例)入力順: 2, 3, 5
340x61(6134bytes)

コーディング例

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