Sei sulla pagina 1di 29

Liste concatenate

Liste concatenate in C

Liste concatenate
Laboratorio di Programmazione I
Corso di Laurea in Informatica
A.A. 2016/2017

Liste concatenate
Liste concatenate in C

Calendario delle lezioni

Lez. 1 - Introduzione allambiente Linux


Lez. 2 - Introduzione al C
Lez. 3 - Tipi primitivi e costrutti condizionali
Lez. 4 - Costrutti iterativi ed array
Lez. 5 - Funzioni, stack e visibilita variabili
Lez. 6 - Puntatori e memoria
Lez. 7 - Tipi di dati utente
Lez. 8 - Liste concatenate e librerie

Liste concatenate
Liste concatenate in C

Sommario

Liste concatenate

Liste concatenate in C

Liste concatenate
Liste concatenate in C

Outline

Liste concatenate

Liste concatenate in C

Liste concatenate
Liste concatenate in C

Liste Concatenate
Finora abbiamo visto come gli array ci permettano di
rappresentare sequenze di elementi dello stesso tipo. Esempi:
array di interi, array di caratteri, ma anche array di struct.

Liste concatenate
Liste concatenate in C

Liste Concatenate
Finora abbiamo visto come gli array ci permettano di
rappresentare sequenze di elementi dello stesso tipo. Esempi:
array di interi, array di caratteri, ma anche array di struct.
Hanno dei vantaggi (accesso diretto, ossia tramite indice, e
allocazione contigua in memoria) ma anche degli svantaggi:

Liste concatenate
Liste concatenate in C

Liste Concatenate
Finora abbiamo visto come gli array ci permettano di
rappresentare sequenze di elementi dello stesso tipo. Esempi:
array di interi, array di caratteri, ma anche array di struct.
Hanno dei vantaggi (accesso diretto, ossia tramite indice, e
allocazione contigua in memoria) ma anche degli svantaggi:
hanno una dimensione fissata (a meno di non riallocare lo
spazio dinamicamente);

Liste concatenate
Liste concatenate in C

Liste Concatenate
Finora abbiamo visto come gli array ci permettano di
rappresentare sequenze di elementi dello stesso tipo. Esempi:
array di interi, array di caratteri, ma anche array di struct.
Hanno dei vantaggi (accesso diretto, ossia tramite indice, e
allocazione contigua in memoria) ma anche degli svantaggi:
hanno una dimensione fissata (a meno di non riallocare lo
spazio dinamicamente);
inserire/eliminare un elemento allinterno di un array puo
essere unoperazione costosa:

Liste concatenate
Liste concatenate in C

Liste Concatenate
Finora abbiamo visto come gli array ci permettano di
rappresentare sequenze di elementi dello stesso tipo. Esempi:
array di interi, array di caratteri, ma anche array di struct.
Hanno dei vantaggi (accesso diretto, ossia tramite indice, e
allocazione contigua in memoria) ma anche degli svantaggi:
hanno una dimensione fissata (a meno di non riallocare lo
spazio dinamicamente);
inserire/eliminare un elemento allinterno di un array puo
essere unoperazione costosa:

Liste concatenate
Liste concatenate in C

Liste Concatenate
Finora abbiamo visto come gli array ci permettano di
rappresentare sequenze di elementi dello stesso tipo. Esempi:
array di interi, array di caratteri, ma anche array di struct.
Hanno dei vantaggi (accesso diretto, ossia tramite indice, e
allocazione contigua in memoria) ma anche degli svantaggi:
hanno una dimensione fissata (a meno di non riallocare lo
spazio dinamicamente);
inserire/eliminare un elemento allinterno di un array puo
essere unoperazione costosa:

Liste concatenate
Liste concatenate in C

Liste Concatenate
Finora abbiamo visto come gli array ci permettano di
rappresentare sequenze di elementi dello stesso tipo. Esempi:
array di interi, array di caratteri, ma anche array di struct.
Hanno dei vantaggi (accesso diretto, ossia tramite indice, e
allocazione contigua in memoria) ma anche degli svantaggi:
hanno una dimensione fissata (a meno di non riallocare lo
spazio dinamicamente);
inserire/eliminare un elemento allinterno di un array puo
essere unoperazione costosa:

Liste concatenate
Liste concatenate in C

Liste Concatenate
Una lista concatenata (linked list) e una sequenza di nodi,
ciascuno dei quali memorizza un dato e contiene un riferimento
(puntatore) al nodo successivo.

Sono strutture dinamiche:


possiamo gestirle facilmente in maniera tale che
crescano/decrescano in accordo alla quantita di dati che
vogliamo memorizzare;
in particolare per aggiungere o cancellare nodi in una
qualunque posizione basta aggiustare i riferimenti
allinterno della lista, senza toccare gli elementi non
coinvolti.

Liste concatenate
Liste concatenate in C

Inserzione/Cancellazione
Inserzione:

Liste concatenate
Liste concatenate in C

Inserzione/Cancellazione
Inserzione:

Liste concatenate
Liste concatenate in C

Inserzione/Cancellazione
Inserzione:

Rimozione:

Liste concatenate
Liste concatenate in C

Array vs. Liste


