{Scrieti o functie nerecursiva care returneaza adresa varfului listei unidirectionale.
 Transcrieti aceasta functie intr-o forma recursiva.}
unit U2_4_2;

interface
type AdresaCelula = ^Celula;
     Celula = record  {O celula din AdresaCelula}
       Info: String;  {Continutul celulei}
       Urm:  AdresaCelula;  {Adresa urmatoarei celule}
     end;

var P: AdresaCelula;  {Lista}

procedure Includ;
procedure Exclud;

implementation
procedure Includ;
var Q, R: AdresaCelula;
    Cheie: String;
begin
  new(Q);
  writeln('Dati elementul ce urmeaza sa fie inclus:');
  readln(Q^.Info);
  writeln('Indicati elementul dupa care se va face includerea:');
  readln(Cheie);
  R := P;
  while R<>nil do
  begin
    if R^.Info = Cheie then begin
      Q^.Urm := R^.Urm;  {Urm al lui Q devine Urm al lui R}
      R^.Urm := Q;       {Iar Q devine Urm al lui R}
      Q := nil;          {Elementul Q a fost inclus in lista}
      Break;             {Sfarsitul ciclului}
    end else
      R := R^.Urm;
  end;

  if Q<>nil then begin
    writeln('Element inexistent');
    dispose(Q);
  end;
end; {Includ}

procedure Exclud;
var Q, R: AdresaCelula;
    Cheie: String;
begin
  new(Q);
  writeln('Dati elementul ce urmeaza sa fie exclus:');
  readln(Cheie);
  R := P;
  Q := R;
  while R<>nil do
  begin
    if R^.Info = Cheie then begin
      if R = P then  P      := R^.Urm   {Se exclude primul element din lista}
               else  Q^.Urm := R^.Urm;  {Se exclude elementul R}
      dispose(R);    {Elementul R a fost exclus din lista}
      Q := nil;      {R a fost exclus}
      Break;         {Sfarsitul ciclului}
    end;
    Q := R;      {Elementul precedent}
    R := R^.Urm; {Elementul curent}
  end;

  if Q<>nil then  writeln('Element inexistent');
end; {Exclud}

end.