/* File: codeseq.c */
/* Time-stamp: "2002-05-17 00:26:58 calvanes" */
/* Scopo: rappresentazione sequenziale delle code */

typedef int bool;

#define MaxCoda 10

/* Richiede di dichiarare il tipo degli elementi della coda */
/* typedef int TipoElemCoda; */


/* definizione del tipo coda */

struct tipoCoda {
  TipoElemCoda coda[MaxCoda];
  int primo, ultimo;
};
typedef struct tipoCoda TipoCoda;



/* implementazione delle operazioni primitive sulle code */

void InitCoda(TipoCoda *pc)
  /* Inizializza la coda *pc ponendo a -1 gli indici al primo e all'ultimo
     elemento della coda. */
{
  (*pc).primo = -1;
  (*pc).ultimo = -1;
}  /* InitCoda */



bool TestCodaVuota(TipoCoda c)
  /* Restituisce TRUE se la coda c e' vuota, FALSE altrimenti. */
{
  return (c.primo == -1);
}  /* TestCodaVuota */



void InizioCoda(TipoCoda c, TipoElemCoda *pv)
  /* Restituisce in *pv il primo elemento della coda c senza modificare c. */
{
  if (TestCodaVuota(c))
    printf("ERRORE: CODA VUOTA\n");
  else
    *pv = c.coda[c.primo];
}  /* InizioCoda */



bool TestCodaPiena(TipoCoda c)
  /* Restituisce TRUE se la coda c e` piena, FALSE altrimenti. */
{
  return ((c.primo - c.ultimo == 1) || ((c.ultimo - c.primo) == (MaxCoda-1)));
}  /* TestCodaPiena */



void InCoda(TipoCoda *pc, TipoElemCoda v)
  /* Inserisce l'elemento v all'ultimo posto della coda *pc. */
{
  if (TestCodaPiena(*pc))
    printf("ERRORE: CODA PIENA\n");
  else {      /* posizionamento indice ultimo alla prossima posizione libera */
    if ((*pc).primo == -1) {    /* coda vuota: l'elemento da inserire sara` sia
                                   il primo che l'ultimo elemento della coda */
      (*pc).ultimo = 0;
      (*pc).primo = 0;
    } else   /* coda non vuota: cambia solo il puntatore all'ultimo elemento */
      (*pc).ultimo = ((*pc).ultimo + 1) % MaxCoda;

                         /* assegnazione di v all'ultimo elemento della coda */
    (*pc).coda[(*pc).ultimo] = v;
  }
}  /* InCoda */



void OutCoda(TipoCoda *pc, TipoElemCoda *pv)
  /* Elimina il primo elemento della coda *pc, restituendone il valore in *pv.
   */
{
  if (TestCodaVuota(*pc))
    printf("ERRORE: CODA VUOTA\n");
  else {
    *pv = (*pc).coda[(*pc).primo];
           /* se l'elemento eliminato era l'unico elemento presente nella coda,
              allora si pone a -1 anche il puntatore all'ultimo elemento */
    if ((*pc).primo == (*pc).ultimo) {
      (*pc).ultimo = -1;
      (*pc).primo = -1;
    }
    else       /* coda non vuota: cambia solo il puntatore al primo elemento */
      (*pc).primo = ((*pc).primo + 1) % MaxCoda;
  }
}  /* OutCoda */