/* implementação da interface fila.h com struct */

#include <stdlib.h>

typedef struct { Item *v; int ini; int fim; int tam; } t_fila; 

t_fila fila; 

void cria_fila (int n) {
  fila.tam = n;
  fila.ini = fila.fim = 0;
  if ((fila.v = malloc(n*sizeof(*(fila.v))))==NULL) {
    printf("Memória insuficiente!\n");
    exit(0);
  }
}

int fila_vazia() {
  return fila.ini == fila.fim;
}

int fila_cheia() {
  return fila.ini == (fila.fim + 1) % fila.tam;
}

Item remove_fila () {
  Item p;
  if (fila_vazia()) {
    printf("Fila vazia!! Underflow!!\n");
    exit(0);
  }
  p = fila.v[fila.ini];
  fila.ini = (fila.ini + 1) % fila.tam;
  return p;
}
 
void insere_fila (Item p) {
  if (fila_cheia()) {
    printf("Fila cheia!! Overflow!!\n");
    exit(0);
  }
  fila.v[fila.fim] = p;
  fila.fim = (fila.fim + 1) % fila.tam;
}