Anche le liste hanno i propri vantaggi e svantaggi:
+ inserzione e rimozione molto piu semplice che negli array
(non ce bisogno di riorganizzare tutta la struttura);
+ sono strutture dinamiche, possiamo crescere e decrescere
facilmente durante lesecuzione del programma.

Liste concatenate
Liste concatenate in C

Array vs. Liste


Anche le liste hanno i propri vantaggi e svantaggi:
+ inserzione e rimozione molto piu semplice che negli array
(non ce bisogno di riorganizzare tutta la struttura);
+ sono strutture dinamiche, possiamo crescere e decrescere
facilmente durante lesecuzione del programma.
- sono una sequenza di dati, quindi per arrivare ad un
particolare nodo (es. lultimo) e necessario percorrere
tutta la lista;
- non sono memorizzate in maniera contigua in memoria
(piu tempo per passare da un elemento allaltro)

Liste concatenate
Liste concatenate in C

Array vs. Liste


Anche le liste hanno i propri vantaggi e svantaggi:
+ inserzione e rimozione molto piu semplice che negli array
(non ce bisogno di riorganizzare tutta la struttura);
+ sono strutture dinamiche, possiamo crescere e decrescere
facilmente durante lesecuzione del programma.
- sono una sequenza di dati, quindi per arrivare ad un
particolare nodo (es. lultimo) e necessario percorrere
tutta la lista;
- non sono memorizzate in maniera contigua in memoria
(piu tempo per passare da un elemento allaltro)
Da questo punto di vista array e liste si complementano

Liste concatenate
Liste concatenate in C

Outline

Liste concatenate

Liste concatenate in C

Liste concatenate
Liste concatenate in C

Rappresentazione in C
In C le liste vengono realizzate mediante struct. Andiamo a
definire il generico nodo:
typedef s t r u c t ll_node_struct {
/ / dato
int info ;
/ / p u n t a t o r e a l prossimo elemento
s t r u c t l l _ n o d e _ s t r u c t next ;
} ll_node ;

lultimo elemento della lista non ha successore e quindi il


suo campo next sara uguale a NULL;

Liste concatenate
Liste concatenate in C

Rappresentazione in C
In C le liste vengono realizzate mediante struct. Andiamo a
definire il generico nodo:
typedef s t r u c t ll_node_struct {
/ / dato
int info ;
/ / p u n t a t o r e a l prossimo elemento
s t r u c t l l _ n o d e _ s t r u c t next ;
} ll_node ;

lultimo elemento della lista non ha successore e quindi il


suo campo next sara uguale a NULL;
linizio della lista e individuato da una variabile head (tipo
ll_node ) che punta al primo elemento. Laccesso alla
lista avviene attraverso il puntatore al primo elemento.

Liste concatenate
Liste concatenate in C

Liste concatenate - codice


Esempio: creazione di una lista con tre elementi {5, 1, 20}:

Liste concatenate
Liste concatenate in C

Liste concatenate - codice


Esempio: creazione di una lista con tre elementi {5, 1, 20}:

Liste concatenate
Liste concatenate in C

Liste concatenate - codice


Esempio: creazione di una lista con tre elementi {5, 1, 20}:

Liste concatenate
Liste concatenate in C

Inserimento in coda
Per inserire un nuovo elemento in coda, dobbiamo percorrere
tutta la lista fino ad arrivare allultimo elemento.
l l _ n o d e i n s e r t ( l l _ n o d e head , i n t v )
{
l l _ n o d e c u r r =head ;
l l _ n o d e new_node= m a l l o c ( s i z e o f ( l l _ n o d e ) ) ;
new_node> i n f o =v ;
new_node>n e x t =NULL ;
i f ( head==NULL )
/ / l i s t a vuota
r e t u r n new_node ;
w h i l e ( c u r r >n e x t ! =NULL )
/ / scorriamo l a l i s t a
c u r r = c u r r >n e x t ;
c u r r >n e x t =new_node ;
r e t u r n head ;
}

Bisogna gestire con attenzione il caso di lista vuota!

Liste concatenate
Liste concatenate in C

Liste concatenate - eliminazione nodo


Quali sono le operazioni necessarie per eliminare il successore
di un elemento p?

Liste concatenate
Liste concatenate in C

Liste concatenate - eliminazione nodo


Quali sono le operazioni necessarie per eliminare il successore
di un elemento p?

Trovare lindirizzo s del suo successore;


Trovare lindirizzo s0 del successore di s;
Assegnare s0 al valore del successore di p.
Liberare la memoria puntata da s.

Liste concatenate
Liste concatenate in C

Liste concatenate - eliminazione nodo

typedef s t r u c t ll_node_struct {
int info ;
s t r u c t l l _ n o d e _ s t r u c t next ;
} ll_node ;
i n t d e l e t e _ s u c c e s s o r ( l l _ n o d e node ) {
ll_node next_next ;
i f ( node==NULL | | node>n e x t == NULL ) r e t u r n ;
n e x t _ n e x t = ( node>n e x t )>n e x t ;
f r e e ( node>n e x t ) ;
node>n e x t = n e x t _ n e x t ;
}

Liste concatenate
Liste concatenate in C

Regole e consigli

fate attenzione a non perdere/sovrascrivere head


altrimenti non avrete accesso a tutta la lista;
liberate sempre la memoria;
gestite con attenzione i casi limite, tipo lista vuota
(alle volte meglio ragionare prima su un pezzo di carta!)