/*
 * cola.c
 *
 */
#define __COLA_C

/* Seccion 2.4 de "Estructuras de datos y aloritmos"
 * de Aho, Hopcropft y Ullman
 */

#include <stdio.h>

#include "cola.h"

static int suma_uno( int n )
{
		return (++n) % MAX_ELEMENTOS_EN_COLA;
}

/* convierte c en una cola vacia */
void cola_anula( Cola * c )
{
		c->anterior= 0;
		c->posterior=MAX_ELEMENTOS_EN_COLA-1;
}

/* devuelve el valor del primer elemento de c */
Elem cola_frente( Cola * c )
{
		if (cola_vacia(c)) {
				fprintf(stderr, "cola_frente: la cola esta vacia\n");
				exit(1);
		}

		return c->elementos[c->anterior];
}

/* inserta el elemento x al final de c */
void cola_pone_en_cola( Cola * c, Elem x)
{
		if (suma_uno(suma_uno(c->posterior)) == c->anterior) {
			fprintf(stderr, "cola_pone_en_cola: la cola esta llena\n");
			exit(1);
		}
		c->posterior = suma_uno(c->posterior);
		c->elementos[c->posterior] = x;
}

/* suprime el primer elemento de c */
void cola_quita_de_cola( Cola * c )
{
		if (cola_vacia(c)) {
				fprintf(stderr, "cola_frente: la cola esta vacia\n");
				exit(1);
		}

		c->anterior= suma_uno(c->anterior);
}

/* devuelve verdadero si c es la cola vacia */
boolean cola_vacia( Cola * c )
{
		if (suma_uno(c->posterior) == c->anterior)
				return true;
		else
				return false;
}

/* EOF cola.c */
