Program P128;
 { Crearea şi prelucrarea unei cozi }
type AdresaCelula=^Celula;
     Celula=record
                  Info : string;
                   Urm : AdresaCelula;
            end;
var P,                { adresa primului element }
    U : AdresaCelula; { adresa ultimului element }
    c : char;

procedure Introduc;
var R : AdresaCelula;
begin
 new(R);
 writeln('Daţi elementul ce urmează să fie introdus:');
 readln(R^.Info);
 R^.Urm:=nil;
 if P=nil then begin P:=R; U:=R end
          else begin U^.Urm:=R; U:=R end;
end; { Introduc }

procedure Extrag;
var R : AdresaCelula;
begin
 if P=nil then writeln('Coada este vidă')
          else begin
                 R:=P;
                 writeln('Este extras elementul:');
                 writeln(R^.Info);
                 P:=P^.Urm;
                 dispose(R);
               end;
end; { Extrag }

procedure Afis;
var R : AdresaCelula;
begin
 if P=nil then writeln('Coada este vidă')
          else begin
                 writeln('Coada include elementele:');
                 R:=P;
                 while R<>nil do begin
                                   writeln(R^.Info);
                                   R:=R^.Urm;
                                 end;
               end;
 readln;
end; { Afis }

begin
 P:=nil; U:=nil; { iniţial coada este vidă }
 repeat
   writeln('Meniu:');
   writeln('   I - Introducerea elementului;');
   writeln('   E - Extragerea elementului;');
   writeln('   A - Afişarea cozii la ecran;');
   writeln('   O - Oprirea programului');
   write('Opţiunea='); readln(c);
   case c of
       'I' : Introduc;
       'E' : Extrag;
       'A' : Afis;
       'O' :
       else writeln('Opţiune necunoscută')
   end;
 until c='O';
end.