配列(unordered array)の操作

/* Unorderd Array */
#include <stdio.h>
#define	BUFSIZE	256
#define	DATANUM	15	/* 配列のサイズ(最大データ数) */

/* 配列データ */
	int data[DATANUM] = { 123, 106, 777, 580, 216, 136, 800, 351, 103, 197 };
/* データの個数 */
	int datanum = 10;

	void	dispdata();
	int	inputdata();
	int	insert( int n );
	int	inserth( int n );
	int	search( int n );
	int	deletet( int i );
	int	delete( int i );
	int	minimum();
	int	maximum();

main()
{
	char	buf[BUFSIZE];
	int	n, i;

	printf("コマンド一覧\n");
	printf("i:挿入 (Insert tail)\n");
	printf("h:挿入 (insert Head)\n");
	printf("s:検索 (Search)\n");
	printf("d:削除 (Delete idx & move tail)\n");
	printf("D:削除 (Delete idx & move)\n");
	printf("t:削除 (delete data & move Tail)\n");
	printf("m:削除 (delete data & Move)\n");
	printf("n:最小値(miNimum)\n");
	printf("x:最大値(maXimum)\n");
	printf("c:全消去(Clear all)\n");
	printf("q:終了 (Quit)\n");
	while(1) {
		dispdata();
		printf("[MENU] i,h:挿入、s:検索、d,D,t,m:削除、n:最小値、x:最大値、c:全消去、q:終了\n");
		fgets( buf, BUFSIZE, stdin );
		switch( buf[0] )
		{
		case 'i':	/* データを最後に挿入 */
			if( insert( n = inputdata() ) < 0 )
				printf("配列の容量を越えるので挿入できませんでした。\n");
			else
				printf("データ %d を最後に挿入しました。\n", n );
			break;
		case 'h':	/* データを最初に挿入 */
			if( inserth( n = inputdata() ) < 0 )
				printf("配列の容量を越えるので挿入できませんでした。\n");
			else
				printf("データ %d を最初に挿入しました。\n", n );
			break;
		case 's':	/* データを検索 */
			if( (i = search( n = inputdata() )) < 0 )
				printf("データ %d は見つかりませんでした。\n", n );
			else
				printf("データ %d は %d 番目に見つかりました\n", n, i );
			break;
		case 'd':	/* データを削除(最後のデータを移動) */
			if( deletet( i = inputidx() ) < 0 )
				printf("%d 番目のデータは削除できませんでした。\n", i );
			else
				printf("%d 番目のデータを消去し、最後のデータを移動しました。\n", i );
			break;
		case 'D':	/* データを削除(後のデータをずらす) */
			if( delete( i = inputidx() ) < 0 )
				printf("%d 番目のデータは削除できませんでした。\n", i );
			else
				printf("%d 番目のデータを消去し、後のデータをずらしました。\n", i );
			break;
		case 't':	/* データを削除(最後のデータを移動) */
			if( (i = search( n = inputdata() )) < 0 )
				printf("データ %d は見つかりませんでした。\n", n );
			else
			{
				if( deletet( i ) < 0 )
					printf("%d 番目のデータは削除できませんでした。\n", i, n );
				else
					printf("%d 番目のデータ %d を消去し、最後のデータを移動しました。\n", i, n );
			}
			break;
		case 'm':	/* データを削除(後のデータをずらす) */
			if( (i = search( n = inputdata() )) < 0 )
				printf("データ %d は見つかりませんでした。\n", n );
			else
			{
				if( delete( i ) < 0 )
					printf("%d 番目のデータは削除できませんでした。\n", i, n );
				else
					printf("%d 番目のデータ %d を消去し、後のデータをずらしました。\n", i, n );
			}
			break;
		case 'n':	/* 最小値を求める */
			if( (i = minimum()) < 0 )
				printf("配列が空なので最小値はありません。\n");
			else
				printf("最小値は %d 番目の %d です。\n", i, data[i] );
			break;
		case 'x':	/* 最大値を求める */
			if( (i = maximum()) < 0 )
				printf("配列が空なので最大値はありません。\n");
			else
				printf("最大値は %d 番目の %d です。\n", i, data[i] );
			break;
		case 'c':	/* 全データ削除 */
			datanum = 0;
			printf("全てのデータを消去しました。\n");
			break;
		case 'q':
		case 'Q':	/* 終了 */
			exit(1);
		default:
			continue;
		}
	}
}

/* 全データを表示する関数 */
void	dispdata()
{
	int	i;

	for( i = 0; i < datanum; i++ )
		printf(" <%2d>", i );
	printf("\n");
	for( i = 0; i < datanum; i++ )
		printf("%5d", data[i] );
	printf("\n");
}

/* データをキー入力する関数 */
int	inputdata()
{
	char	buf[BUFSIZE];
	int	n;

	do {
		printf("データを入力して下さい:");
		fgets( buf, BUFSIZE, stdin );
	} while( sscanf( buf, "%d", &n ) != 1 );
	return( n );
}

/* インデックスをキー入力する関数 */
int	inputidx()
{
	char	buf[BUFSIZE];
	int	n;

	do {
		printf("インデックスを入力して下さい:");
		fgets( buf, BUFSIZE, stdin );
	} while( sscanf( buf, "%d", &n ) != 1 );
	return( n );
}

/**********************************************************************
	完成に向けて作成すべき関数はこの下に集められている。
	return( -1 ); 等はその関数が未完成であっても、
	コンパイルして他の部分のテストを可能にするためのダミー文
**********************************************************************/

/*
	引数で与えられたデータを配列の最後に挿入する関数
	当初の配列のサイズを越えて挿入できない場合は-1を返す
	(テストは i コマンドで)
*/
int	insert( int n )
{
/* さー考えよう! */
	return( -1 );
}

/*
	引数で与えられたデータを配列の最初に挿入する関数
	当初の配列のサイズを越えて挿入できない場合は-1を返す
	(テストは h コマンドで)
*/
int	inserth( int n )
{
/* さー考えよう! */
	return( -1 );
}

/*
	引数で与えられたデータを配列から探す関数
	見つかったらそのインデックスを返し、見つからなければ-1を返す
	(テストは s コマンドで)
*/
int	search( int n )
{
/* さー考えよう! */
	return( -1 );
}

/*
	引数で与えられたインデックスのデータを配列から消去し、その場所に最後のデータを移動する関数
	削除できない場合は-1を返す
	(テストは d コマンドで)
*/
int	deletet( int i )
{
/* さー考えよう! */
	return( -1 );
}

/*
	引数で与えられたインデックスのデータを配列から消去し、後ろのデータを順にずらす関数
	削除できない場合は-1を返す
	(テストは D コマンドで)
*/
int	delete( int i )
{
/* さー考えよう! */
	return( -1 );
}

/*
	配列データの最小値を求めて、そのインデックスを返す関数
	見つからなければ-1を返す
	(テストは n コマンドで)
*/
int	minimum()
{
/* さー考えよう! */
	return( -1 );
}

/*
	配列データの最大値を求めて、そのインデックスを返す関数
	見つからなければ-1を返す
	(テストは x コマンドで)
*/
int	maximum()
{
/* さー考えよう! */
	return( -1 );
}
/* end of uarray0.c */