配列を用いたキューの実現(リングバッファー)
/* 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 */