ヒープを用いたプライオリティキューの実現

/* 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 */