それに対して,リストは前後のデータのある位置をメモリーに入れておく.それを元に数 列を構成する.
ここのところの図は,本日間に合わなかったので,来週渡す.
このプログラムで使われている主なテクニックは,以下の通りである.
これは,TYPE DEFine(型定義)と呼ばれるもので,型に別名をつける役割があ る.ここでは,struct tagListNodeと言う型を,ListNodeと呼ぶことにして いる.15行目にそれが使われている.
これは,ヌルポインター,あるいは空ポインターと呼ばれるものである.これは, lastnodeが何も指し示していないことを保証するために,使っている.
newnodeはポインターである.ポインターが指し示す構造体のメンバーにアクセス する場合,アロー演算子(->)を使う.ここでは,ポインターnewnodeが示す 構造体のメンバーdataにbufの値を代入している.ポインターではなく,普 通の変数となっている構造体の場合,そのメンバーにアクセスするにはドット演算子 (.)を使う.
1 #include <stdio.h> 2 #include <stdlib.h> 3 4 /* リストの要素(ノード)を表す構造体 */ 5 typedef struct tagListNode 6 { 7 struct tagListNode *prev; /* 前の要素へのポインタ */ 8 struct tagListNode *next; /* 次の要素へのポインタ */ 9 int data; /* この要素がもっているデータ */ 10 } ListNode; 11 12 int main(void) 13 { 14 int buf,sum; 15 ListNode *firstnode,*lastnode,*newnode,*thisnode,*removenode; 16 17 firstnode=lastnode=NULL; 18 19 do 20 { 21 printf("整数を入力してください(0を入力すると終了):"); 22 scanf("%d",&buf); 23 if(buf) /* 新たな入力があったら */ 24 { 25 /* 新しいノードを作成 */ 26 newnode=(ListNode*)malloc(sizeof(ListNode)); 27 newnode->data=buf; 28 newnode->next=NULL; 29 30 if(lastnode!=NULL) 31 { 32 /* すでにあるリストの末尾に 33 新しいノードをつなげる */ 34 lastnode->next=newnode; 35 newnode->prev=lastnode; 36 lastnode=newnode; 37 } 38 else 39 { 40 /* これが最初の要素だった場合 */ 41 firstnode=lastnode=newnode; 42 newnode->prev=NULL; 43 } 44 } 45 } while(buf != 0); 46 47 /* 合計値を算出 */ 48 printf("--入力されたのは以下の数です--\n"); 49 sum=0; 50 for(thisnode=firstnode;thisnode!=NULL; 51 thisnode=thisnode->next) 52 { 53 printf("%d\t",thisnode->data); 54 sum+=thisnode->data; 55 } 56 printf("\n----\n以上の数の合計値は%dです。\n",sum); 57 58 /* リストの全ノードを削除 */ 59 for(thisnode=firstnode; thisnode!=NULL;) 60 { 61 removenode=thisnode; 62 thisnode=thisnode->next; 63 free(removenode); 64 } 65 66 return EXIT_SUCCESS; 67 }
[転載について]
このペー
ジ中のリスト4のプログラムは,教科書として使用している以下の書籍
書名 | プログラミングの宝箱 アルゴリズムとデータ構造 ISBN4-7973-2419-8 |
著作者 | 紀平拓男・春日伸弥 |
出版社 | ソフトバンク パブリッシング株式会社 |