/****************************************************************************/ /* */ /* list_imp.c */ /* */ /* 連結(線形)リストの実現 */ /* 1) 順次データをリストに登録していく */ /* 2) そのデータを表示する */ /* 3) 確保したメモリの解放も忘れずに */ /* */ /* *) 多めにコメントを入れた */ /* */ /* 履歴 02/11/06 tokuda とりあえず作った */ /* 02/11/07 tokuda typedef してみた */ /* */ /****************************************************************************/ #include #include // 標準ライブラリ関数 atoi(),exit() を使用するため #include // 標準ライブラリ関数 strcmp() を使用するため // 線形リストのノードを表す構造体 struct list { int value; // 値 struct list *next; // 後続ノードへのポインタ }; typedef struct list LIST; /* 自己参照構造体の場合は上のように typedef しないとエラーになる 例えば typedef list{ int value; LIST *next; // ここがエラー } LIST; はエラーとなる 参考URL http://www.bohyoh.com/CandCPP/FAQ/FAQ00051.html */ LIST *add_list(int value, LIST *header); void show_list(LIST *p); void free_list(LIST *p); /****************************************************************************/ /* メインプログラム */ /****************************************************************************/ int main(void) { int input_value; LIST *header; char str[80] = {0}; header = NULL; // 初期状態ではリストは空 // リスト登録 while (1) { printf("整数を入力(Eで終了)-->"); scanf("%s", str); //gets(str) とかも可 if (strcmp(str, "E") == 0) break; // strcmpは文字列の比較、入力が'E'の時に終了 input_value = atoi(str); // atoiは文字列をint型に変換する header = add_list(input_value, header); } /* 他のリスト登録方法 printf("整数を入力(終了:CTRL+Z)-->"); while (scanf("%d", &input_value) != EOF) { header = add_list(input_value, header); // リストにデータを登録 } */ // リスト表示 show_list(header); // リスト解放 free_list(header); return 0; } /*----------------------------------------------------------------------*/ /* リスト登録 */ /*----------------------------------------------------------------------*/ LIST *add_list(int input_value, LIST *header) { LIST *p; // 記憶領域確保 if ((p = (LIST *)malloc(sizeof(LIST))) == NULL) { printf("メモリが足りない\n"); exit(1); } // リストにデータを登録 p->value = input_value; // ポインタのつなぎ換え p->next = header; // 今までの先頭ポインタを次ポインタに header = p; // 新たな領域を先頭ポインタに return header; // 戻り値がアドレスなので関数が *add_list となっている } /*----------------------------------------------------------------------*/ /* リスト表示 */ /*----------------------------------------------------------------------*/ void show_list(LIST *p) { for (; p != NULL; p = p->next) printf("%d\n", p->value); /* こっちでもいい while (p != NULL) { printf("%d\n", p->value); p = p->next; } */ } /*----------------------------------------------------------------------*/ /* リスト解放 */ /*----------------------------------------------------------------------*/ void free_list(LIST *p) { LIST *p2; // 一時格納用ポインタ変数 for (; p != NULL; p = p2) { p2 = p->next; free(p); } /* while (p != NULL) { p2 = p->next; free(p); p = p2; } */ }