/*
 * Fila_inicio_fim: implementação ligada de filas utilizando
 * apontadores para o início e o final da fila.
 *
 * Observação: o campo final só é válido se a fila tiver pelo menos
 * um elemento.
 */

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

/* Inicia uma instância do tipo fila */
void cria_fila(Fila* ap_fila) {
  ap_fila->inicio = NULL;
}

/* Verifica se a fila está vazia */
int fila_vazia(Fila* ap_fila) {
  return ap_fila->inicio == NULL;
}

/* Insere um elemento na fila */
void insere_fila(Fila* ap_fila, int v) {
  No_fila* p = (No_fila*) malloc(sizeof(No_fila));
  p->v = v;
  p->prox = NULL;
  if (fila_vazia(ap_fila)) 
    ap_fila->inicio = p; 
  else 
    ap_fila->fim->prox = p;
  ap_fila->fim = p;
}

/* Remove um elemento da fila */
int remove_fila(Fila* ap_fila) {
  if (fila_vazia(ap_fila)) {
    printf ("Erro: Fila vazia!\n");
    exit(1);
  }
  else {
    No_fila* p = ap_fila->inicio;
    int v = p->v;
    ap_fila->inicio = ap_fila->inicio->prox;
    free(p);
    return v;
  }
}

/* Descarta todos os elementos da fila */
void libera_fila(Fila* ap_fila) {
  No_fila* p = ap_fila->inicio;
  while (p != NULL) {
    No_fila* q = p;
    p = p->prox;
    free(q);
  }
}