演習課題「間違い探し」
右のコードエリアには、キューを実装したコードがあります。
このコードには間違いがあり、正しく動作しません。
dequeue 関数を修正して、正しい出力が得られるようにしてください。
期待する出力値
10
20
queue underflow
#06:キューを実装しよう (2)
このチャプターでは、前回のチャプターに引き続き、キューを実装します。
// キューを実装しよう(1)
#include <stdio.h>
#define N 10
typedef int data_t;
data_t queue[N];
int head;
int tail;
void init(void)
{
head = 0;
tail = 0;
}
int main(void)
{
}
キューにデータを追加する enqueue 関数は、次のように定義できます。void enqueue(data_t x)
{
if (tail >= N) {
printf("queue overflow\n");
return;
}
queue[tail] = x;
tail++;
}
tail 変数の値が N 以上のときは、それ以上データを追加できないので、
「queue overflow」と出力して、return で処理を終了させます。
キューからデータを取り出す dequeue 関数は、次のように定義できます。void dequeue(data_t *x)
{
if (head == tail) {
printf("queue underflow\n");
return;
}
*x = queue[head];
head++;
}
head と tail が等しいときは、それ以上データを取り出せないので、
「queue underflow」と出力して、return で処理を終了させます。
このチャプターで作成したコードです。// キューを実装しよう(2)
#include <stdio.h>
#define N 10
typedef int data_t;
data_t queue[N];
int head;
int tail;
void init(void)
{
head = 0;
tail = 0;
}
void enqueue(data_t x)
{
if (tail >= N) {
printf("queue overflow\n");
return;
}
queue[tail] = x;
tail++;
}
void dequeue(data_t *x)
{
if (head == tail) {
printf("queue underflow\n");
return;
}
*x = queue[head];
head++;
}
int main(void)
{
// キューの初期化
init();
// キューに値を追加
enqueue(10);
enqueue(20);
// キューから値を取り出す
int x;
dequeue(&x);
printf("%d\n", x);
dequeue(&x);
printf("%d\n", x);
}