Elaborazione di una lista concatenata.

Una lista concatenata offre alcuni vantaggi rispetto agli array

Una lista non ha una dimensione massima, quindi non si ha spreco di spazio inutilizzato o, viceversa, non succede che un elemento non trova posto perché si è esaurito lo spazio. Inoltre in una lista gli elementi possono essere inseriti o eliminati senza alterare la posizione degli altri elementi.

Una lista si definisce concatenata perché ogni elemento contiene il puntatore al successivo elemento. Si supponga che gli elementi contenuti nella lista siano di tipo intero. I metodi di una classe Lista sono:

MetodoOperazioneParametro ricevuto Parametro restituito
Lista ()costruttore senza parametrivoidvoid
Lista costruttore copiaListavoid
~Lista distruttorevoidvoid
Inserisci() Inserisce un elemento in testa alla listaTipo dell'elemento di lista
NumeroElementi()Restituisce il numero degli elementi contenuti nella listavoid int
Svuota()Elimina tutti gli elementi contenuti nella listavoidvoid
Elimina()Elimina il primo elemento della lista, se contenuto, che è uguale a quello specificato Tipo dell'elemento di listavoid
Stampa()Stampa tutti gli elementi contenuti nella listavoidvoid
Ricerca()Indica se un dato elemento è, contenuto nella lista Tipo dell'elemento di listabool

il file Lista.h

Nr.
linea
Commento
3Si dichiara che Record è una struttura.
4, 5Si dichiarano due nuovi tipi, uno è un puntatore a Record, l'altro è un nome associato al tipo intero.
6Dichiarazione della classe Lista.
8, 9Campi privati. primo è un puntatore a una struttura. Conteggio è un intero.
10Si ridefinisce l'operatore di assegnazione (da usare quando uno degli operandi è una lista).
12il costruttore.
13Il costruttore copia.
14Il distruttore.
15Il metodo Inserisci riceve il riferimento au intero, che non può modificare e provvede a inserirlo in testa alla lista.
16La funzione restituisce il numero di elementi che fanno parte della lista.
17Il metodo Svuota cancella tutti gli elmenti della lista.
18Il metodo Elimina toglie dalla lista il primo elemento che è uguale al parametro ricevuto.
19Il metodo Stampa scandisce la lista e stampa il valore degli elementi.
20Il metodo Ricerca restituisce un risultato booleano per indicare se il parametro ricevuto è presente nella lista.

il file Lista.cpp: il costruttore

Nr.
linea
Commento
4-7Si definisce la struttura Record: contiene un campo dato e un campo puntatore al successivo.
8, 9, 10Il costruttore assegna i valori iniziali a campi della classe.


il file Lista.cpp: il costruttore copia

Nr.
linea
Commento
12Lista(const Lista& lst)

Il costruttore Copia riceve il riferimento ad una lista, che non viene modificata (const):

L'oggetto lst ricevuto come parametro:
13if ((this != &lst) && primo)

Se il riferimento ricevuto (lst) non punta alla stessa lista e la lista lst contiene almeno un elemento (primo diverso da 0) si procede con la copia della lista lst in questa lista.
14primo = new Record

Si crea un nuovo record e si raccoglie il suo puntatore nel campo primo della classe

15primo->dato = lst.primo->dato

Nella sezione dato del nuovo record si copia il valore contenuto nel corrispondente elemento della lista da copiare
16PRec lp = lst.primo

Si crea un nuovo puntatore a Record e lo si inizializza con il puntatore al primo Record della lista da copiare.

17PRec p = primo

p è un puntatore a Record inizializzato con il puntatore al primo Record della lista in cui copiare gli elementi.

