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

#include <stdlib.h>

typedef int bool;


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


/* definizione del tipo lista */

struct nodoLista {
  TipoElemCoda info;
  struct nodoLista *next;
};
typedef struct nodoLista NodoLista;
typedef NodoLista *TipoLista;


/* definizione del tipo coda */

struct tipoCoda {
  TipoLista primo, ultimo;
};
typedef struct tipoCoda TipoCoda;


/* implementazione delle operazioni primitive sulle code */

void InitCoda(TipoCoda *pc)
  /* Inizializza la coda *pc ponendo a NULL i puntatori al primo e
     all'ultimo elemento della coda. */
{
  (*pc).primo = NULL;
  (*pc).ultimo = NULL;
}  /* InitCoda */



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



void InizioCoda(TipoCoda c, TipoElemCoda *pv)
  /* Restituisce in *pv il primo elemento della coda c senza modificare c. */
{
  if (c.primo == NULL)
    printf("ERRORE: elemento affiorante di coda vuota\n");
  else
    *pv = c.primo->info;
}  /* InizioCoda */



void InCoda(TipoCoda *pc, TipoElemCoda v)
  /* Inserisce l'elemento v all'ultimo posto della coda c. */
{
  if (TestCodaVuota(*pc)) {
    /* *pc e` vuota: l'elemento da inserire sara` sia il primo che l'ultimo
       elemento della coda */
    (*pc).primo = malloc(sizeof(NodoLista));
    (*pc).ultimo = (*pc).primo;
  } else {
    (*pc).ultimo->next = malloc(sizeof(NodoLista));
    (*pc).ultimo = (*pc).ultimo->next;
  }
  (*pc).ultimo->info = v;
  (*pc).ultimo->next = NULL;
}  /* InCoda */



void OutCoda(TipoCoda *pc, TipoElemCoda *pv)
  /* Elimina il primo nodo della coda *pc, restituendone il valore in *pv. */
{
  TipoLista paux;

  InizioCoda(*pc, pv);         /* copia il valore del primo elemento di *pc in v
                                 (se esiste) */

  if ((*pc).primo != NULL) {             /* elimina il primo elemento di *pc */
    paux = (*pc).primo;
    (*pc).primo = (*pc).primo->next;
    free(paux);
  }
           /* se l'elemento eliminato era l'unico elemento presente nella coda,
              allora si pone a NULL anche il puntatore all'ultimo elemento */
  if ((*pc).primo == NULL)
    (*pc).ultimo = NULL;
}  /* OutCoda */