配列を用いたキューの実現(リングバッファー)

/* Queue */
#include <stdio.h>
#define	BUFSIZE	256
#define	DATANUM	10	/* 配列のサイズ(最大データ数+1) */

/* キューデータ */
	int	data[DATANUM] = { 123, 106, 777, 580, 216 };
/* 先頭のインデックス */
	int	head = 0;
/* 末尾のインデックス */
	int	tail = 4;

	void	dispqueue();
	int	enqueue( int n );
	int	dequeue( int *n );

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

	while(1)
	{
		dispqueue();
		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':	/* 全データ削除 */
			head = 0;
			tail = DATANUM-1;
			printf("全てのデータを消去しました。\n");
			break;
		case 'q':
		case 'Q':	/* 終了 */
			exit(1);
		default:
			continue;
		}
	}
}

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

	for( i = 0; i < DATANUM; i++ )
	{
		if( i == head )
			printf(" H");
		else if( head == 0 && tail == DATANUM-1 )
			printf(" -");
		else if( head < tail && head < i && i <= tail )
			printf(" >");
		else if ( tail+1 < head && ( i <= tail || head < i ) )
			printf(" >");
		else
			printf(" -");
		printf("%2d", i);
		if( i == tail )
			printf("T");
		else if( head == 0 && tail == DATANUM-1 )
			printf("-");
		else if( head < tail && head <= i && i < tail )
			printf(">");
		else if ( tail+1 < head && ( i < tail || head <= i ) )
			printf(">");
		else
			printf("-");
	}
	printf("\n");
	for( i = 0; i < DATANUM; i++ )
	{
		if( head == 0 && tail == DATANUM-1 )
			printf("(%3d)", data[i] );
		else if( tail + 1 == head )
			printf("(%3d)", data[i] );
		else if( head <= tail && head <= i && i <= tail )
			printf(" %3d ", data[i] );
		else if ( tail+1 < head && ( i <= tail || head <= i ) )
			printf(" %3d ", data[i] );
		else
			printf("(%3d)", data[i] );
	}
	printf("\n");

	printf("Queue:");
	if( (tail + 1) % DATANUM == head )
		;
	else if( head <= tail )
		for( i = head; i <= tail; i++ )
			printf(" %3d ", data[i] );
	else/* if( (head -1 + DATANUM) % DATANUM != tail )*/
	{
		for( i = head; i < DATANUM; i++ )
			printf(" %3d ", data[i] );
		for( i = 0; i <= tail; i++ )
			printf(" %3d ", 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 );
}

/*
	引数で与えられたデータをEnqueueする
	(循環配列の末尾(の次)に挿入し、末尾を後にずらす)関数
	キューがいっぱいでEnqueueできない場合は -1 を返す
*/
int	enqueue( int n )
{
/* さー考えよう! */
}

/*
	キューからデータをDequeue(先頭のデータを読み出して、先頭を後にずらす)して、
	引数で与えられた場所にその値を格納する関数
	循環配列(キュー)が空で削除(Dequeue)できない場合は -1 を返す
*/
int	dequeue( int *n )
{
/* さー考えよう! */
}

/* end of queue0.c */