ヒープを用いたプライオリティキューの実現
/* Heap Priority Queue */
#include <stdio.h>
#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 */