キューを書き直し

構造体の基礎練習だと思って書いてみた、Cでキューを実現するコードには、色々と基本を踏み外していたところがあるらしいので、書き直してみた。

#include <stdio.h>
#include <stdlib.h>

#define FULL -1
#define EMPTY -2

typedef struct {
  int len;
  int index;
  int line[1];
} Que;

int checkQue(Que *q){
  if(q->len == q->index){
    return FULL;
  }else if(q->index == 0){
    return EMPTY;
  }else{
    return 0;
  }
}

void showQue(Que *q){
  int i;
  for(i = 0; i < q->len; i++)
    printf("que[%2d]: %3d\n", i, q->line[i]);
}

int que(Que *q, int i){
  if(checkQue(q) == FULL){
    puts("can't que any more");
    return -1;
  }

  q->line[q->index++] = i;
  return 0;
}

int deque(Que *q, int *ptr){
  int i;

  if(checkQue(q) == EMPTY){
    puts("que is empty");
    return -1;
  }

  *ptr = q->line[0];
  for(i = 0; i < q->index; i++)
    q->line[i] = q->line[i + 1];
  q->index--;
  return 0;
}

Que *alloc(int l){

  Que *q = (Que *) malloc(sizeof(Que) + (sizeof(int) * (l - 1)));
  if(q == NULL) exit(1);
  q->index = 0;
  q->len = l;

  return q;
}

int main(int argc, char *argv[]){
  int i,j;
  int l = atoi(argv[1]);

  Que *q = alloc(l);

  deque(q,&i);
  for(i = 0; i < l; i++)
    que(q, i*2);
  que(q,1);
  
  deque(q,&i);  que(q,i);
  deque(q,&i);  que(q,i);

  showQue(q);
  free(q);
  return 0;
}
$ gcc -o que que.c ; ./que 10
que is empty
can't que any more
que[ 0]:   4
que[ 1]:   6
que[ 2]:   8
que[ 3]:  10
que[ 4]:  12
que[ 5]:  14
que[ 6]:  16
que[ 7]:  18
que[ 8]:   0
que[ 9]:   2

境界の扱いって人間には難しいなと思う。添字を0スタートにするか1スタートにするかとか、上限と下限を引き算したときの要素数の話とか。カウンタや添字を0から始める理由って、なんだ。