{ prima di includere questo file si deve dichiarare:
  (i)  la lunghezza massima della coda;
  (ii) il tipo degli elementi da inserire nella coda.
  Questo viene realizzato mediante le seguenti dichiarazioni:

const
  MaxCoda = ...;
type
  TipoElemCoda = ...; 
}

{ dichiarazioni di tipo }

type
  TipoPosCoda = 0..MaxCoda;
  TipoCoda    = record
                  coda          : array [1..MaxCoda] of TipoElemCoda;
                  primo, ultimo : TipoPosCoda
                end;


{ implementazione delle operazioni primitive sulle code }

procedure InitCoda (var c: TipoCoda);
{ inizializza la coda c ponendo a 0 i puntatori al primo e
  all'ultimo elemento della coda }
begin
  c.primo := 0;
  c.ultimo := 0
end; { InitCoda }


function TestCodaVuota (c: TipoCoda): boolean;
{ restituisce TRUE se la coda c e' vuota, FALSE altrimenti }
begin
  TestCodaVuota := (c.primo = 0)
end; { TestCodaVuota }


procedure InizioCoda (c: TipoCoda; var v: TipoElemCoda);
{ restituisce in v il primo elemento della coda c senza modificare c }
begin
  if TestCodaVuota(c) then
    writeln('ERRORE: CODA VUOTA')
  else
    v := c.coda[c.primo]
end; { InizioCoda }


function TestCodaPiena (c: TipoCoda): boolean;
{ restituisce TRUE se la coda c e' piena, FALSE altrimenti }
begin
  TestCodaPiena := (c.primo - (c.ultimo mod MaxCoda) = 1)
end; { TestCodaPiena }


procedure InCoda (var c: TipoCoda; v: TipoElemCoda);
{ inserisce l'elemento v all'ultimo posto della coda c }
begin
  if TestCodaPiena(c) then
    writeln('ERRORE: CODA PIENA')
  else
    with c do
    begin
      { posizionamento indice ultimo alla prossima posizione libera }
      if primo = 0 then { c vuota: l'elemento da inserire sara' sia
                          il primo che l'ultimo elemento di c }
      begin
        ultimo := 1;
        primo := 1
      end
      else { c non vuota: cambia solo il puntatore all'ultimo elemento }
        if ultimo = MaxCoda then { la prossima posizione libera del
                                   vettore e' la prima }
          ultimo := 1
        else { la prossima posizione libera del vettore e' la successiva }
          ultimo := ultimo + 1;
      { assegnazione di v all'ultimo elemento della coda }
      coda[ultimo] := v
    end
end; { InCoda }


procedure OutCoda (var c: TipoCoda; var v: TipoElemCoda);
{ elimina il primo record della coda c, restituendone il valore in v }
begin
  if TestCodaVuota(c) then
    writeln('ERRORE: CODA VUOTA')
  else
    with c do
    begin
      v := coda[primo];
      { se l'elemento eliminato era l'unico elemento presente nella coda,
        allora si pone a NIL anche il puntatore all'ultimo elemento }
      if primo = ultimo then
      begin
        ultimo := 0;
        primo := 0
      end
      else 
        if primo = MaxCoda then { il prossimo elemento in cima alla coda
                                  si trova in posizione 1 }
          primo := 1
        else { il prossimo elemento in cima alla coda
               si trova nella posizione successiva }
          primo := primo + 1
    end
end; { OutCoda }