Program P135;
 { Gestionarea memoriei interne }
type Lista=^Celula;
     Celula=record
                  Info : string;
                   Urm : Lista
            end;
     Stiva=Lista;
     Arbore=^Nod;
     Nod=record
               Info : string;
            Stg, Dr : Arbore
         end;
var L : Lista;
    S : Stiva;
    T : Arbore;
    p : pointer;

function Lst : Lista;
 { crearea listei unidirecţionale }
var R : Lista;
    s : string;
begin
 write('Info='); readln(s);
 if s='' then Lst:=nil
    else
        begin
          new(R);
          R^.Info:=s;
          R^.Urm:=Lst;
          Lst:=R;
        end;
end; { Lst }

procedure AfisLst(L : Lista);
 { afişarea listei }
begin
 if L<>nil then
    begin
      writeln(L^.Info);
      AfisLst(L^.Urm);
    end;
end; { AfisLst }

procedure Stv(var S : Stiva);
 { crearea unei stive }
var R : Stiva;
   st : string;
begin
 S:=nil;
 write('Info='); readln(st);
 while st<>'' do
       begin
         new(R);
         R^.Info:=st;
         R^.Urm:=S;
         S:=R;
         write('Info='); readln(st);
       end;
end; { Stv }

function Arb : Arbore;
 { crearea arborelui binar }
var R : Arbore;
    s : string;
begin
 readln(s);
 if s='' then Arb:=nil
    else begin
          new(R);
          R^.Info:=s;
          writeln('Daţi descendentul stîng al nodului ', s, ':');
          R^.Stg:=Arb;
          writeln('Daţi descendentul drept al nodului ', s, ':');
          R^.Dr:=Arb;
          Arb:=R;
         end;
end; { Arb }

procedure AfisArb(T : Arbore; nivel : integer);
 { afişarea arborelui binar }
var i : integer;
begin
 if T<>nil then
    begin
     AfisArb(T^.Stg, nivel+1);
     for i:=1 to nivel do write('    '); writeln(T^.Info);
     AfisArb(T^.Dr, nivel+1);
    end;
end; { AfisareArb }

begin
 writeln('Daţi lista:');
 L:=Lst;
 writeln('Lista creată:');
 AfisLst(L);
 mark(p);    { p reţine adresa din HeapPtr }
 writeln('Daţi rădăcina:');
 T:=Arb;
 writeln('Arborele creat:');
 AfisArb(T, 0);
 release(p); { eliberarea memoriei ocupate de arbore }
 writeln('Daţi stiva:');
 Stv(S);
 writeln('Stiva creată');
 AfisLst(S);
 release(HeapOrg); { eliberarea memoriei ocupate de listă şi stivă }
 readln;
end.




