/* リスト操作プログラム */ #include #include #include #define BUFSIZE 256 typedef struct node{ int data; struct node *next; } NODE, *Nodep; NODE first; /* 先頭ノードを指すポインタを含むノード */ int inputdata(); void displist(Nodep fp); int is_empty(Nodep fp); int delhead(Nodep fp); int deltail(Nodep fp); int addhead(Nodep fp, int val); int addtail(Nodep fp, int val); int find(Nodep fp, int val); main() { char buf[BUFSIZE]; int n, i; /* 初期状態として,[1, 5, 9] というリストを作成 */ first.next = (Nodep)malloc(sizeof(NODE)); first.next->data = 1; first.next->next = (Nodep)malloc(sizeof(NODE)); first.next->next->data = 5; first.next->next->next = (Nodep)malloc(sizeof(NODE));; first.next->next->next->data = 9; first.next->next->next->next = NULL; while(1) { displist(&first); printf("[MENU] A:先頭削除,B:末尾削除,C:先頭追加,D:末尾追加,E:検索,X:全削除,Q:終了\n"); fgets( buf, BUFSIZE, stdin ); switch( toupper(buf[0]) ) { case 'A': /* 先頭削除 */ switch( delhead(&first) ) { case -2: printf("delhead()が未完成なので何もしませんでした.\n"); break; case -1: printf("リストの先頭データは削除できませんでした。\n"); break; default: printf("リストの先頭データを消去しました。\n"); } break; case 'B': /* 末尾削除 */ switch( deltail(&first) ) { case -2: printf("deltail()が未完成なので何もしませんでした.\n"); break; case -1: printf("リストの末尾データは削除できませんでした.\n"); break; default: printf("リストの末尾データを消去しました.\n"); } break; case 'C': /* 先頭追加 */ switch( addhead(&first,inputdata()) ) { case -2: printf("addhead()が未完成なので何もしませんでした.\n"); break; case -1: printf("リストの先頭にデータを追加できませんでした.\n"); break; default: printf("リストの先頭にデータを追加しました.\n"); } break; case 'D': /* 末尾追加 */ switch( addtail(&first,inputdata()) ) { case -2: printf("addtail()が未完成なので何もしませんでした.\n"); break; case -1: printf("リストの末尾にデータを追加できませんでした.\n"); break; default: printf("リストの末尾にデータを追加しました.\n"); } break; case 'E': /* 検索 */ switch( find(&first,n=inputdata()) ) { default: printf("find()が未完成なので何もしませんでした.\n"); break; case 1: printf("データ %d は見つかりました.\n", n ); break; case 0: printf("データ %d は見つかりませんでした.\n", n ); } break; case 'X': /* 全データ削除 */ while( first.next != NULL ) { Nodep p = first.next; first.next = first.next->next; free(p); } break; case 'Q': /* 終了 */ exit(1); default: printf("そのコマンドはありません.\n"); continue; } } } /* リストを表示する関数 */ void displist(Nodep fp) { printf("List"); if( fp->next == NULL ) { printf(" is empty\n"); return; } for( fp = fp->next ; fp != NULL; fp = fp->next ) { printf("%5d", fp->data ); } printf("\n"); } /* リストが空であるか否かを判定する関数 リストが空ならば 1 を返し、空でなければ 0 を返す また、リストが存在しなかい場合は -1 を返す */ int is_empty(Nodep fp) { if( fp == NULL ) return( -1 ); else if( fp->next == NULL ) return( 1 ); else return( 0 ); } /* データをキー入力する関数 */ int inputdata() { char buf[BUFSIZE]; int n; do { printf("データを入力して下さい:"); fgets( buf, BUFSIZE, stdin ); } while( sscanf( buf, "%d", &n ) != 1 ); return( n ); } /********************************************************************** 完成に向けて作成すべき関数はこの下に集められている. return( -2 ); はその関数が未完成であること表わし, コンパイルして他の部分のテストを可能にするためのダミー文 **********************************************************************/ /* 引数(fp)で与えられたリストの先頭要素を削除する関数 成功した場合は1を返し,削除すべき要素が無かった場合や リストが存在しなかった場合は-1を返す (テストは A コマンドで) */ /* llist4.cのdelheadにステータスを返すようにreturn文を付加しただけの未完成版 */ int delhead(Nodep fp) { /* さー完成しよう! */ Nodep p; if( p = fp->next ) { fp->next = p->next; free(p); return(1); } return(-1); } /* 引数(fp)で与えられたリストの末尾要素を削除する関数 成功した場合は1を返し,削除すべき要素が無かった場合や リストが存在しなかった場合は-1を返す (テストは B コマンドで) */ int deltail(Nodep fp) { /* さー考えよう! */ return( -2 ); } /* 引数(fp)で与えられたリストの先頭に, 引数(val)で与えられた新規データノードを追加する関数 成功した場合は1を返し,リストが存在しなかった場合は-1を返す (テストは C コマンドで) */ int addhead(Nodep fp, int val) { /* さー考えよう! */ return( -2 ); } /* 引数(fp)で与えられたリストの末尾に, 引数(val)で与えられた新規データノードを追加する関数 成功した場合は1を返し,リストが存在しなかった場合は-1を返す (テストは D コマンドで) */ int addtail(Nodep fp, int val) { /* さー考えよう! */ return( -2 ); } /* 引数(fp)で与えられたリストの中に, 引数で与えられたデータ(val)が有るか否かを判定する関数 データが見つかったら1を返し、見つからなければ0を返す リストが存在しなかった場合は-1を返す (テストは E コマンドで) */ int find(Nodep fp, int val) { /* さー考えよう! */ return( -2 ); } /* end of llist0.c */