Program P125;
 { Crearea listei bidirecţionale A<->B<->C<->D }
type AdresaCelula=^Celula;
     Celula=record
                  Info : string;
             Urm, Prec : AdresaCelula;
            end;
var P,         { adresa de bază }
    V,         { adresa vîrfului }
    R : AdresaCelula;
begin

 { 1 - iniţial lista este vidă }
 P:=nil; V:=nil;

 { 2 - adăugarea celulei A }
 new(R);
 P:=R;         { iniţalizarea adresei de bază }
 R^.Info:='A';
 R^.Prec:=nil;
 R^.Urm:=nil;
 V:=R;         { iniţializarea adresei vîrfului }

 { 3 - adăugarea celulei B }
 new(R);
 R^.Info:='B';
 R^.Prec:=V;   { crearea legăturii B -> A }
 R^.Urm:=nil;
 V^.Urm:=R;    { crearea legăturii A -> B }
 V:=R;         { actualizarea adresei vîrfului }

 { 4 - adăugarea celulei C }
 new(R);
 R^.Info:='C';
 R^.Prec:=V;    { crearea legăturii C -> B }
 R^.Urm:=nil;
 V^.Urm:=R;     { crearea legăturii B -> C }
 V:=R;          { actualizarea adresei vîrfului }

 { 5 - adăugarea celulei D }
 new(R);
 R^.Info:='D';
 R^.Prec:=V;    { crearea legăturii D -> C}
 R^.Urm:=nil;
 V^.Urm:=R;     { crearea legăturii C -> D }
 V:=R;          { actualizarea adresei vîrfului }

 { afişarea listei create }
 R:=P;
 while R<>nil do begin
                   writeln(R^.Info);
                   R:=R^.Urm
                 end;
 readln;
end.
