/* Queue */ #include #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 */