(* OP_LISTANUM.PAS *) (* Programma per elaborazioni con lista concatenata *) (* doppia di numeri longint. *) (* *) (* Autore: Corrado Damiano *) (* Data ultima versione: 16-6-2026 *) program op_listanum; uses crt, lib_listanum; (*--------------------------------*) var (* oggetto gestore di lista *) G_lista: gestore_lista_num; (* numero massimo di nodi inseribili in lista *) n_max_nodi: longint; (* numeri visualizzati in una singola riga *) numeri_riga: longint; (* nuovo valore da assegnare a numeri_riga *) numeri_riga_nuovo: longint; (* puntatore a nodo estratto dalla lista *) p_tolto: p_nodo_num; (* numero da inserire, cercare, cancellare *) numero: longint; (* numero di nodi cancellati *) n_canc: longint; (* numero di nodi trovati *) n_trovati: longint; (* posizione di nodo da esaminare *) posiz: longint; (* esito operazione *) ok: boolean; (* indicatore ordinamento lista *) tipo_ord: byte; (* valori minimo emassimo presenti in lista *) num_min, num_max: longint; (* numero di nodi con numeri casuali da mettere in lista *) num_nodi_cas: longint; (* valore massimo di un numero casuale *) max_casuale: longint; (* var. per ciclo di elaborazione *) continua: boolean; (* opzione scelta dall'utente *) opz: byte; (*--------------------------------*) function menu_scelta(n_max_nodi: longint): byte; var opzione: byte; begin writeln('-------------------------------------------'); writeln('OPERAZIONI SU LISTA DI NUMERI (max nodi ', n_max_nodi, ')'); writeln('Cambia numeri mostrati in ogni riga.......1'); writeln('Metti in lista vuota numeri casuali.......2'); writeln('Metti numero inizio.......................3'); writeln('Metti numero fine.........................4'); writeln('Metti in ordine senza ripetizioni.........5'); writeln('Metti in ordine con ripetizioni...........6'); writeln('Cancella numero...........................7'); writeln('Cancella numeri ripetuti..................8'); writeln('Estrai primo numero.......................9'); writeln('Estrai ultimo numero.....................10'); writeln('Verifica ordinamento.....................11'); writeln('Cerca numero.............................12'); writeln('Mostra numero ennesimo...................13'); writeln('Cerca minimo e massimo...................14'); writeln('Ordina lista.............................15'); writeln('Inverti lista............................16'); writeln('Svuota lista.............................17'); writeln('Uscita dal programma.....................18'); writeln; write('Scegliere operazione: '); readln(opzione); menu_scelta := opzione; end; (* fine menu_scelta *) procedure premi_tasto; begin writeln; writeln('Premere un tasto per continuare...'); readkey; end; (*--------------------------------*) begin n_max_nodi := 1000; G_lista.iniz('Lista', n_max_nodi); (* quantita' di numeri visualizzati su una riga dal metodo mostra; *) (* con l'opzione 1 l'utente puo' cambiare questo valore *) numeri_riga := 10; randomize; continua := true; while continua = true do begin opz := menu_scelta(n_max_nodi); (* cambio quantita' di numeri da visualizzare in una riga *) if opz = 1 then begin writeln; writeln('Cambio numeri per riga (valore attuale: ', numeri_riga, ')'); writeln; write('Numeri da visualizzare in una riga [1-100]: '); readln(numeri_riga_nuovo); writeln; if (numeri_riga_nuovo >= 1) and (numeri_riga_nuovo <= 100) then begin numeri_riga := numeri_riga_nuovo; G_lista.mostra(numeri_riga); end else begin writeln('Valore ', numeri_riga_nuovo, ' non ammesso'); end; premi_tasto; end; (* inserimento in lista vuota di numeri casuali *) if opz = 2 then begin writeln; writeln('Inserimento in lista vuota di numeri casuali'); G_lista.mostra(numeri_riga); if G_lista.leggi_n_nodi = 0 then begin write('Nodi da mettere in lista: '); readln(num_nodi_cas); writeln; write('Valore massimo di un numero casuale: '); readln(max_casuale); G_lista.metti_numeri_cas(num_nodi_cas, max_casuale); G_lista.mostra(numeri_riga); end else begin writeln; writeln('Operazione non ammessa, la lista deve essere vuota'); end; premi_tasto; end; (* inserimento numero a inizio lista *) if opz = 3 then begin writeln; writeln('Inserimento numero a inizio lista'); G_lista.mostra(numeri_riga); write('Numero da mettere a inizio lista: '); readln(numero); G_lista.metti_inizio(numero); G_lista.mostra(numeri_riga); premi_tasto; end; (* inserimento numero a fine lista *) if opz = 4 then begin writeln; writeln('Inserimento numero a fine lista'); G_lista.mostra(numeri_riga); write('Numero da mettere a fine lista: '); readln(numero); G_lista.metti_fine(numero); G_lista.mostra(numeri_riga); premi_tasto; end; (* inserimento in ordine senza ripetizioni *) if opz = 5 then begin writeln; writeln('Inserimento numero in ordine senza ripetizioni'); G_lista.mostra(numeri_riga); tipo_ord := G_lista.calcola_tipo_ordine; (* l'operazione viene fatta solo se la lista *) (* e' ordinata senza ripetizioni, cosa che dipende *) (* dalle operazioni precedenti *) if tipo_ord = 1 then begin write('Numero da mettere in lista: '); readln(numero); G_lista.metti_ord_1(numero); G_lista.mostra(numeri_riga); end else begin writeln('Operazione non ammessa'); end; premi_tasto; end; (* inserimento in ordine con ripetizioni *) if opz = 6 then begin writeln; writeln('Inserimento numero in ordine con ripetizioni'); G_lista.mostra(numeri_riga); tipo_ord := G_lista.calcola_tipo_ordine; (* l'operazione e' ammessa solo se la lista e' ordinata, *) (* senza/con ripetizioni *) if (tipo_ord = 1) or (tipo_ord = 2) then begin write('Numero da mettere in lista: '); readln(numero); G_lista.metti_ord_2(numero); G_lista.mostra(numeri_riga); end else begin writeln('Operazione non ammessa'); end; premi_tasto; end; (* cancellazione numero *) if opz = 7 then begin writeln; writeln('Cancellazione numero'); G_lista.mostra(numeri_riga); write('Numero da cancellare: '); readln(numero); n_canc := G_lista.cancella_num(numero); G_lista.mostra(numeri_riga); writeln('Nodi cancellati: ', n_canc); premi_tasto; end; (* cancellazione numeri ripetuti *) if opz = 8 then begin writeln; writeln('Cancellazione numeri ripetuti'); G_lista.mostra(numeri_riga); n_canc := G_lista.cancella_ripetiz; G_lista.mostra(numeri_riga); writeln('Nodi cancellati: ', n_canc); premi_tasto; end; (* estrazione primo numero *) if opz = 9 then begin writeln; writeln('Estrazione primo numero'); G_lista.mostra(numeri_riga); p_tolto := G_lista.estraz_primo; if p_tolto <> nil then begin writeln('Numero estratto dalla lista: ', p_tolto^.num); G_lista.mostra(numeri_riga); dispose(p_tolto); p_tolto := nil; end else begin writeln('Estrazione non ammessa'); end; premi_tasto; end; (* estrazione ultimo numero *) if opz = 10 then begin writeln; writeln('Estrazione ultimo numero'); G_lista.mostra(numeri_riga); p_tolto := G_lista.estraz_ultimo; if p_tolto <> nil then begin writeln('Numero estratto dalla lista: ', p_tolto^.num); G_lista.mostra(numeri_riga); dispose(p_tolto); p_tolto := nil; end else begin writeln('Estrazione non ammessa'); end; premi_tasto; end; (* verifica ordinamento *) if opz = 11 then begin writeln; writeln('Verifica ordinamento'); G_lista.mostra(numeri_riga); tipo_ord := G_lista.calcola_tipo_ordine; if tipo_ord = 0 then begin writeln('Lista non ordinata (tipo 0)'); end; if tipo_ord = 1 then begin writeln('Lista ordinata senza ripetizioni (tipo 1)'); end; if tipo_ord = 2 then begin writeln('Lista ordinata con ripetizioni (tipo 2)'); end; premi_tasto; end; (* ricerca di numero in lista *) if opz = 12 then begin writeln; writeln('Ricerca numero'); G_lista.mostra(numeri_riga); write('Numero da cercare in lista: '); readln(numero); n_trovati := G_lista.conta_num(numero); writeln; writeln('Occorrenze di ', numero, ' trovate: ', n_trovati); premi_tasto; end; (* lettura di numero ennesimo *) if opz = 13 then begin writeln; writeln('Lettura numero ennesimo'); G_lista.mostra(numeri_riga); write('Posizione numero da mostrare: '); readln(posiz); ok := G_lista.leggi_num_posiz(posiz, @numero); writeln; if ok = true then begin writeln('Numero in posizione ', posiz, ': ', numero); end else begin writeln('Nodo in posizione ', posiz, ' inesistente'); end; premi_tasto; end; (* ricerca numeri minimo e massimo *) if opz = 14 then begin writeln; writeln('Ricerca numeri minimo e massimo'); G_lista.mostra(numeri_riga); ok := G_lista.cerca_min_max(@num_min, @num_max); if ok = true then begin writeln('Minimo: ', num_min, ' Massimo: ', num_max); end else begin writeln('Ricerca non effettuata'); end; premi_tasto; end; (* ordinamento lista *) if opz = 15 then begin writeln; writeln('Ordinamento lista'); G_lista.mostra(numeri_riga); G_lista.ordina; G_lista.mostra(numeri_riga); premi_tasto; end; (* inversione lista *) if opz = 16 then begin writeln; writeln('Inversione lista'); G_lista.mostra(numeri_riga); G_lista.inverti; G_lista.mostra(numeri_riga); premi_tasto; end; (* svuotamento lista *) if opz = 17 then begin writeln; writeln('Svuotamento lista'); G_lista.mostra(numeri_riga); n_canc := G_lista.svuota; G_lista.mostra(numeri_riga); writeln; writeln('Nodi cancellati: ', n_canc); premi_tasto; end; (* uscita dal programma *) if opz = 18 then begin continua := false; end; end; (* fine ciclo di elaborazione *) G_lista.svuota; writeln('-------------------------------------------'); end. (*--------------------------------*) (*--------------------------------*) (* fine op_listanum.pas *)