unit FIFO; (* files d'attentes ou queues *)

INTERFACE

type TDonnee = Integer;

type PQueue = ^Cellule;
     Cellule = record
                 nb:TDonnee;
                 next:PQueue;
               end;

procedure init_queue(var head,tail:PQueue); (* initialise la queue *)

procedure entrer_elem(var head:PQueue;var tail:PQueue;item:TDonnee);
(* entre un élément 'item' dans la file d'attente *)

procedure sortir_elem(var head:PQueue;var tail:PQueue;var item:TDonnee;var flag:boolean);
(* ressort le prochain élément de la fine d'attente dans la variable item.
Le flag est true si l'opération c'est bien déroulée (autrement dit, s'il y
avait encore du monde dans la file ;-) *)

IMPLEMENTATION

procedure init_queue(var head,tail:PQueue);
begin
  head:=nil;         (* conventions conventions... *)
  tail:=nil;
end;

procedure entrer_elem(var head:PQueue;var tail:PQueue;item:TDonnee);
var ptr:PQueue;
begin
  new(ptr);                      (* création... *)
  ptr^.nb:=item;                 (* ...et remplissage... *)
  ptr^.next:=nil;                (* ...de la nouvelle cellule *)
  if head=nil              (* si c'est le premier de la file... *)
    then head:=ptr
    else tail^.next:=ptr;
  tail:=ptr;
end;

procedure sortir_elem(var head:PQueue;var tail:PQueue;var item:TDonnee;var flag:boolean);
var ptr:PQueue;
begin
  if head=nil                (* si la file est vide *)
    then flag:=false      (* on signale qu'on ne peut rien sortir *)
    else begin           (* SINON *)
           flag:=true;    (* on signale que ça marche *)
           ptr:=head;            (* on découpe... *)
           head:=head^.next;      (* ...on recolle *)
           item:=ptr^.nb;       (* on sort le contenu dans une variable *)
           dispose(ptr);         (* et on fait du ménage... *)
         end;
end;

END.


