Program P126;
 { Crearea şi parcurgerea unei liste bidirecţionale }
type AdresaCelula=^Celula;
     Celula=record
                  Info : string;
             Urm, Prec : AdresaCelula;
            end;
var P,                 { adresa de bază }
    V : AdresaCelula;  { adresa vîrfului }

procedure Creare;
var R : AdresaCelula;
begin
  P:=nil; V:=nil;
  writeln('Daţi lista:');
  while not eof do
    begin
      new(R);
      readln(R^.Info);
      R^.Prec:=nil;
      R^.Urm:=nil;
      if P=nil then begin P:=R; V:=R end
               else begin V^.Urm:=R; R^.Prec:=V; V:=R end;
      end;
end; { Creare }

procedure Parcurgere;
var R : AdresaCelula;
begin
  writeln('Parcurgere de la bază la vîrf:');
  R:=P;
  while R<>nil do
    begin
      writeln(R^.Info);
      R:=R^.Urm;
    end;
  writeln('Parcurgere de la vîrf la bază:');
  R:=V;
  while R<>nil do
    begin
      writeln(R^.Info);
      R:=R^.Prec;
    end;
  readln;
end; { Parcurgere }

begin
  Creare;
  Parcurgere;
end.

