/* Heap Priority Queue */ #include #define BUFSIZE 256 #define DATANUM 15 /* 配列のサイズ(最大データ数) */ /* キューデータ */ int data[DATANUM] = { 216, 197, 136, 123, 106 }; /* データの個数 */ int datanum = 5; void dispheap(); void swap( int *x, int *y ); int enqueue( int n ); int dequeue( int *n ); main() { char buf[BUFSIZE]; int n, i; while(1) { dispheap(); printf("[MENU] e:加列(Enqueue)、d:除列(Dequeue)、c:全消去、q:終了\n"); fgets( buf, BUFSIZE, stdin ); switch( buf[0] ) { case 'e': case 'E': /* データをエンキューする */ if( enqueue( n = inputdata() ) < 0 ) printf("キューが一杯で、Enqueueできませんでした。\n"); else printf("データ %d をEnqueueしました。\n", n ); break; case 'd': case 'D': /* データをデキューする */ if( dequeue( &n ) < 0 ) printf("キューが空で、Dequeueできませんでした。\n"); else printf("Dequeueしたデータは %d でした。\n", n ); break; case 'c': /* 全データ削除 */ datanum = 0; printf("全てのデータを消去しました。\n"); break; case 'q': case 'Q': /* 終了 */ exit(1); default: continue; } } while(1); } /* 全データを表示する関数 */ void dispheap() { void disps( int s ); void dispdata( int i ); int i; disps(17); dispdata( 0 ); printf("\n"); disps(7); dispdata( 1 ); disps(15); dispdata( 2 ); printf("\n"); disps(2); for( i = 3; i < 7; i++ ) dispdata( i ), disps(5); printf("\n"); for( i = 7; i < 15; i++ ) dispdata( i ); printf("\n"); } void disps( int s ) { int i; for( i = 0; i < s; i++ ) printf(" "); } void dispdata( int i ) { if( i < datanum ) printf(" %3d ", data[i] ); else printf("(%3d)", data[i] ); } /* データをキー入力する関数 */ int inputdata() { char buf[BUFSIZE]; int n; do { printf("データを入力して下さい:"); fgets( buf, BUFSIZE, stdin ); } while( sscanf( buf, "%d", &n ) != 1 ); return( n ); } /* データを交換する関数 */ void swap( int *x, int *y ) { int t; t = *x; *x = *y; *y = t; } /* 引数で与えられたデータをEnqueueする (新たなデータをヒープ配列の最後に挿入し、 そこから上(ルート)に向かって所定の位置まで移動する)関数 配列(キュー)がいっぱいで挿入(Enqueue)できない場合は -1 を返す */ int enqueue( int n ) { /* さー考えよう! */ } /* キューからデータをDequeue(キューの先頭(ヒープ配列の最初)のデータを削除し ヒープ配列の最後のデータを先頭(ルート)に移動し、 そこから下(リーフ)に向かって所定の位置まで移動する)して、 引数で与えられた場所にその値を格納する関数 配列(キュー)が空で削除(Dequeue)できない場合は -1 を返す */ int dequeue( int *n ) { /* さー考えよう! */ } /* end of hpqueue0.c */