{ File: code.pas }

{ Scopo: rappresentazione collegata di code }

{ prima di includere questo file si deve dichiarare il tipo degli
  elementi da inserire nella pila, mediante una dichiarazione

type
  TipoElemCoda = ...;
}

{ dichiarazioni di tipo }

type
  TipoElemLista = TipoElemCoda;

{$I TIPOLIS.PAS} { inclusione del file contenente la definizione del tipo
                   TipoLista }

  TipoCoda = record
               primo, ultimo : TipoLista
             end;

{$I LISTE.PAS}   { inclusione del file contenente l'implementazione delle
                   operazioni primitive sulle liste }


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


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


procedure InizioCoda (c: TipoCoda; var v: TipoElemCoda);
{ restituisce in v il primo elemento della coda c senza modificare c }
begin
  TestaLista(c.primo,v)
end; { InizioCoda }


procedure InCoda (var c: TipoCoda; v: TipoElemCoda);
{ inserisce l'elemento v all'ultimo posto della coda c }
begin
  if TestCodaVuota(c) then       { c e' vuota: l'elemento da inserire sara' sia
                                   il primo che l'ultimo elemento della coda }
  begin
    new(c.primo);
    c.ultimo := c.primo
  end
  else
  begin
    new(c.ultimo^.next);
    c.ultimo := c.ultimo^.next
  end;
  c.ultimo^.info := v;
  c.ultimo^.next := nil
end; { InCoda }


procedure OutCoda (var c: TipoCoda; var v: TipoElemCoda);
{ elimina il primo record della coda c, restituendone il valore in v }
begin
  InizioCoda(c,v); { copia il valore del primo elemento di c in v (se esiste) }
  CancellaPrimoLista(c.primo);   { elimina il primo elemento di c (se esiste) }
           { se l'elemento eliminato era l'unico elemento presente nella coda,
             allora si pone a NIL anche il puntatore all'ultimo elemento }
  if c.primo = NIL then
    c.ultimo := NIL
end; { OutCoda }