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