lista - SisInfLab - Politecnico di Bari

13. Strutture dati dinamiche
Ing. Simona Colucci
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
Sistemi Informativi
DEE - Politecnico di Bari
Indice
• Allocazione dinamica vs statica
• Allocazione e de-allocazione di memoria
• Liste e loro gestione
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
Sistemi Informativi
DEE - Politecnico di Bari
Allocazione dinamica della memoria
• Gestione dinamica della memoria per memorizzare una quantità
variabile di dati in funzione di esigenze note solo durante
l’esecuzione del programma e modificabili durante l’esecuzione
• Consente di :
– Aggiungere un nuovo elemento nell’area dati di un programma in fase
di esecuzione
– Eliminare l’elemento 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
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
Sistemi Informativi
DEE - Politecnico di Bari
•
Allocazione e cancellazione
di memoria
Allocazione:
malloc (sizeof (TipoDato));
– Crea in memoria una variabile di tipo TipoDato, e restituisce come risultato
l’indirizzo della variabile creata
– Se P è una variabile di tipo puntatore a TipoDato, l’istruzione:
P = malloc(sizeof(TipoDato));
assegna l’indirizzo restituito dalla funzione malloc a P
•
Cancellazione:
free(P)
– Rilascia lo spazio di memoria puntato da P
•
Le due funzioni sono in <stdlib.h>
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
Sistemi Informativi
DEE - Politecnico di Bari
Gestione della memoria
della macchina astratta
...
Punt1
Punt2
Record di
attivazione
di Proc
5
...
Stack
3
Heap
•Stack: pila per la gestione delle variabili dichiarate (LIFO)
•Heap: “mucchio” per le variabili create dinamicamente (allocazione a
deallocazione gestite direttamente dal programmatore)
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
Sistemi Informativi
DEE - Politecnico di Bari
Rischi della gestione dinamica
della memoria
• Garbage production
:
– P = malloc(sizeof(TipoDato));
– P = Q;
• Dangling references:
– P = Q;
– free(Q);
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
Sistemi Informativi
DEE - Politecnico di Bari
Lista dinamica
• Costruzione e gestione della struttura dinamica(pseudotipo
astratto) lista mediante puntatori:
Elemento
Puntatore
1 della
a elemento
lista
2
Puntatore NULL
Ultimo
elemento
Lista
e1
e2
Puntatore alla
“testa di lista”“testa di lista”
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
en
“coda di lista”
Sistemi Informativi
DEE - Politecnico di Bari
Dichiarazione lista dinamica (1)
Invece di dichiarare il tipo lista, si dichiarano i suoi elementi:
struct EL
{
int
struct EL
Info;
*Prox;
typedef
struct EL
ElemLista;
typedef
ElemLista
*ListaDiElem;
};
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
Sistemi Informativi
DEE - Politecnico di Bari
•
Dichiarazione standard; mette in evidenza il tipo della lista:
ListaDiElem
•
Dichiarazione lista dinamica (2)
Lista1, 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.
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
Sistemi Informativi
DEE - Politecnico di Bari
Operazioni sulle liste:
Inizializzazione (1)
•
Assegna il valore NULL alla variabile “testa della lista”:
•
Effettua l’operazione: Inizializza (Lista):
Lista
•
Se però vogliamo eseguire l’operazione in maniera parametrica: …
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
Sistemi Informativi
Inizializzazione (2)
DEE - Politecnico di Bari
#include <stdlib.h>
void Inizializza (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;
}
•
L’istruzione
Inizializza(&Lista1);
produce:
Lista
Lista1
•
Al termine dell’esecuzione, il parametro formale Lista viene eliminato
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
Sistemi Informativi
DEE - Politecnico di Bari
boolean
Controllo di lista vuota
ListaVuota (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)
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
Sistemi Informativi
DEE - Politecnico di Bari
Ricerca di un elemento nella lista
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;
}
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
Sistemi Informativi
DEE - Politecnico di Bari
Ricerca di un elemento nella lista,
versione ricorsiva
boolean Ricerca (ListaDiElem Lista, int ElemCercato)
{
if (Lista == NULL)
return false;
else
if (Lista–>Info == ElemCercato)
return true;
else
return Ricerca(Lista–>Prox, ElemCercato);
}
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
Sistemi Informativi
DEE - Politecnico di Bari
Estrazione della testa
e della coda di una lista
int TestaLista (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 */
ListaDiElem
CodaLista (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 */
CodaLista
Ultimo
elemento
Lista
e1
e2
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
en
Sistemi Informativi
DEE - Politecnico di Bari
Inserimento di un nuovo elemento
in testa alla lista (1)
Punt
Lista
e1
e2
en
Punt = malloc(sizeof(ElemLista));
Punt–>Info = Elem;
Punt
Elem
Lista
e1
e2
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
en
Inserimento di un nuovo elemento
in testa alla lista (2)
Sistemi Informativi
DEE - Politecnico di Bari
•
Infine si collega il nuovo elemento al precedente primo elemento
della lista e la testa della lista viene fatta puntare al nuovo
elemento:
Punt
Elem
Lista
e1
e2
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
en
Inserimento di un nuovo elemento
in testa alla lista (3)
Sistemi Informativi
DEE - Politecnico di Bari
void InsercisciInTesta (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;
}
Lista
Punt
Elem
e1
e2
en
Lista1
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
Sistemi Informativi
DEE - Politecnico di Bari
Inserimento di un nuovo elemento
in coda alla lista(1)
void
InserisciInCoda (ListaDiElem
*Lista, int
{
ElemLista
*Punt;
if (ListaVuota (*Lista))
{
Punt = malloc(sizeof(ElemLista));
Punt–>Prox = NULL;
Punt–>Info = Elem;
*Lista = Punt;
}
else InserisciIncoda (&((*Lista)–>Prox), Elem);
}
Elem);
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
Inserimento di un nuovo elemento
in coda alla lista(2)
Sistemi Informativi
DEE - Politecnico di Bari
Lista*1
Lista*2
e1
Lista*3
e2
Lista*n
en-1
Lista*n+1
en
Lista1
Lista*1
Lista*2
e1
Lista*3
e2
Lista*n+1
en-1
Punt
Elem
en
Lista1
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
Sistemi Informativi
DEE - Politecnico di Bari
Lista*1
Inserimento di un nuovo elemento
in coda alla lista(3)
Lista*2
e1
Lista*3
e2
Lista*n+1
en-1
Punt
Elem
en
Lista1
Lista*1
Lista*2
e1
Lista*3
e2
Lista*n+1 Punt
en-1
en
Lista1
Fondamenti di Informatica I
CDL in Ingegneria Elettronica - A.A. 2006-2007
Elem