laboratorio di programmazione ididawiki.di.unipi.it/lib/exe/fetch.php/informatica/prl/... · 2019....

97
Liste concatenate e allocazione dinamica Operazioni su liste in C Liste concatenate e allocazione dinamica Laboratorio di Programmazione I Corso di Laurea in Informatica A.A. 2019/2020

Upload: others

Post on 27-Feb-2021

3 views

Category:

Documents


0 download

TRANSCRIPT

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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!