Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste...

19
Liste concatenate Violetta Lonati Universit` a degli studi di Milano Dipartimento di Informatica Laboratorio di algoritmi e strutture dati Corso di laurea in Informatica 2 novembre 2016 Violetta Lonati Liste concatenate 2 novembre 2016 1/13

Transcript of Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste...

Page 1: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Liste concatenate

Violetta Lonati

Universita degli studi di MilanoDipartimento di Informatica

Laboratorio di algoritmi e strutture datiCorso di laurea in Informatica

2 novembre 2016

Violetta Lonati Liste concatenate 2 novembre 2016 1/13

Page 2: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Liste concatenate

Una lista concatenata consiste di una catena di strutture chiamate nodi.Ogni nodo contiene un puntatore al prossimo nodo della catena. L’ultimonodo contiene il puntatore nullo (rappresentato da una diagonale).

Violetta Lonati Liste concatenate 2 novembre 2016 2/13

Page 3: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Struttura nodo

struct node {

int value; /∗ dato memorizzato nel nodo ∗/struct node *next; /∗ puntatore al prossimo nodo ∗/

};

NB: non e possibile usare typedef, ma e necessario usare un tag, poiche lastruttura contiene un puntatore ad una struttura dello stesso tipo.

Bisogna tenere traccia di dove la lista comincia. Se la lista e ancora vuota,dichiariamo un puntatore a struct node e lo inizializziamo a NULL.

struct node *first = NULL;

Violetta Lonati Liste concatenate 2 novembre 2016 3/13

Page 4: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Creazione di un nuovo nodo

1. allocare memoria per il nuovo nodo;

2. memorizzare il dato nel nuovo nodo;

3. inserire il nodo nella lista.

struct node *new_node;

new_node = malloc( sizeof( struct node ) );

Per memorizzare il dato nel nuovo nodo:

new_node -> value = 10;

oppure

scanf( "%d", &new_node -> value );

Violetta Lonati Liste concatenate 2 novembre 2016 4/13

Page 5: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Inserimento in testa

Se first punta all’inizio della lista e new_node e un nodo (gia allocato) dainserire in testa alla lista, basta:

1. fare in modo che il successore di new_node sia proprio first;

2. impostare new_node sia la nuova testa.

new_node -> next = first;

first = new_node;

Violetta Lonati Liste concatenate 2 novembre 2016 5/13

Page 6: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Inserimento in testa - esempio

Violetta Lonati Liste concatenate 2 novembre 2016 6/13

Page 7: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Inserimento in testa - esempio

Violetta Lonati Liste concatenate 2 novembre 2016 6/13

Page 8: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Inserimento in testa - esempio

Violetta Lonati Liste concatenate 2 novembre 2016 6/13

Page 9: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Inserimento in testa - continua

Scriviamo una funzione che effettua l’inserimento in testa: list sia ilpuntatore al primo nodo della lista e n il nuovo valore da inserire.

struct node *add_to_list( struct node *list , int n ){

struct node *new_node;

new_node = my_malloc( sizeof( struct node ) );

new_node -> value = n;

new_node -> next = list;

return new_node;

}

Violetta Lonati Liste concatenate 2 novembre 2016 7/13

Page 10: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Ricerca di un nodo

Scorriamo la lista a partire dalla testa cercando il valore desideratoall’interno dei nodi. Usiamo un puntatore che ad ogni passo punta al nodoche stiamo visitando.Scriviamo una funzione che effettua la ricerca di un elemento in una lista:list sia il puntatore al primo nodo della lista e n il valore da cercare.

struct node *search_list( struct node *list , int n ){

struct node *p;

for ( p = list; p!= NULL; p = p -> next )

if ( p -> value == n )

return p;

return NULL;

}

Violetta Lonati Liste concatenate 2 novembre 2016 8/13

Page 11: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Ricerca di un nodo - variante

Elimino puntatore p e uso direttamente list (tanto e passata per valore!)

struct node *search_list( struct node *list , int n ){

while ( list != NULL && list -> value != n )

list = list -> next;

return list;

}

Violetta Lonati Liste concatenate 2 novembre 2016 9/13

Page 12: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Cancellazione di un nodo

1. Trovare il nodo da eliminare;

2. modificare il nodo precedente in modo che punti al nodo successivo aquello da cancellare;

3. liberare con free lo spazio occupato dal nodo cancellato.

Per effettuare il punto 1) non mi basta usare un solo puntatore come perla ricerca, perche una volta trovato, non sappiamo piu dov’era il suopredecessore!! Usiamo due puntatori: cur punta al nodo corrente; prevpunta al suo predecessore.

for ( cur = list , prev = NULL;

cur != NULL && cur -> value != n;

prev = cur , cur = cur -> next )

;

Violetta Lonati Liste concatenate 2 novembre 2016 10/13

Page 13: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Cancellazione di un nodo

Per effettuare il punto 2) e il punto 3) bastano le istruzioni:

prev -> next = cur -> next;

free( cur );

Bisogna pero tenere conto dei casi limite, in cui n non si trova nella lista,oppure si trova in testa:

if ( cur == NULL )

return list; /∗ n non trovato ∗/if (prev == NULL )

list = list -> next; /∗ n nel primo nodo ∗/else

prev -> next = cur -> next;

free( cur );

return list;

Violetta Lonati Liste concatenate 2 novembre 2016 11/13

Page 14: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Cancellazione di un nodo - esempio

Consideriamo la lista contenente i valori 30, 40, 20 e 10 in quest’ordine ecancelliamo il valore 20.

for ( cur = list , prev = NULL;

cur != NULL && cur -> value != n;

prev = cur; cur = cur -> next )

;

...

prev -> next = cur -> next;

Violetta Lonati Liste concatenate 2 novembre 2016 12/13

Page 15: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Cancellazione di un nodo - esempioConsideriamo la lista contenente i valori 30, 40, 20 e 10 in quest’ordine ecancelliamo il valore 20.

for ( cur = list , prev = NULL;

cur != NULL && cur -> value != n;

prev = cur; cur = cur -> next )

;

...

prev -> next = cur -> next;

Violetta Lonati Liste concatenate 2 novembre 2016 12/13

Page 16: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Cancellazione di un nodo - esempioConsideriamo la lista contenente i valori 30, 40, 20 e 10 in quest’ordine ecancelliamo il valore 20.

for ( cur = list , prev = NULL;

cur != NULL && cur -> value != n;

prev = cur; cur = cur -> next )

;

...

prev -> next = cur -> next;

Violetta Lonati Liste concatenate 2 novembre 2016 12/13

Page 17: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Cancellazione di un nodo - esempioConsideriamo la lista contenente i valori 30, 40, 20 e 10 in quest’ordine ecancelliamo il valore 20.

for ( cur = list , prev = NULL;

cur != NULL && cur -> value != n;

prev = cur; cur = cur -> next )

;

...

prev -> next = cur -> next;

Violetta Lonati Liste concatenate 2 novembre 2016 12/13

Page 18: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Cancellazione di un nodo - esempioConsideriamo la lista contenente i valori 30, 40, 20 e 10 in quest’ordine ecancelliamo il valore 20.

for ( cur = list , prev = NULL;

cur != NULL && cur -> value != n;

prev = cur; cur = cur -> next )

;

...

prev -> next = cur -> next;

Violetta Lonati Liste concatenate 2 novembre 2016 12/13

Page 19: Violetta Lonatilonati.di.unimi.it/algopig/1617/materiale/T06-liste.pdf · 2016. 11. 2. · Liste concatenate Unalista concatenataconsiste di una catena di strutture chiamatenodi.

Liste ordinate

Anziche effettuare l’inserimento in testa, bisogna prima trovare il puntogiusto in cui inserire il nuovo nodo. Scorro la lista usando di nuovo duepuntatori cur e prev, fermandomi quando cur -> value diventa maggioredel valore cercato: questo significa che il nodo va inserito fra prev e cur.

Violetta Lonati Liste concatenate 2 novembre 2016 13/13