15-5. 自己参照構造体で「自己参照構造体を使ったリスト処理の例」として用いたプログラム(下記のプログラム)を以下のように修正せよ。
キーと名前の他に、処理コードを入力させ、処理コードに従って次の処理を行うようにする。
キーボードから入力したキーと名前を、新規のデータとしてリストに追加する。
このとき、リストのデータはキーで降順に並ぶように登録すること。
キーボードから入力したキーと同一キーのデータをリストから削除する。
入力処理を終了し、リストの中身を表示する。
実行結果例 次の処理コードを選択しなさい 1:リストの追加 2:リストの削除 3:処理終了 1 KEYを入力 1 名前を入力(MAX:19文字) Ryo 次の処理コードを選択しなさい 1:リストの追加 2:リストの削除 3:処理終了 1 KEYを入力 3 名前を入力(MAX:19文字) Yoko 次の処理コードを選択しなさい 1:リストの追加 2:リストの削除 3:処理終了 1 KEYを入力 5 名前を入力(MAX:19文字) Taro 次の処理コードを選択しなさい 1:リストの追加 2:リストの削除 3:処理終了 1 KEYを入力 2 名前を入力(MAX:19文字) Jiro 次の処理コードを選択しなさい 1:リストの追加 2:リストの削除 3:処理終了 1 KEYを入力 7 名前を入力(MAX:19文字) Sayaka 次の処理コードを選択しなさい 1:リストの追加 2:リストの削除 3:処理終了 2 KEYを入力 5 次の処理コードを選択しなさい 1:リストの追加 2:リストの削除 3:処理終了 3 リストの表示 7 Sayaka 3 Yoko 2 Jiro 1 Ryo ※ 緑字はキーボードからの入力
/* 「自己参照構造体を使ったリスト処理の例」として、用いたプログラム */ #include <stdio.h> #include <string.h> #include <stdlib.h> struct list { int key; /* キー */ char name[20]; /* 名前 */ struct list *next; /* 次のデータへのポインタ */ }; struct list *add_list( int key, char *name, struct list *head ); void show_list( struct list *p ); void free_list( struct list *p ); int main( void ) { struct list *head; /* 先頭ポインタ */ char name[20]; int key = 0; head = NULL; /* 先頭ポインタにNULLを設定 */ printf( "キーと名前(MAX:19文字)を入力(終了:Ctrl+Z)\n" ); while ( scanf( "%d %s", &key, name ) != EOF ) { /* リストにデータを登録 */ head = add_list( key, name, head ); } /* リストの表示 */ show_list( head ); /* リストの開放 */ free_list( head ); return 0; } /*** リストにデータを登録 ***/ struct list *add_list( int key, char *name, struct list *head ) { struct list *p; /* 記憶領域の確保 */ if ( ( p = ( struct list * )malloc( sizeof( struct list ) ) ) == NULL ) { printf( "malloc error\n" ); exit( EXIT_FAILURE ); } /* リストにデータを登録 */ p->key = key; strcpy( p->name, name ); /* ポインタのつなぎ換え */ p->next = head; /* 今までの先頭ポインタを次ポインタに */ head = p; /* 新たな領域を先頭ポインタに */ return head; } /*** リストの表示 ***/ void show_list( struct list *p ) { while ( p != NULL ) { /* 次ポインタがNULLまで処理 */ printf( "%3d %s\n", p->key, p->name ); p = p->next; } } /*** リストの開放 ***/ void free_list( struct list *p ) { struct list *p2; while ( p != NULL ) { /* 次ポインタがNULLまで処理 */ p2 = p->next; free( p ); p = p2; } }
▼戻る▼
「初心者のためのポイント学習C言語」 Copyright(c) 2000-2004 TOMOJI All Rights Reserved