La presentazione è in caricamento. Aspetta per favore

La presentazione è in caricamento. Aspetta per favore

Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 CDL in Ingegneria Elettronica - A.A. 2007-2008 13. Strutture dati dinamiche.

Presentazioni simili


Presentazione sul tema: "Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 CDL in Ingegneria Elettronica - A.A. 2007-2008 13. Strutture dati dinamiche."— Transcript della presentazione:

1 Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 CDL in Ingegneria Elettronica - A.A. 2007-2008 13. Strutture dati dinamiche Ing. Simona Colucci

2 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 Indice Allocazione dinamica vs statica Allocazione e de-allocazione di memoria Liste e loro gestione

3 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 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

4 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 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

5 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 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)

6 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 Rischi della gestione dinamica della memoria Garbage production : –P = malloc(sizeof(TipoDato)); –P = Q; Dangling references: –P = Q; –free(Q);

7 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 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

8 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 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)

9 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 Dichiarazione standard; mette in evidenza il tipo della lista: ListaDiElemLista1, Lista2, Lista3; Dichiarazioni abbreviate: ElemLista*Lista1; Dichiarazione lista dinamica (2)

10 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 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: …

11 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 #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

12 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 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

13 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 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

14 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 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

15 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 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

16 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 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

17 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 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)

18 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 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)

19 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 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)

20 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 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)

21 Sistemi Informativi DEE - Politecnico di Bari Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 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


Scaricare ppt "Fondamenti di Informatica I CDL in Ingegneria Elettronica - A.A. 2007-2008 CDL in Ingegneria Elettronica - A.A. 2007-2008 13. Strutture dati dinamiche."

Presentazioni simili


Annunci Google