PROGRAM Lista_puntatori; uses wincrt; Type tipoelem=integer; punt_cella= ^cella; cella= RECORD elemento:tipoelem; successivo: punt_cella; END; lista=punt_cella; posizione= punt_cella; PROCEDURE CREALISTA(VAR L:lista); BEGIN L:=nil; END; FUNCTION FINELISTA(p:posizione; VAR L:lista):boolean; BEGIN IF p=nil THEN FINELISTA:=(L=nil) ELSE FINELISTA:=(p^.successivo=nil); END; FUNCTION LISTAVUOTA(VAR L:lista):boolean; BEGIN LISTAVUOTA:= (L=nil) END; FUNCTION LEGGILISTA(p:posizione; VAR L:lista): tipoelem; BEGIN IF NOT FINELISTA(p,L) THEN IF p=nil THEN LEGGILISTA:=L^.elemento ELSE LEGGILISTA:=p^.successivo^.elemento END; PROCEDURE SCRIVILISTA(a: tipoelem; p:posizione; VAR L:lista); BEGIN IF not FINELISTA(p,L) THEN IF p=nil THEN L^.elemento:=a ELSE p^.successivo^.elemento:=a END; FUNCTION PRIMOLISTA(VAR L:lista):posizione; BEGIN PRIMOLISTA := nil; END; FUNCTION SUCCLISTA(p:posizione; VAR L:lista):posizione; BEGIN IF not FINELISTA(p,L) THEN IF p=nil THEN SUCCLISTA:=L ELSE SUCCLISTA:=p^.successivo; END; FUNCTION PREDLISTA(p:posizione; VAR L:lista):posizione; VAR q:posizione; BEGIN IF p<>nil THEN IF p=L THEN PREDLISTA:=nil ELSE BEGIN q:=L; WHILE q^.successivo <> p DO q:=p^.successivo; PREDLISTA:=q END; END; PROCEDURE INSLISTA(a:tipoelem; p:posizione; VAR L:lista); VAR temp:posizione; BEGIN IF p=nil THEN BEGIN temp:=L; new(L); L^.successivo:=temp; L^.elemento:=a END ELSE BEGIN temp:=p^.successivo; new(p^.successivo); p^.successivo^.successivo:=temp; p^.successivo^.elemento:=a; END; END; PROCEDURE CANCLISTA(p:posizione; VAR L:lista); VAR cancellato:posizione; BEGIN IF not FINELISTA(p,L) THEN BEGIN IF p=nil THEN BEGIN cancellato:=L; L:=L^.successivo END ELSE BEGIN cancellato:=p^.successivo; p^.successivo:=p^.successivo^.successivo END; IF NOT (cancellato=nil) THEN dispose(cancellato); END; END; var mialista:lista; elemento, cercato:tipoelem; pos,pos1:posizione; begin crealista(mialista); pos:=primolista(mialista); writeln('Inserisci gli elementi della lista (-1 per terminare):'); repeat readln(elemento); if (elemento<>-1) then begin inslista(elemento, pos, mialista); pos:=succlista(pos,mialista); end; until (elemento=-1); writeln('VISUALIZZAZIONE LISTA:'); pos:=primolista(mialista); while not finelista(pos, mialista) do begin write(leggilista(pos,mialista):5); pos:=succlista(pos,mialista); end; writeln; writeln('Inserire il numero da cancellare nella lista: '); readln(cercato); pos:=primolista(mialista); while not (finelista(pos, mialista)) do begin elemento:=leggilista(pos, mialista); if elemento=cercato then canclista(pos, mialista) else pos:=succlista(pos,mialista); end; writeln('VISUALIZZAZIONE LISTA:'); pos:=primolista(mialista); while not finelista(pos, mialista) do begin write(leggilista(pos,mialista):5); pos:=succlista(pos,mialista); end; writeln; writeln; writeln('Cancellazione totale della lista'); pos:=primolista(mialista); while not (finelista(pos, mialista)) do begin canclista(pos, mialista) end; if listavuota(mialista) then writeln('Lista cancellata con successo.'); end.