18while (lp->successivo

Si avanza nella lista da copiare, fintanto che non si raggiunge il puntatore 0
19p->successivo = new Record

Si aggiunge un nuovo record alla lista in cui copiare il nodo dalla lista sorgente lst.


Il puntatore al nuovo nodo viene scritto nel campo succesivo del record puntato da p
20p = p->successivo

Si passa al nodo successivo.

21, 22lp = lp->successivo
p->dato = lp->dato


Si avanza nella lista sorgente e si copia il campo dalla lista sorgente alla lista destinazione.

24p->successivo = 0

Quando si raggiunge la fine della lista sorgente si assegna il valore 0 anche al puntatore contenuto nell'ultimo record della lista, per indicare la fine della lista.


il file Lista.cpp: il distruttore




il file Lista.cpp: il metodo Inserisci

Nr.
linea
Commento
30Inserisci(const Elemento& el)

Il metodo Inserisci riceve il riferimento ad un intero, che non viene modificato (const):
31PRec p = new Record

Viene creato un nuovo nodo e il puntatore viene mamorizzato in p
32p->dato = el

nel canpo dato del nuovo nodo viene memorizzato il valore ricevuto come parametro.

il file Lista.cpp: il metodo Stampa

Nr.
linea
Commento
38PRec p = primo

Si dichiara un puntatore locale alla struttura Record e lo si inizializza con il puntatore alla testa della Lista.
39while (p) {

si entra in un ciclo che si ripete se p è diverso da 0.
40cout << p->dato << " - "

si stampa il valore contenuto nel campo dato del nodo.
41p = p->successivo

si avanza nella lista, leggendo il puntatore al nodo successivo e assegnandone il valore al puntatore p.
42si ritorna al test di ripetizione del ciclo while

il file Lista.cpp: il metodo NumeroElementi

Nr.
linea
Commento
45Il metodo NumeroElementi restituisce il numero di elementi contenuti nella Lista.

Nr.
linea
Commento
48PRec cancella

si dichiara un puntatore a Record.
49while (primo) {

si entra in un ciclo a condizione che il puntatore al primo elemento della lista sia diverso da 0.
50cancella = primo

si effettua una copia del puntatore al primo elemento della lista.
51primo = primo->successivo

il successivo elemento diventa il nuovo elemento di testa della lista, eliminando così dalla lista il primo elemento che è puntato dal puntatore cancella.
52delete cancella

si elimina lo spazio occupato dal nodo estratto dalla lista.
54conteggio = 0

Al termine del ciclo il campo membro conteggio viene posto a 0.

il file Lista.cpp: il metodo Elimina

Nr.
linea
Commento
56Elimina(const Elemento& el) {

il metodo riceve come parametro il riferimento a un intero, che rappresenta il valore che si vuole eliminare dalla lista.
57if(primo) {

se la lista non è vuota.
58if (primo->dato == el) {

se il primo elemento della lista conteine il valore ricevuto come parametro.
59PRec cancella = primo

si salva il puntatore al primo elemento della lista.
60primo->successivo

si passa al successivo elemento.
61delete cancella

si elimina lo spazio occupato dal nodo.
62conteggio--

si conta un elemento in meno.
63altrimenti si entra in un ciclo di scansione della lista, alla ricerca del nodo il cui campo dato sia uguale al parametro el

il file Lista.cpp: il metodo Ricerca

Nr.
linea
Commento
79bool Ricerca(const Elemento& el) {

il metodo riceve come parametro il riferimento a un intero, che rappresenta il valore che si vuole eliminare dalla lista e restituisce un valore booleano.
80PRec p = primo

Si accede alla lista.
81bool trovato = false

si crea una variabile booleana.
82while ((p) && (!trovato)) {

Si scandisce la lista, a condizione che l'elemento non sia stato trovato e non si sia raggiunta la fine della lista.
83, 84if (p->dato ==el)
trovato = true


Se il nodo raggiunto contiene il valore cercato si ritorna true.
86p = p->successivo

altrimenti si avanza nella lista.

il file ElaboraLista.cpp per il collaudo della classe

Nr.
linea
Commento
5La funzione StampaMenu()verrà richiamato per proporre le possibili operazioni ammesse sulla lista.


il file ElaboraLista.cpp per il collaudo della classe (continuazione)

Nr.
linea
Commento
19, 20vengono dichiarate due variabili
21Lista lista

viene dichiarata l'istanza lista della classeLista
21

22do {

Si entra in un ciclo
23StampaMenu()

viene richiamata la funzione per mostrare il menu
24cin >> i

la scelta avviene introducendo un numero da tastiera e premendo invio. Il tasto premuto viene acquisito in formato carattere
25switch(c) {

a seconda del carattere il flusso del programma subisce una diramazione verso l'operazione scelta
56, 61Si deve notare che (linea 57) viene creata una seconda istanza della classe Lista richiamando il costruttore copia (quello con un parametro di ingresso). Le operazioni sono inserite in un blocco in modo che al termine dell'uso della lista copiata venga richiamato il distruttore.