Liste concatenate

Transcript

Liste concatenate
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 all’ambiente 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
1
Liste concatenate
2
Liste concatenate in C
Liste concatenate
Liste concatenate in C
Outline
1
Liste concatenate
2
Liste concatenate in C
Liste concatenate
Liste concatenate in C
Liste Concatenate
Fin’ora 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
Fin’ora 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
Fin’ora 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
Fin’ora 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 all’interno di un array puo’
essere un’operazione costosa:
Liste concatenate
Liste concatenate in C
Liste Concatenate
Fin’ora 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 all’interno di un array puo’
essere un’operazione costosa:
Liste concatenate
Liste concatenate in C
Liste Concatenate
Fin’ora 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 all’interno di un array puo’
essere un’operazione costosa:
Liste concatenate
Liste concatenate in C
Liste Concatenate
Fin’ora 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 all’interno di un array puo’
essere un’operazione 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
all’interno 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 c’e’ bisogno di riorganizzare tutta la struttura);
+ sono strutture dinamiche, possiamo crescere e decrescere
facilmente durante l’esecuzione 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 c’e’ bisogno di riorganizzare tutta la struttura);
+ sono strutture dinamiche, possiamo crescere e decrescere
facilmente durante l’esecuzione del programma.
- sono una sequenza di dati, quindi per arrivare ad un
particolare nodo (es. l’ultimo) e’ necessario percorrere
tutta la lista;
- non sono memorizzate in maniera contigua in memoria
(piu’ tempo per passare da un elemento all’altro)
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 c’e’ bisogno di riorganizzare tutta la struttura);
+ sono strutture dinamiche, possiamo crescere e decrescere
facilmente durante l’esecuzione del programma.
- sono una sequenza di dati, quindi per arrivare ad un
particolare nodo (es. l’ultimo) e’ necessario percorrere
tutta la lista;
- non sono memorizzate in maniera contigua in memoria
(piu’ tempo per passare da un elemento all’altro)
Da questo punto di vista array e liste si complementano
Liste concatenate
Liste concatenate in C
Outline
1
Liste concatenate
2
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 ;
l’ultimo 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 ;
l’ultimo elemento della lista non ha successore e quindi il
suo campo next sara’ uguale a NULL;
l’inizio della lista e’ individuato da una variabile head (tipo
ll_node ) che punta al primo elemento. L’accesso 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 all’ultimo 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 l’indirizzo s del suo successore;
Trovare l’indirizzo 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!)