{ Terreno Antonio mat.9714216 }

unit
   listeit;

interface

type
   tipo_elemento=integer;
   tipo_lista=^cella;
   cella= record
             element:tipo_elemento;
        next:tipo_lista
          end;

   procedure inserisci_in_coda_it( x : tipo_elemento; var L : tipo_lista);
   function cerca_elemento_it(x : tipo_elemento; L : tipo_lista ) : boolean;
   procedure cancella_elemento_it( x : tipo_elemento ; var L : tipo_lista);
   procedure appendi_it (var L: tipo_lista; M: tipo_lista);
   function prefix_it(L,M: tipo_lista) : boolean;
   procedure Stampa_it(l : tipo_lista);
implementation

procedure inserisci_in_coda_it( x : tipo_elemento; var L : tipo_lista);
{ inserisce in coda ad L x }
var
   prec, p, tmp : tipo_lista;
begin
   p := l;
   while (p <> nil) do
      begin
         prec := p;
         p := p^.next
      end;
   new(tmp);
   tmp^.element := x;
   tmp^.next := nil;
   prec^.next := tmp;
end;


function cerca_elemento_it(x : tipo_elemento; L : tipo_lista ) : boolean;
{ true se x e' in L }
var
   trovato : boolean;
begin
   trovato := false;
   while (L <> nil) and (not trovato) do
      begin
         trovato := (L^.element = x);
    L := L^.next
      end;
   cerca_elemento_it:= trovato
end;

procedure cancella_elemento_it( x : tipo_elemento ; var L : tipo_lista);
{ cancella la prima occorenza di x da L }
var
   prec, p, tmp :tipo_lista;
begin
   p := L;
   while (p <> nil) and (p^.element <> x) do
      begin
         prec := p ;
         p := p^.next
      end;
   if (p <> nil) then
      begin
         prec^.next := p^.next;
         p := prec^.next
      end
end;

procedure inserisci_in_testa(x:tipo_elemento;var L:tipo_lista);
{ inserisce in testa ad L x }
var
   M:tipo_lista;
begin
   new(M);
   M^.element:=x;
   M^.next:=L;
   L:=M;
end;

procedure inverti_lista_it(var L : tipo_lista ) ;
{ inverte la lista }
var
   M : tipo_lista;
begin
   M := nil;
   while (L<>nil) do
      begin
         inserisci_in_testa(L^.element,M);
    L:=L^.next
      end;
   L:=M;
end;


function prefix_it(L,M: tipo_lista) : boolean;
{ true se L e' un prefisso di M }
var
   uguali : boolean;
begin
   uguali := true;
   while ((L<>nil) and (M<>nil) and (uguali)) do
      begin
         uguali := (L^.element = M^.element);
    L := L^.next;
    M := M^.next;
      end;
   prefix_it := (uguali and (L = nil))
end;

procedure appendi_it(var L: tipo_lista; M: tipo_lista);
{ "aggancia a L la lista M }
var
   prec, p : tipo_lista;
begin
   if (L = nil) then
      L := M
  else
     begin
        p := L;
        while (p <> nil) do
           begin
              prec := p;
              p := p^.next
           end;
        prec^.next := M;
        p := prec^.next
     end
end;

procedure Stampa_it(l : tipo_lista);
{ stampa a video la lista l }
begin
   while (l<>nil) do
      begin
         write(l^.element,' ');
         l:=l^.next
      end
end;

end.