それに対して,リストは前後のデータのある位置をメモリーに入れておく.それを元に数 列を構成する.
ここのところの図は,本日間に合わなかったので,来週渡す.
このプログラムで使われている主なテクニックは,以下の通りである.
これは,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 |
| 著作者 | 紀平拓男・春日伸弥 |
| 出版社 | ソフトバンク パブリッシング株式会社 |