[04a2] 数の連続2

正の整数を次々にscanfで入力し、最後に0が入力されたら、その正の整 数(最後の0は除く)を「N番目の数はN回繰り返して」出力するプログラ ムを作成せよ。たとえば「2 3 1 0」であれば「2 3 3 1 1 1」を出力す る(プログラムでは1行に1個ずつ書式文字列 "%d\n" により出力する)。 最後の0が入力されるまで出力を始めてはならない。ただし配列機能は 使わないこと。そのかわり、次のヘッダファイルiqueue.hが提供する キュー機能を呼び出して用いる。出力される数の個数は100に満たない ものとする。

// iqueue.h
#include <stdbol.h>
struct iqueue;
typedef struct iqueue *iqueuep;
iqueuep iqueue_new(int size);
bool iqueue_isempty(iqueuep p);
bool iqueue_isfull(iqueuep p);
void iqueue_enq(iqueuep p, int v);
int iqueue_deq(iqueuep p);

参考までに、テキストに載っている実装を示す。

// iqueue.c --- int type queue impl. with array
#include <stdlib.h>
#include "iqueue.h"
struct iqueue { int ip, op, size; int *arr; };
iqueuep iqueue_new(int size) {
  iqueuep p = (iqueuep)malloc(sizeof(struct iqueue));
  p->ip = p->op = 0; p->size = size;
  p->arr = (int*)malloc(size * sizeof(int)); return p;
}
bool iqueue_isempty(iqueuep p) { return p->ip == p->op; }
bool iqueue_isfull(iqueuep p) { return (p->ip+1)%p->size == p->op; }
void iqueue_enq(iqueuep p, int v) {
  p->arr[p->ip++] = v; if(p->ip > p->size) { p->ip = 0; }
}
int iqueue_deq(iqueuep p) {
  int v = p->arr[p->op++]; if(p->op > p->size) { p->op = 0; }
  return v;
}

プログラムでは下請け関数は用いないこと。