15 maggio 2002
Avvisi:
• Ultima lezione: mercoledì 29 maggio
• II Esonero: mercoledì 5 giugno, ora da stabilire
Strutture dati dinamiche
La dimensione cresce e diminuisce durante
l’esecuzione
• Liste linkate - inserimenti e cancellazioni in qualunque
punto
• Pile (Stacks) – inserimenti e cancellazioni solo alla
testa della pila
• Code (Queue) – inserimenti solo alla fine e
cancellazioni solo all’inizio
• Alberi binari – efficienti operazioni di ricerca e
ordinamento , eliminazione di chiavi duplicate
Strutture auto-referenzianti (ricorsive)
– Le strutture possono contenere come membro un
puntatore ad una struttura dello stesso tipo
– Possono essere collegate (linkate) insieme per formare
strutture dati molto importanti: liste, pile, code e alberi
– Terminano con un puntatore NULL (0)
• Due strutture ricorsive linkate insieme
15
Membri: dati
e puntatore
10
puntatore NULL (punta a niente)
Strutture auto-referenzianti (ricorsive)
struct node {
int data;
struct node *nextPtr;
}
• nextPtr – punta ad un oggetto del tipo node
– Si chiama link : collega un node ad un altro node
Allocazione dinamica della memoria
• malloc
– Prende il numero di byte da allocare
– Usa sizeof per determinare la size di un oggetto
– Restituisce un puntatore di tipo void *
• Un puntatore void * puo’ essere assegnato a qualunque puntatore
• Se non c’e’ memoria disponibile, restituisce NULL
– newPtr = malloc( sizeof( struct node ) );
• free
– De-alloca la memoria allocata con malloc
– Prende un puntatore come argomento
– free (newPtr);
Liste linkate (concatenate)
– Collezione lineare di strutture ricorsive, chiamate nodi,
connesse da puntatori chiamati links
– Si accede ad una lista tramite un puntatore al primo nodo
della lista
– I nodi successivi sono raggiunti via i membri puntatori-link.
– Il puntatore link dell’ultimo nodo e’ settato a null per
indicare la fine della lista
Si usa una lista linkata invece che un array quando:
– Il numero degli elementi non e’ predicibile
– La lista ha bisogno di essere ordinata
Liste linkate
– Lista singolarmente linkata
• Comincia con un puntatore al primo nodo
• Termina con un puntatore null
• Si attraversa solo in una direzione
– Lista circolare singolarmente linkata
• Il puntatore dell’ultimo nodo punta al primo nodo
– Lista doppiamente linkata
• Due “puntatori start”: il primo e l’ultimo elemento
• Ogni nodo ha un puntatore in avanti e uno all’indietro
• Consente attraversamenti sia in avanti che all’indietro
– Lista circolare doppiamente linkata
• Il puntatore in avanti dell’ultimo nodo punta al primo nodo,
mentre il puntatore all’indietro dell’ultimo nodo punta
all’ultimo nodo
Manipolazione e manutenzione di una lista
Analizziamo il codice lista.c direttamente sul
compilatore…
Esercizi
Integrare il programma lista.c con le seguenti funzioni:
• Funzione search che ricerca un dato valore all’interno di
una lista concatenata. La funzione dovra’ restituire il puntatore
a quel valore o null nel caso che tale valore non sia presente
nella lista.
• Funzione r_search : come la precedente, ma ricorsiva
• Riscrivere la funzione delete in modo che utilizzi
esplicitamente la funzione search (o r_search)
• Funzione inverse che restituisce la liste con gli elementi
in ordine inverso
Esercizi
• Funzione count che restituisce il numero di elementi di una
lista
• Funzione buildlist che prende in input una sequenza di
valori e restituisce una lista in cui tali valori sono ordinati (la
funzione utilizza insert)
• Funzione concatenate che prende due liste e restituisce una
lista ottenuta concatenando la seconda alla fine della prima