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