Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019....
Transcript of Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019....
![Page 1: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/1.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Liste concatenate e allocazione dinamica
Laboratorio di Programmazione I
Corso di Laurea in InformaticaA.A. 2019/2020
![Page 2: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/2.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Argomenti del Corso
Ogni lezione consta di una spiegazione assistita da slide, eseguita da esercizi in classe
Introduzione all’ambiente LinuxIntroduzione al CTipi primitivi e costrutti condizionaliCostrutti iterativi ed arrayFunzioni, stack e visibilità variabiliPuntatori e memoriaDebuggingTipi di dati utenteListe concatenate e librerieRicorsione
![Page 3: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/3.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Sommario
1 Liste concatenate e allocazione dinamicaAllocazione Dinamica della Memoria
2 Operazioni su liste in C
![Page 4: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/4.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Outline
1 Liste concatenate e allocazione dinamicaAllocazione Dinamica della Memoria
2 Operazioni su liste in C
![Page 5: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/5.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Liste Concatenate
Fin’ora abbiamo visto come gli array ci permettano dirappresentare 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, eallocazione contigua in memoria) ma anche degli svantaggi:
hanno una dimensione fissata;inserire/eliminare un elemento all’interno di un array puòessere un’operazione costosa:
![Page 6: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/6.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Liste Concatenate
Fin’ora abbiamo visto come gli array ci permettano dirappresentare 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, eallocazione contigua in memoria) ma anche degli svantaggi:
hanno una dimensione fissata;inserire/eliminare un elemento all’interno di un array puòessere un’operazione costosa:
![Page 7: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/7.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Liste Concatenate
Fin’ora abbiamo visto come gli array ci permettano dirappresentare 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, eallocazione contigua in memoria) ma anche degli svantaggi:
hanno una dimensione fissata;
inserire/eliminare un elemento all’interno di un array puòessere un’operazione costosa:
![Page 8: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/8.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Liste Concatenate
Fin’ora abbiamo visto come gli array ci permettano dirappresentare 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, eallocazione contigua in memoria) ma anche degli svantaggi:
hanno una dimensione fissata;inserire/eliminare un elemento all’interno di un array puòessere un’operazione costosa:
![Page 9: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/9.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Liste Concatenate
Fin’ora abbiamo visto come gli array ci permettano dirappresentare 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, eallocazione contigua in memoria) ma anche degli svantaggi:
hanno una dimensione fissata;inserire/eliminare un elemento all’interno di un array puòessere un’operazione costosa:
![Page 10: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/10.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Liste Concatenate
Fin’ora abbiamo visto come gli array ci permettano dirappresentare 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, eallocazione contigua in memoria) ma anche degli svantaggi:
hanno una dimensione fissata;inserire/eliminare un elemento all’interno di un array puòessere un’operazione costosa:
![Page 11: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/11.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Liste Concatenate
Fin’ora abbiamo visto come gli array ci permettano dirappresentare 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, eallocazione contigua in memoria) ma anche degli svantaggi:
hanno una dimensione fissata;inserire/eliminare un elemento all’interno di un array puòessere un’operazione costosa:
![Page 12: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/12.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Liste Concatenate
Una lista concatenata (linked list) è 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 checrescano/decrescano in accordo alla quantità di dati chevogliamo memorizzare;in particolare per aggiungere o cancellare nodi in unaqualunque posizione basta aggiustare i riferimentiall’interno della lista, senza toccare gli elementi noncoinvolti.
![Page 13: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/13.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Modello di memoria - Liste concatenate
Array:
Strutture di interi:
![Page 14: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/14.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Modello di memoria - Liste concatenate
Array: Strutture di interi:
![Page 15: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/15.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Modello di memoria
Lista concatenata:
Rappresentazione semplificatadella lista concatenata:
testa 1 3 7 2 4
Da ora in poi useremo questarappresentazione!
![Page 16: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/16.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Modello di memoria
Lista concatenata:
Rappresentazione semplificatadella lista concatenata:
testa 1 3 7 2 4
Da ora in poi useremo questarappresentazione!
![Page 17: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/17.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Inserzione/Cancellazione
Inserzione:
Rimozione:
![Page 18: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/18.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Inserzione/Cancellazione
Inserzione:
Rimozione:
![Page 19: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/19.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Inserzione/Cancellazione
Inserzione:
Rimozione:
![Page 20: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/20.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Rappresentazione in C
In C le liste vengono realizzate mediante struct. Andiamo adefinire il generico nodo:
s t r u c t elemento {/ / datoi n t i n f o ;/ / punta tore a l prossimo elementos t r u c t elemento∗ next ;
} ;
typedef s t r u c t elemento ElementoDiL is ta ;
l’ultimo elemento della lista non ha successore e quindi ilsuo campo next sarà uguale a NULL;l’inizio della lista è individuato da una variabile puntatorechiamata head (tipo ElementoDiLista*) che punta alprimo elemento della lista. L’accesso alla lista avvieneattraverso il puntatore al primo elemento.
![Page 21: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/21.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Rappresentazione in C
In C le liste vengono realizzate mediante struct. Andiamo adefinire il generico nodo:
s t r u c t elemento {/ / datoi n t i n f o ;/ / punta tore a l prossimo elementos t r u c t elemento∗ next ;
} ;typedef s t r u c t elemento ElementoDiL is ta ;
l’ultimo elemento della lista non ha successore e quindi ilsuo campo next sarà uguale a NULL;l’inizio della lista è individuato da una variabile puntatorechiamata head (tipo ElementoDiLista*) che punta alprimo elemento della lista. L’accesso alla lista avvieneattraverso il puntatore al primo elemento.
![Page 22: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/22.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Rappresentazione in C
In C le liste vengono realizzate mediante struct. Andiamo adefinire il generico nodo:
s t r u c t elemento {/ / datoi n t i n f o ;/ / punta tore a l prossimo elementos t r u c t elemento∗ next ;
} ;typedef s t r u c t elemento ElementoDiL is ta ;
l’ultimo elemento della lista non ha successore e quindi ilsuo campo next sarà uguale a NULL;
l’inizio della lista è individuato da una variabile puntatorechiamata head (tipo ElementoDiLista*) che punta alprimo elemento della lista. L’accesso alla lista avvieneattraverso il puntatore al primo elemento.
![Page 23: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/23.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Rappresentazione in C
In C le liste vengono realizzate mediante struct. Andiamo adefinire il generico nodo:
s t r u c t elemento {/ / datoi n t i n f o ;/ / punta tore a l prossimo elementos t r u c t elemento∗ next ;
} ;typedef s t r u c t elemento ElementoDiL is ta ;
l’ultimo elemento della lista non ha successore e quindi ilsuo campo next sarà uguale a NULL;l’inizio della lista è individuato da una variabile puntatorechiamata head (tipo ElementoDiLista*) che punta alprimo elemento della lista. L’accesso alla lista avvieneattraverso il puntatore al primo elemento.
![Page 24: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/24.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Sommario
1 Liste concatenate e allocazione dinamicaAllocazione Dinamica della Memoria
2 Operazioni su liste in C
![Page 25: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/25.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Perchè usare l’allocazione dinamica
Ma con quello che sappiamo adesso per creare una lista di 3elementi devo dichiarare 3 variabili di tipo ElementoDiLista:
ElementoDiL is ta el1 , el2 , e l3 ;
Il numero degli elementi della lista deve essere deciso atempo di compilazione.Non è possibile, per esempio, creare una lista con unnumero di elementi letti in ingresso. Ma allora qual è ilvantaggio rispetto all’array?Quello che abbiamo visto non è l’unico modo. . . .
![Page 26: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/26.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Perchè usare l’allocazione dinamica
Ma con quello che sappiamo adesso per creare una lista di 3elementi devo dichiarare 3 variabili di tipo ElementoDiLista:
ElementoDiL is ta el1 , el2 , e l3 ;
Il numero degli elementi della lista deve essere deciso atempo di compilazione.
Non è possibile, per esempio, creare una lista con unnumero di elementi letti in ingresso. Ma allora qual è ilvantaggio rispetto all’array?Quello che abbiamo visto non è l’unico modo. . . .
![Page 27: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/27.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Perchè usare l’allocazione dinamica
Ma con quello che sappiamo adesso per creare una lista di 3elementi devo dichiarare 3 variabili di tipo ElementoDiLista:
ElementoDiL is ta el1 , el2 , e l3 ;
Il numero degli elementi della lista deve essere deciso atempo di compilazione.Non è possibile, per esempio, creare una lista con unnumero di elementi letti in ingresso. Ma allora qual è ilvantaggio rispetto all’array?
Quello che abbiamo visto non è l’unico modo. . . .
![Page 28: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/28.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Perchè usare l’allocazione dinamica
Ma con quello che sappiamo adesso per creare una lista di 3elementi devo dichiarare 3 variabili di tipo ElementoDiLista:
ElementoDiL is ta el1 , el2 , e l3 ;
Il numero degli elementi della lista deve essere deciso atempo di compilazione.Non è possibile, per esempio, creare una lista con unnumero di elementi letti in ingresso. Ma allora qual è ilvantaggio rispetto all’array?Quello che abbiamo visto non è l’unico modo. . . .
![Page 29: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/29.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Primitive
Il C mette a disposizione delle primitive per la gestionedinamica della memoriaIncluse in stdlib.h
Primitive per allocare dinamicamente memoriamalloc, calloc, realloc (in questo corso vedremo solola malloc)
free - primitiva di deallocazione della memoria
![Page 30: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/30.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Primitive - malloc
void * malloc(size_t size)
Alloca size bytes di memoriasize_t è semplicemente un tipo intero senza segno
Restituisce un puntatore all’inizio dell’area di memoriaallocata
void* definisce un puntatore ad un tipo generico che puóessere castato implicitamente od esplicitamente a qualsisitipo puntatoreSe l’allocazione di memoria fallisce, malloc restituisceNULL
![Page 31: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/31.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Primitive - malloc
void * malloc(size_t size)
Alloca size bytes di memoriasize_t è semplicemente un tipo intero senza segno
Restituisce un puntatore all’inizio dell’area di memoriaallocata
void* definisce un puntatore ad un tipo generico che puóessere castato implicitamente od esplicitamente a qualsisitipo puntatoreSe l’allocazione di memoria fallisce, malloc restituisceNULL
![Page 32: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/32.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Primitive - malloc
void * malloc(size_t size)
Alloca size bytes di memoriasize_t è semplicemente un tipo intero senza segno
Restituisce un puntatore all’inizio dell’area di memoriaallocata
void* definisce un puntatore ad un tipo generico che puóessere castato implicitamente od esplicitamente a qualsisitipo puntatoreSe l’allocazione di memoria fallisce, malloc restituisceNULL
![Page 33: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/33.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Heap• Ricordiamo come vede la memoria un programma C in
esecuzione
stack
Text
Heap
Variabili globalila dimensione di quest'area è fissata a tempo di compilazionee non si può espandere a run time (esecuzione)Dati globali
![Page 34: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/34.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Allocazione dinamica: malloc
• Come si usa tipicamente:
ListaDiElementi head;
head= malloc (sizeof(ElementoLista));
HeapContiene la memoria allocataDinamicamente fino ad ora
0xAA00
Primo indirizzo disponibile
stack
?0xFF00head
head->info=12;
head->next=NULL;
ElementoDiLista* head;
(ElementoDiLista));
![Page 35: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/35.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Allocazione dinamica: malloc
• Come si usa tipicamente:
ListaDiInteri head;
head=malloc (sizeof(ElementoDiLista));)
Heap0xAA00
stack
?0xFF00 head
0xAB00
Primo indirizzo disponibileDopo l'allocazione
head->info=12;
head->next=NULL;
ElementoDiLista* head;
![Page 36: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/36.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Allocazione dinamica: malloc• Situazione di partenza:
ListaDiInteri head;
head= malloc (sizeof(ElementoDiLista));
head->info=12;
head->next=NULL;
Heap0xAA00
stack
0xAA000xFF00 head
Primo indirizzo disponibilePer l'allocazione
0xAB00
ElementoDiLista* head;
![Page 37: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/37.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Allocazione dinamica: malloc
• Situazione di partenza:
ListaDiElementi head;
head= malloc(sizeof(ElementoDiLista));
head->info=12;
head->next=NULL;
Heap0xAA00
stack
0xAA000xFF00 head
NULL
12
0xAB00
Primo indirizzo disponibilePer l'allocazione
ElementoDiLista* head;
![Page 38: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/38.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Primitive - free
In C, la gestione dello heap è lasciata al programmatoreLo spazio allocato sullo heap non viene deallocatoall’uscita delle funzioniLa deallocazione deve essere gestita esplicitamente
void free(void *ptr)
Dealloca lo spazio puntato da ptr ed allocato usando malloc
ElementoDiL is ta∗ head ;head=( ElementoDiL is ta ∗ ) mal loc ( s i z e o f ( ElementoDiL is ta ) ) ;
. . .f r ee ( head ) ;
![Page 39: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/39.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Primitive - free
In C, la gestione dello heap è lasciata al programmatoreLo spazio allocato sullo heap non viene deallocatoall’uscita delle funzioniLa deallocazione deve essere gestita esplicitamente
void free(void *ptr)
Dealloca lo spazio puntato da ptr ed allocato usando malloc
ElementoDiL is ta∗ head ;head=( ElementoDiL is ta ∗ ) mal loc ( s i z e o f ( ElementoDiL is ta ) ) ;
. . .f r ee ( head ) ;
![Page 40: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/40.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Primitive - free
In C, la gestione dello heap è lasciata al programmatoreLo spazio allocato sullo heap non viene deallocatoall’uscita delle funzioniLa deallocazione deve essere gestita esplicitamente
void free(void *ptr)
Dealloca lo spazio puntato da ptr ed allocato usando malloc
ElementoDiL is ta∗ head ;head=( ElementoDiL is ta ∗ ) mal loc ( s i z e o f ( ElementoDiL is ta ) ) ;
. . .f r ee ( head ) ;
![Page 41: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/41.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Allocazione dinamica: free
• Situazione di partenza:
ListaDiElementi head;
head=malloc(sizeof(ElementoDiLista));
head->info=12;
head->next=NULL;
....
free(head);
Heap0xAA00
stack
0xAA000xFF00 head
NULL
12
0xAB00
Primo indirizzo disponibilePer l'allocazione
ElementoDiLista* head;
![Page 42: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/42.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Allocazione dinamica: free
• Situazione di partenza:
ListaDiElementi head;
head= malloc (sizeof(ElementoDiLista));
head->info=12;
head->next=NULL
....
free(head);
Heap0xAA00
stack
0xAA000xFF00head
NULL
12
0xAB00
Primo indirizzo disponibileper l'allocazione
ElementoDiLista* head;
![Page 43: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/43.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Allocazione dinamica: free
• Situazione di partenza:
ListaDiElementi head;
head=malloc(sizeof(ElementoDiLista));
head->info=12;
head->next=NULL
....
free(head);
Heap
0xAA00
stack
0xAA000xFF00 head
NULL
12
0xAB00
Notate che il puntatore head non
viene modificato, contiene ancora
l'indirizzo e può essere usato!
Il risultato però di tale accesso è
indeterminato ....
ElementoDiLista* head;
![Page 44: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/44.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Liste concatenate - codice
Esempio: creazione di una lista con tre elementi {5,1,20}:
ElementoDiL is ta∗ head ;ElementoDiL is ta∗ el1 ,∗ el2 ,∗ el3 ;e l1=mal loc ( s i z e o f ( ElementoDiL is ta ) ) ;e l2=mal loc ( s i z e o f ( ElementoDiL is ta ) ) ;e l3=mal loc ( s i z e o f ( ElementoDiL is ta ) ) ;
![Page 45: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/45.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Liste concatenate - codice
Esempio: creazione di una lista con tre elementi {5,1,20}:
![Page 46: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/46.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Liste concatenate - codice
Esempio: creazione di una lista con tre elementi {5,1,20}:
![Page 47: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/47.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
Liste concatenate - codice
Esempio: creazione di una lista con tre elementi {5,1,20}:
![Page 48: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/48.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
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 decrescerefacilmente durante l’esecuzione del programma.
- sono una sequenza di dati, quindi per arrivare ad unparticolare nodo (es. l’ultimo) e’ necessario percorreretutta 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
![Page 49: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/49.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
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 decrescerefacilmente durante l’esecuzione del programma.
- sono una sequenza di dati, quindi per arrivare ad unparticolare nodo (es. l’ultimo) e’ necessario percorreretutta 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
![Page 50: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/50.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Allocazione Dinamica della Memoria
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 decrescerefacilmente durante l’esecuzione del programma.
- sono una sequenza di dati, quindi per arrivare ad unparticolare nodo (es. l’ultimo) e’ necessario percorreretutta 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
![Page 51: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/51.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Outline
1 Liste concatenate e allocazione dinamicaAllocazione Dinamica della Memoria
2 Operazioni su liste in C
![Page 52: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/52.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Operazioni sulle liste
- Definiamo una serie di procedure e funzioni per operaresulle liste.
- Usiamo liste di interi per semplicità, ma tutte le operazionisono realizzabili in modo del tutto analogo su liste di altrotipo (salvo rare eccezioni)
- Facciamo riferimento alle dichiarazioni del tipoElementoDiLista visto in precedenza
![Page 53: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/53.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inizializzazione
- Definiamo una procedura che inizializza una listaassegnando il valore NULL alla variabile testa della lista.
- Tale variabile deve essere modificata e quindi passata perindirizzo.
- Ciò provoca, nell’intestazione della procedura, la presenzadi un puntatore a puntatore.
vo id I n i z i a l i z z a ( ElementoDiL is ta ∗∗ l i s t a ){
∗ l i s t a =NULL;}
![Page 54: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/54.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inizializzazione
- Definiamo una procedura che inizializza una listaassegnando il valore NULL alla variabile testa della lista.
- Tale variabile deve essere modificata e quindi passata perindirizzo.
- Ciò provoca, nell’intestazione della procedura, la presenzadi un puntatore a puntatore.
vo id I n i z i a l i z z a ( ElementoDiL is ta ∗∗ l i s t a ){
∗ l i s t a =NULL;}
![Page 55: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/55.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inizializzazione
- Definiamo una procedura che inizializza una listaassegnando il valore NULL alla variabile testa della lista.
- Tale variabile deve essere modificata e quindi passata perindirizzo.
- Ciò provoca, nell’intestazione della procedura, la presenzadi un puntatore a puntatore.
vo id I n i z i a l i z z a ( ElementoDiL is ta ∗∗ l i s t a ){
∗ l i s t a =NULL;}
![Page 56: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/56.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inizializzazione
- Definiamo una procedura che inizializza una listaassegnando il valore NULL alla variabile testa della lista.
- Tale variabile deve essere modificata e quindi passata perindirizzo.
- Ciò provoca, nell’intestazione della procedura, la presenzadi un puntatore a puntatore.
vo id I n i z i a l i z z a ( ElementoDiL is ta ∗∗ l i s t a ){
∗ l i s t a =NULL;}
![Page 57: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/57.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inizializzazione
- Supponiamo ora che Inizializza sia chiamatapassando come parametro l’indirizzo della variabileLista1 di tipo ElementoDiLista*,:
vo id I n i z i a l i z z a ( ElementoDiL is ta ∗∗ l i s t a ){
∗ l i s t a =NULL;}
i n t main ( ){
ElementoDiL is ta∗ L is ta1 ;I n i z i a l i z z a (& L i s ta1 ) ;. . .
}
![Page 58: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/58.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inizializzazione
- Supponiamo ora che Inizializza sia chiamatapassando come parametro l’indirizzo della variabileLista1 di tipo ElementoDiLista*,:
vo id I n i z i a l i z z a ( ElementoDiL is ta ∗∗ l i s t a ){
∗ l i s t a =NULL;}
i n t main ( ){
ElementoDiL is ta∗ L is ta1 ;I n i z i a l i z z a (& L i s ta1 ) ;. . .
}
PILA
Lista1 ?
![Page 59: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/59.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inizializzazione
- Supponiamo ora che Inizializza sia chiamatapassando come parametro l’indirizzo della variabileLista1 di tipo ElementoDiLista*,:
vo id I n i z i a l i z z a ( ElementoDiL is ta ∗∗ l i s t a ){
∗ l i s t a =NULL;}
i n t main ( ){
ElementoDiL is ta∗ L is ta1 ;I n i z i a l i z z a (& L i s ta1 ) ;. . .
}
PILA
Lista1 ?
RDA Inizializza
lista
![Page 60: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/60.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inizializzazione
- Supponiamo ora che Inizializza sia chiamatapassando come parametro l’indirizzo della variabileLista1 di tipo ElementoDiLista*,:
vo id I n i z i a l i z z a ( ElementoDiL is ta ∗∗ l i s t a ){
∗ l i s t a =NULL;}
i n t main ( ){
ElementoDiL is ta∗ L is ta1 ;I n i z i a l i z z a (& L i s ta1 ) ;. . .
}
PILA
Lista1
RDA Inizializza
lista
![Page 61: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/61.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inizializzazione
- Supponiamo ora che Inizializza sia chiamatapassando come parametro l’indirizzo della variabileLista1 di tipo ElementoDiLista*,:
vo id I n i z i a l i z z a ( ElementoDiL is ta ∗∗ l i s t a ){
∗ l i s t a =NULL;}
i n t main ( ){
ElementoDiL is ta∗ L is ta1 ;I n i z i a l i z z a (& L i s ta1 ) ;. . .
}
PILA
Lista1
![Page 62: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/62.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inizializzazione
Cosa succederebbe se passassimo il parametro per valore?
vo id I n i z i a l i z z a ( ElementoDiL is ta∗ l i s t a ){
l i s t a =NULL;}
i n t main ( ){
ElementoDiL is ta∗ L is ta1 ;I n i z i a l i z z a ( L i s ta1 ) ;. . .
}
![Page 63: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/63.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inizializzazione
Cosa succederebbe se passassimo il parametro per valore?
vo id I n i z i a l i z z a ( ElementoDiL is ta∗ l i s t a ){
l i s t a =NULL;}
i n t main ( ){
ElementoDiL is ta∗ L is ta1 ;I n i z i a l i z z a ( L i s ta1 ) ;. . .
}
PILA
Lista1 ?
![Page 64: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/64.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inizializzazione
Cosa succederebbe se passassimo il parametro per valore?
vo id I n i z i a l i z z a ( ElementoDiL is ta∗ l i s t a ){
l i s t a =NULL;}
i n t main ( ){
ElementoDiL is ta∗ L is ta1 ;I n i z i a l i z z a ( L i s ta1 ) ;. . .
}
PILA
Lista1 ?
lista ?
RDA Inizializza
![Page 65: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/65.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inizializzazione
Cosa succederebbe se passassimo il parametro per valore?
vo id I n i z i a l i z z a ( ElementoDiL is ta∗ l i s t a ){
l i s t a =NULL;}
i n t main ( ){
ElementoDiL is ta∗ L is ta1 ;I n i z i a l i z z a ( L i s ta1 ) ;. . .
}
PILA
Lista1 ?
lista
RDA Inizializza
![Page 66: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/66.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inizializzazione
Cosa succederebbe se passassimo il parametro per valore?
vo id I n i z i a l i z z a ( ElementoDiL is ta∗ l i s t a ){
l i s t a =NULL;}
i n t main ( ){
ElementoDiL is ta∗ L is ta1 ;I n i z i a l i z z a ( L i s ta1 ) ;. . .
}
PILA
Lista1 ?
![Page 67: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/67.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in testa - passaggio per valore
- allochiamo una nuova struttura per l’elemento (malloc)- assegnamo il valore da inserire al campo info della
struttura- concateniamo la nuova struttura con la vecchia lista- restituiamo la nuova testa della lista aux.
![Page 68: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/68.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in testa - passaggio per valore
- allochiamo una nuova struttura per l’elemento (malloc)
- assegnamo il valore da inserire al campo info dellastruttura
- concateniamo la nuova struttura con la vecchia lista- restituiamo la nuova testa della lista aux.
![Page 69: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/69.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in testa - passaggio per valore
- allochiamo una nuova struttura per l’elemento (malloc)- assegnamo il valore da inserire al campo info della
struttura
- concateniamo la nuova struttura con la vecchia lista- restituiamo la nuova testa della lista aux.
![Page 70: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/70.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in testa - passaggio per valore
- allochiamo una nuova struttura per l’elemento (malloc)- assegnamo il valore da inserire al campo info della
struttura- concateniamo la nuova struttura con la vecchia lista
- restituiamo la nuova testa della lista aux.
![Page 71: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/71.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in testa - passaggio per valore
- allochiamo una nuova struttura per l’elemento (malloc)- assegnamo il valore da inserire al campo info della
struttura- concateniamo la nuova struttura con la vecchia lista- restituiamo la nuova testa della lista aux.
![Page 72: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/72.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in testa - passaggio per valore
ElementoDiL is ta∗ i n s e r i s c i _ t e s t a ( ElementoDiL is ta∗l i s t a , i n t elem ) {ElementoDiL is ta∗ aux ;aux = mal loc ( s i z e o f ( ElementoDiL is ta ) ) ;aux−>i n f o = elem ;aux −>next = l i s t a ;r e t u r n aux ;
}
![Page 73: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/73.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in testa - passaggio per indirizzo
- in questo caso il puntatore alla nuova struttura non deveessere restituito
- il puntatore iniziale della lista viene fatto puntare alla nuovastruttura
- la lista da modificare deve essere passata per indirizzo
![Page 74: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/74.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in testa - passaggio per indirizzo
- in questo caso il puntatore alla nuova struttura non deveessere restituito
- il puntatore iniziale della lista viene fatto puntare alla nuovastruttura
- la lista da modificare deve essere passata per indirizzo
![Page 75: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/75.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in testa - passaggio per indirizzo
- in questo caso il puntatore alla nuova struttura non deveessere restituito
- il puntatore iniziale della lista viene fatto puntare alla nuovastruttura
- la lista da modificare deve essere passata per indirizzo
![Page 76: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/76.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in testa - passaggio per indirizzo
vo id i n s e r i s c i _ t e s t a ( ElementoDiL is ta ∗∗ l i s t a , i n t elem) {ElementoDiL is ta∗ aux ;aux = mal loc ( s i z e o f ( ElementoDiL is ta ) ) ;aux−>i n f o = elem ;aux −>next = ∗ l i s t a ;∗ l i s t a =aux ;
}
![Page 77: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/77.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in coda
- Se la lista è vuota coincide con l’inserimento in testa
-> è necessario il passaggio per indirizzo o restituire la nuovatesta
- Se la lista non è vuota, bisogna scandirla fino in fondo-> dobbiamo usare un puntatore ausiliario per la scansione
- La scansione deve terminare in corrispondenza dell’ultimoelemento al quale va collegato quello nuovo
![Page 78: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/78.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in coda
- Se la lista è vuota coincide con l’inserimento in testa-> è necessario il passaggio per indirizzo o restituire la nuova
testa
- Se la lista non è vuota, bisogna scandirla fino in fondo-> dobbiamo usare un puntatore ausiliario per la scansione
- La scansione deve terminare in corrispondenza dell’ultimoelemento al quale va collegato quello nuovo
![Page 79: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/79.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in coda
- Se la lista è vuota coincide con l’inserimento in testa-> è necessario il passaggio per indirizzo o restituire la nuova
testa- Se la lista non è vuota, bisogna scandirla fino in fondo
-> dobbiamo usare un puntatore ausiliario per la scansione- La scansione deve terminare in corrispondenza dell’ultimo
elemento al quale va collegato quello nuovo
![Page 80: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/80.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in coda
- Se la lista è vuota coincide con l’inserimento in testa-> è necessario il passaggio per indirizzo o restituire la nuova
testa- Se la lista non è vuota, bisogna scandirla fino in fondo
-> dobbiamo usare un puntatore ausiliario per la scansione
- La scansione deve terminare in corrispondenza dell’ultimoelemento al quale va collegato quello nuovo
![Page 81: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/81.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in coda
- Se la lista è vuota coincide con l’inserimento in testa-> è necessario il passaggio per indirizzo o restituire la nuova
testa- Se la lista non è vuota, bisogna scandirla fino in fondo
-> dobbiamo usare un puntatore ausiliario per la scansione- La scansione deve terminare in corrispondenza dell’ultimo
elemento al quale va collegato quello nuovo
![Page 82: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/82.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in coda
- Se la lista è vuota coincide con l’inserimento in testa-> è necessario il passaggio per indirizzo o restituire la nuova
testa- Se la lista non è vuota, bisogna scandirla fino in fondo
-> dobbiamo usare un puntatore ausiliario per la scansione- La scansione deve terminare in corrispondenza dell’ultimo
elemento al quale va collegato quello nuovo
*lista
8 3 15
ultimo
aux
15
5
![Page 83: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/83.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in coda
- Se la lista è vuota coincide con l’inserimento in testa-> è necessario il passaggio per indirizzo o restituire la nuova
testa- Se la lista non è vuota, bisogna scandirla fino in fondo
-> dobbiamo usare un puntatore ausiliario per la scansione- La scansione deve terminare in corrispondenza dell’ultimo
elemento al quale va collegato quello nuovo
*lista
8 3 15
aux
15
5
ultimo
![Page 84: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/84.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in coda
- Se la lista è vuota coincide con l’inserimento in testa-> è necessario il passaggio per indirizzo o restituire la nuova
testa- Se la lista non è vuota, bisogna scandirla fino in fondo
-> dobbiamo usare un puntatore ausiliario per la scansione- La scansione deve terminare in corrispondenza dell’ultimo
elemento al quale va collegato quello nuovo
*lista
8 3 15
aux
15
5
ultimo
![Page 85: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/85.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in coda
- Se la lista è vuota coincide con l’inserimento in testa-> è necessario il passaggio per indirizzo o restituire la nuova
testa- Se la lista non è vuota, bisogna scandirla fino in fondo
-> dobbiamo usare un puntatore ausiliario per la scansione- La scansione deve terminare in corrispondenza dell’ultimo
elemento al quale va collegato quello nuovo
*lista
8 3 15
aux
15
5
ultimo
![Page 86: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/86.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in coda - passaggio per valore
ElementoDiL is ta∗ i n se r i s c i _coda ( ElementoDiL is ta∗ l i s t a ,i n t elem )
{ElementoDiL is ta∗ u l t imo = l i s t a ;ElementoDiL is ta∗ new_elem=mal loc ( s i z e o f (ElementoDiL is ta ) ) ;new_elem−>i n f o =elem ;new_elem−>next=NULL ;i f ( l i s t a ==NULL) / / l i s t a vuota
r e t u r n new_elem ;wh i le ( u l t imo−>next !=NULL) / / scorr iamo l a l i s t a
u l t imo =ul t imo−>next ;u l t imo−>next=new_elem ;r e t u r n l i s t a ;
}
![Page 87: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/87.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Inserimento in coda - passaggio per indirizzo
vo id i nse r i s c i _coda ( ElementoDiL is ta ∗∗ l i s t a , i n t elem ){
ElementoDiL is ta∗ u l t imo ; /∗ punta tore usato per l ascansione ∗ /E lementoDiL is ta∗ new_elem== mal loc ( s i z e o f (ElementoDiL is ta ) ) ; /∗ creazione de l nuovo elemento ∗ /new_elem−>i n f o = elem ;new_elem−>next = NULL ;i f (∗ l i s t a == NULL)
∗ l i s t a = new_elem ;e lse {
u l t imo = ∗ l i s t a ;wh i le ( u l t imo−>next != NULL)
u l t imo = ul t imo−>next ;/∗ concatenazione de l nuovo elemento i n coda
a l l a l i s t a ∗ /u l t imo−>next = new_elem ;
}}
![Page 88: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/88.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Cancellazione del primo elementoPILA HEAP
8
4
lista
5
10
- se la lista è vuota non facciamo nulla
- altrimenti eliminiamo il primo elemento-> la lista deve essere passata per indirizzo o la nuova lista
deve essere restituita- cancellare significa anche deallocare la memoria occupata
dall’elemento-> dobbiamo invocare free passando il puntatore
all’elemento da cancellare-> è necessario un puntatore ausiliario
![Page 89: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/89.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Cancellazione del primo elementoPILA HEAP
8
4
lista
5
10
- se la lista è vuota non facciamo nulla- altrimenti eliminiamo il primo elemento
-> la lista deve essere passata per indirizzo o la nuova listadeve essere restituita
- cancellare significa anche deallocare la memoria occupatadall’elemento
-> dobbiamo invocare free passando il puntatoreall’elemento da cancellare
-> è necessario un puntatore ausiliario
![Page 90: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/90.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Cancellazione del primo elementoPILA HEAP
8
4
lista
5
10
- se la lista è vuota non facciamo nulla- altrimenti eliminiamo il primo elemento
-> la lista deve essere passata per indirizzo o la nuova listadeve essere restituita
- cancellare significa anche deallocare la memoria occupatadall’elemento
-> dobbiamo invocare free passando il puntatoreall’elemento da cancellare
-> è necessario un puntatore ausiliario
![Page 91: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/91.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Cancellazione del primo elementoPILA HEAP
8
4
lista
5
10
- se la lista è vuota non facciamo nulla- altrimenti eliminiamo il primo elemento
-> la lista deve essere passata per indirizzo o la nuova listadeve essere restituita
- cancellare significa anche deallocare la memoria occupatadall’elemento
-> dobbiamo invocare free passando il puntatoreall’elemento da cancellare
-> è necessario un puntatore ausiliario
![Page 92: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/92.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Cancellazione del primo elementoPILA HEAP
8
4
lista
5
10
- se la lista è vuota non facciamo nulla- altrimenti eliminiamo il primo elemento
-> la lista deve essere passata per indirizzo o la nuova listadeve essere restituita
- cancellare significa anche deallocare la memoria occupatadall’elemento
-> dobbiamo invocare free passando il puntatoreall’elemento da cancellare
-> è necessario un puntatore ausiliario
![Page 93: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/93.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Cancellazione del primo elementoPILA HEAP
8
aux
4
lista
5
10
- se la lista è vuota non facciamo nulla- altrimenti eliminiamo il primo elemento
-> la lista deve essere passata per indirizzo o la nuova listadeve essere restituita
- cancellare significa anche deallocare la memoria occupatadall’elemento
-> dobbiamo invocare free passando il puntatoreall’elemento da cancellare
-> è necessario un puntatore ausiliario
![Page 94: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/94.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Cancellazione del primo elementoPILA HEAP
8
aux
4
lista
5
- se la lista è vuota non facciamo nulla- altrimenti eliminiamo il primo elemento
-> la lista deve essere passata per indirizzo o la nuova listadeve essere restituita
- cancellare significa anche deallocare la memoria occupatadall’elemento
-> dobbiamo invocare free passando il puntatoreall’elemento da cancellare
-> è necessario un puntatore ausiliario
![Page 95: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/95.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Cancellazione del primo elemento - passaggio perriferimento
vo id cancel la_pr imo ( ElementoDiL is ta ∗∗ l i s t a ){
ElementoDiL is ta∗ aux ;i f (∗ l i s t a != NULL)
{aux = ∗ l i s t a ;∗ l i s t a = (∗ l i s t a )−>next ;f r ee ( aux ) ;
}}
![Page 96: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/96.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Cancellazione del primo elemento - passaggio pervalore
ElementoDiL is ta∗ cancel la_pr imo ( ElementoDiL is ta ∗ l i s t a ){
ElementoDiL is ta∗ aux ;i f ( l i s t a != NULL)
{aux = l i s t a ;l i s t a = l i s t a −>next ;f r ee ( aux ) ;
}r e t u r n l i s t a ;
}
![Page 97: Laboratorio di Programmazione Ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019. 11. 13. · Liste concatenate e allocazione dinamica Operazioni su liste in C Allocazione](https://reader035.fdocument.pub/reader035/viewer/2022081619/60fc7c220edbc876052734e4/html5/thumbnails/97.jpg)
Liste concatenate e allocazione dinamicaOperazioni su liste in C
Appartenenza di un elemento alla lista
typedef enum{ fa lse , t r ue } boolean ;
boolean appar t iene ( i n t elem , ElementoDiL is ta∗ l i s t a ){
boolean t r o v a t o = f a l s e ;
wh i le ( l i s t a != NULL && ! t r o v a t o )i f ( l i s t a −>i n f o ==elem )
t r o v a t o = t rue ;e lse
l i s t a = l i s t a −>next ;r e t u r n t r o v a t o ;
}
- Non c’è bisogno di un puntatore ausiliario per scorrere lalista
-> il passaggio per valore consente di scorrere utilizzando ilparametro formale!