Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A CDL in Ingegneria Elettronica - A.A Strutture dati dinamiche Ing. Simona Colucci
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A Indice Allocazione dinamica vs statica Allocazione e de-allocazione di memoria Liste e loro gestione
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A Allocazione dinamica della memoria Gestione dinamica della memoria per memorizzare una quantità variabile di dati in funzione di esigenze note solo durante lesecuzione del programma e modificabili durante lesecuzione Consente di : –Aggiungere un nuovo elemento nellarea dati di un programma in fase di esecuzione –Eliminare lelemento di memorizzazione in fase di cancellazione del dato stesso Necessita di un riferimento ai nuovi elementi di memorizzazione che non può avvenire mediante identificatori: –Uso di puntatori –Creazione di un nuovo elemento e restituzione di un riferimento al dato stesso
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A Allocazione e cancellazione di memoria Allocazione : 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 Cancellazione : free(P) –Rilascia lo spazio di memoria puntato da P Le due funzioni sono in
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A Record di attivazione di Proc Stack Heap 5 3 Punt1 Punt2... Gestione della memoria della macchina astratta Stack: pila per la gestione delle variabili dichiarate (LIFO) Heap: mucchio per le variabili create dinamicamente (allocazione a deallocazione gestite direttamente dal programmatore)
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A Rischi della gestione dinamica della memoria Garbage production : –P = malloc(sizeof(TipoDato)); –P = Q; Dangling references: –P = Q; –free(Q);
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A Invece di dichiarare il tipo lista, si dichiarano i suoi elementi : typedef struct{ int Info; ElemLista *Prox; }ElemLista; typedef ElemLista*ListaDiElem; Dichiarazione lista dinamica (1)
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A Dichiarazione standard; mette in evidenza il tipo della lista: ListaDiElemLista1, Lista2, Lista3; Dichiarazioni abbreviate: ElemLista*Lista1; Dichiarazione lista dinamica (2)
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A Operazioni sulle liste: Inizializzazione (1) Assegna il valore NULL alla variabile testa della lista: Effettua loperazione: Inizializza (Lista) : Lista Se però vogliamo eseguire loperazione in maniera parametrica: …
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A #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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A boolean Ricerca (ListaDiElem Lista, int 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A boolean Ricerca (ListaDiElem Lista, int 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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A intTestaLista (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
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A Inserimento di un nuovo elemento in testa alla lista (1) in testa alla lista (1) Punt = malloc(sizeof(ElemLista)); Punt–>Info = Elem; Lista e1e2en Punt Lista e1e2en Punt Elem
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A 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) in testa alla lista (2)
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A voidInsercisciInTesta (ListaDiElem *Lista, int 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) in testa alla lista (3)
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A voidInserisciInCoda (ListaDiElem *Lista, int 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(1) in coda alla lista(1)
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A e1e2en-1en Lista1 Lista*1Lista*2Lista*3Lista*nLista*n+1 e1e2en-1en Lista1 Lista*1Lista*2Lista*3 Lista*n+1 Punt Elem Inserimento di un nuovo elemento in coda alla lista(2) in coda alla lista(2)
Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A Inserimento di un nuovo elemento in coda alla lista(3) e1e2en-1en Lista1 Lista*1Lista*2Lista*3 Lista*n+1 Punt Elem e1e2en-1en Lista1 Lista*1Lista*2Lista*3 Lista*n+1 Punt Elem