演習15-5

【問1】

15-5. 自己参照構造体で「自己参照構造体を使ったリスト処理の例」として用いたプログラム(下記のプログラム)を以下のように修正せよ。

キーと名前の他に、処理コードを入力させ、処理コードに従って次の処理を行うようにする。

  1. 処理コード:1

    キーボードから入力したキーと名前を、新規のデータとしてリストに追加する。

    このとき、リストのデータはキーで降順に並ぶように登録すること。

  2. 処理コード:2

    キーボードから入力したキーと同一キーのデータをリストから削除する。

  3. 処理コード:3

    入力処理を終了し、リストの中身を表示する。

実行結果例 

次の処理コードを選択しなさい
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;
	}
}

解答例戻る


banner初心者のためのポイント学習C言語」
Copyright(c) 2000-2004 TOMOJI All Rights Reserved