Program P124;
 { Crearea şi prelucrarea unei liste unidirecţionale }
type AdresaCelula=^Celula;
     Celula=record
                  Info : string;
                   Urm : AdresaCelula;
            end;
var P : AdresaCelula;  { adresa da bază }
    c : char;

procedure Creare;
var R, V : AdresaCelula;
begin
 if P<>nil then writeln('Lista există deja')
   else begin
          writeln('Daţi lista:');
          while not eof do
            begin
              new(R);
              readln(R^.Info);
              R^.Urm:=nil;
              if P=nil then begin P:=R; V:=R end
                       else begin V^.Urm:=R; V:=R end;
            end;
        end;
end; { Creare }

procedure Afis;
var R : AdresaCelula;
begin
 if P=nil then writeln('Lista este vidă')
          else begin
                 writeln('Lista curentă:');
                 R:=P;
                 while R<>nil do begin
                                   writeln(R^.Info);
                                   R:=R^.Urm;
                                 end;
               end;
 readln;
end; { Afis }

procedure Includ;
label 1;
var Q, R : AdresaCelula;
   Cheie : string;
begin
  new(Q);
  writeln('Daţi elementul ce urmează sň fie inclus:');
  readln(Q^.Info);
  writeln('Indicaţi elementul după care se va face includerea:');
  readln(Cheie);
  R:=P;
  while R<>nil do
    begin
      if R^.Info=Cheie then goto 1;
      R:=R^.Urm;
    end;
1:if R=nil then begin
                  writeln('Element inexistent');
                  dispose(Q);
                end
           else begin
                  Q^.Urm:=R^.Urm;
                  R^.Urm:=Q;
                end;
end; { Includ }

procedure Exclud;
label 1;
var Q, R : AdresaCelula;
   Cheie : string;
begin
  writeln('Daţi elementul ce urmează să fie exclus:');
  readln(Cheie);
  R:=P;
  Q:=R;
  while R<>nil do
    begin
      if R^.Info=Cheie then goto 1;
      Q:=R;
      R:=R^.Urm;
    end;
1:if R=nil then writeln('Element inexistent')
           else begin
                  if R=P then P:=R^.Urm else Q^.Urm:=R^.Urm;
                  dispose(R);
                end;
end; { Exclud }

begin
 P:=nil; { iniţial lista este vidă }
 repeat
   writeln('Meniu:');
   writeln('   C - Crearea listei');
   writeln('   I - Includerea elementului');
   writeln('   E - Excluderea elementului');
   writeln('   A - Afişarea listei la ecran');
   writeln('   O - Oprirea programului');
   write('Opţiunea='); readln(c);
   case c of
       'C' : Creare;
       'I' : Includ;
       'E' : Exclud;
       'A' : Afis;
       'O' :
       else writeln('Opţiune necunoscută')
   end;
 until c='O';
end.


end.

