1 Strutture Dinamiche Corso di Informatica A Vito Perrone
Copyright © The McGraw-Hill Companies, srl 2 Strutture Dinamiche Informatica A – V. Perrone Indice Allocazione e de-allocazione di memoria Liste e loro gestione
Copyright © The McGraw-Hill Companies, srl 3 Strutture Dinamiche Informatica A – V. Perrone Allocazione e cancellazione di memoria malloc (sizeof (TipoDato)); –Crea in memoria una variabile di tipo TipoDato, e restituisce come risultato lindirizzo della variabile creata –Se P è una variabile di tipo puntatore a TipoDato, listruzione: P = malloc(sizeof(TipoDato)); assegna lindirizzo restituito dalla funzione malloc a P free(P) –Rilascia lo spazio di memoria puntato da P
Copyright © The McGraw-Hill Companies, srl 4 Strutture Dinamiche Informatica A – V. Perrone … Proc ( …).. int*Punt1; int**Punt2; … Record di attivazione di Proc StackHeap 5 3 Punt1 Punt2... Stack e Heap
Copyright © The McGraw-Hill Companies, srl 5 Strutture Dinamiche Informatica A – V. Perrone Rischi della gestione dinamica della memoria produzione di garbage : –P = malloc(sizeof(TipoDato)); –P = Q; riferimenti fluttuanti (dangling references): –P = Q; –free(Q);
Copyright © The McGraw-Hill Companies, srl 6 Strutture Dinamiche Informatica A – V. Perrone Costruzione e gestione della struttura dinamica (pseudotipo astratto) lista mediante puntatori: Lista e1e2en Ultimo elemento Lista dinamica Puntatore alla testa di lista testa di listacoda di lista Elemento 1 della listaPuntatore a elemento 2Puntatore NULL
Copyright © The McGraw-Hill Companies, srl 7 Strutture Dinamiche Informatica A – V. Perrone Invece di dichiarare il tipo lista, si dichiarano i suoi elementi: struct EL { TipoElementoInfo; struct EL*Prox; }; typedef struct ELElemLista; typedef ElemLista*ListaDiElem; Sintassi un po nuova: –la prima dichiarazione del tipo strutturato struct EL definisce un primo campo, Info, del tipo TipoElemento e permette di dichiarare il campo Prox come puntatore al tipo strutturato che si sta definendo; –la seconda dichiarazione utilizza typedef per rinominare il tipo struct EL come ElemLista ; –la terza dichiarazione definisce il tipo ListaDiElem come puntatore al tipo ElemLista. Dichiarazione lista dinamica (1)
Copyright © The McGraw-Hill Companies, srl 8 Strutture Dinamiche Informatica A – V. Perrone Dichiarazione standard; mette in evidenza il tipo della lista: ListaDiElemLista1, Lista2, Lista3; Dichiarazioni abbreviate: ElemLista*Lista1; se non interessa mettere in evidenza il tipo della lista, ma si vuole indicare esplicitamente il tipo dei suoi elementi. struct EL*Lista1 può sostituire entrambe le typedef se non è necessario nominare esplicitamente né il tipo della lista né il tipo dei suoi elementi. Dichiarazione lista dinamica (2)
Copyright © The McGraw-Hill Companies, srl 9 Strutture Dinamiche Informatica A – V. Perrone Operazioni sulle liste: Inizializzazione (1) Assegna il valore NULL alla variabile testa della lista: loperazione: Inizializza (Lista) : Lista Se però vogliamo eseguire loperazione in maniera parametrica: …
Copyright © The McGraw-Hill Companies, srl 10 Strutture Dinamiche Informatica A – V. Perrone #include voidInizializza (ListaDiElem *Lista) /* Lista è la variabile locale che punta alla "testa di lista". La funzione assegna alla testa di lista" il valore NULL corrispondente al valore di lista vuota */ { *Lista = NULL; } Lista1 Lista Inizializzazione (2) Listruzione Inizializza(&Lista1); produce: Al termine dellesecuzione, il parametro formale Lista viene eliminato
Copyright © The McGraw-Hill Companies, srl 11 Strutture Dinamiche Informatica A – V. Perrone #include ElemLista*Lista1; void Inizializza(void) { Lista1 = NULL; } Inizializzazione tramite accesso alla variabile globale Si raccomanda di evitare questa prassi! Inizializzazione (3) senza parametro
Copyright © The McGraw-Hill Companies, srl 12 Strutture Dinamiche Informatica A – V. Perrone booleanListaVuota (ListaDiElem Lista) /* Produce il valore true se la lista passata come parametro è vuota, false in caso contrario, a Lista viene passato il valore contenuto nella variabile testa di lista. Lista punta pertanto al primo elemento della lista considerata */ { if (Lista == NULL) return true; else return false; } La chiamata sarà: ListaVuota(Lista1) Controllo di lista vuota
Copyright © The McGraw-Hill Companies, srl 13 Strutture Dinamiche Informatica A – V. Perrone boolean Ricerca (ListaDiElem Lista, TipoElemento ElemCercato) { ElemLista*Cursore; if (Lista != NULL) { Cursore = Lista;/* La lista non è vuota */ while (Cursore != NULL) { if (Cursore–>Info == ElemCercato) return true; Cursore = Cursore–>Prox; /* In questa maniera Cursore viene fatto puntare all'elemento successivo della lista */ } return false; } Ricerca di un elemento nella lista
Copyright © The McGraw-Hill Companies, srl 14 Strutture Dinamiche Informatica A – V. Perrone boolean Ricerca (ListaDiElem Lista, TipoElemento ElemCercato) { if (Lista == NULL) return false; else if (Lista–>Info == ElemCercato) return true; else return Ricerca(Lista–>Prox, ElemCercato); } Ricerca di un elemento nella lista, versione ricorsiva
Copyright © The McGraw-Hill Companies, srl 15 Strutture Dinamiche Informatica A – V. Perrone TipoElementoTestaLista (ListaDiElem Lista) /* È applicabile solo a liste non vuote. Se la lista è vuota segnala l'errore in modo opportuno; in caso contrario produce come risultato il valore del campo Info del primo elemento della lista */ ListaDiElemCodaLista (ListaDiElem Lista) /*Produce come risultato un puntatore alla sottolista ottenuta da Lista cancellandone il primo elemento. Essa non deve modificare il parametro originario. Anche questa assume l'ipotesi che il parametro passatole sia una lista non vuota */ Lista e1e2en Ultimo elemento CodaLista Estrazione della testa e della coda di una lista
Copyright © The McGraw-Hill Companies, srl 16 Strutture Dinamiche Informatica A – V. Perrone Inserimento di un nuovo elemento in testa alla lista (1) Punt = malloc(sizeof(ElemLista)); Punt–>Info = Elem; Lista e1e2en Punt Lista e1e2en Punt Elem
Copyright © The McGraw-Hill Companies, srl 17 Strutture Dinamiche Informatica A – V. Perrone Infine si collega il nuovo elemento al precedente primo elemento della lista e la testa della lista viene fatta puntare al nuovo elemento: Lista e1e2en Punt Elem Inserimento di un nuovo elemento in testa alla lista (2)
Copyright © The McGraw-Hill Companies, srl 18 Strutture Dinamiche Informatica A – V. Perrone voidInsercisciInTesta (ListaDiElem *Lista, TipoElemento Elem) { ElemLista*Punt; /* Allocazione dello spazio necessario per la memorizzazione del nuovo elemento e inizializzazione del puntatore */ Punt = malloc(sizeof(ElemLista)); Punt–>Info = Elem; Punt–>Prox = *Lista; *Lista = Punt; } Lista1 e1e2en Lista Punt Elem Inserimento di un nuovo elemento in testa alla lista (3)
Copyright © The McGraw-Hill Companies, srl 19 Strutture Dinamiche Informatica A – V. Perrone voidInserisciInCoda (ListaDiElem *Lista, TipoElemento Elem); { ElemLista*Punt; if (ListaVuota (*Lista)) { Punt = malloc(sizeof(ElemLista)); Punt–>Prox = NULL; Punt–>Info = Elem; *Lista = Punt; } else InserisciIncoda (&((*Lista)–>Prox), Elem); } Inserimento di un nuovo elemento in coda alla lista
Copyright © The McGraw-Hill Companies, srl 20 Strutture Dinamiche Informatica A – V. Perrone e1e2en-1en Lista1 Lista*1Lista*2Lista*3Lista*nLista*n+1 e1e2en-1en Lista1 Lista*1Lista*2Lista*3 Lista*n+1 Punt Elem e1e2en-1en Lista1 Lista*1Lista*2Lista*3 Lista*n+1 Punt Elem
Copyright © The McGraw-Hill Companies, srl 21 Strutture Dinamiche Informatica A – V. Perrone Riassumendo Strutture dati dinamiche = pseudotipi di dato astratti dinamici Realizzate mediante puntatori Puntatori: struttura di basso livello ---> a rischio Raccomandazione: usare i puntatori solo allinterno delle operazioni astratte associate alle relative strutture Liste: primo e fondamentale -ma non unico!!- esempio di struttura dinamica Altri più complessi e potenti verranno visti in corsi successivi Una prima valutazione -a spanne- dellefficienza della struttura dinamica lista rispetto allarray: –Si evita lo spreco di memoria/rischio di overflow (obiettivo iniziale) –A prezzo di un -lieve- aumento dovuto ai puntatori –Da un punto di vista del tempo necessario allesecuzione degli algoritmi: pro e contro (inserire in testa meglio, inserire in coda peggio, … però la ricerca in una lista ordinata non si può fare con algoritmi del tipo della ricerca in un vocabolario … –Il seguito alle prossime puntate (corsi).