配列(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 */