Salvatore Cuomo Esercizi Strutture dati di tipo astratto Lezione n. 20 Parole chiave: Strutture dati, pile code, liste Corso di Laurea: Informatica Insegnamento: Programmazione II, modulo di Laboratorio Email Docente: salvatore.cuomo@unina.it A.A. 2009-2010
Le liste Definizione La Lista Lineare é una struttura estremamente flessibile, il numero dei nodi componenti può essere modificato dinamicamente. La Lista si può identificare con un elenco, di cui è possibile variare sia la lunghezza che l ordine. Nella lista lineare l ordinamento logico dei nodi non necessariamente corrisponde a quello fisico. Ogni nodo della struttura è una coppia: ( informazione, puntatore ) Il primo elemento contiene l informazione Il secondo contiene l indirizzo del nodo successivo secondo l ordinamento logico
Le liste Fisicamente una lista è una successione di nodi che occupano in memoria posizioni generiche. P 0 L accesso ad un nodo può avvenire solo per scansione dell intera lista, poiché non può essere noto a priori il suo indirizzo. Si osservi ad esempio che in un array, invece, ogni componente è accessibile direttamente perché identificato univocamente all indice L accesso al primo nodo della lista avviene attraverso un puntatore p0. L ultimo nodo ha un simbolo speciale, nel campo indirizzo, di solito lo zero, per indicare la fine della lista. 0
Definizione di una lista in C Una lista può essere definita attraverso una struttura di tipo nodo come segue; typedef struct nodo *nod_punt; struct nodo{ real data; nod_punt next; } Per creare un nodo bisogna allocare memoria attaverso l utilizzo di funzioni create allo scopo. nod_punt crea_nodo(real valore){ nod_punt new_punt; new_punt=(nod_punt)malloc(sizeof(struct nodo)); If (new_punt!= NULL){ new_punt->data = valore; new_punt->next = NULL; } return new_punt; }
Rimozione di un nodo da una lista in C In figura viene mostrata una procedura per la rimozione di un nodo da una lista. Per eliminare un nodo un nodo bisogna allocare memoria attraverso l utilizzo di funzioni create allo scopo. nod_punt elimina_nodo(nod_punt pnt); { If (pnt!= NULL) { pnt = pnt->next; } return pnt; } Si osservi che: Nel caso della cancellazione si può utilizzare una variabile found per indicare se l elemento cercato è presente nel nodo puntato da curr. Nel caso dell inserimento, il nodo da inserire andrà tra i nodi puntati da prev e da curr. Procedure remove(elenco, prev, curr); var: elenco = lista ordinata di nomi var: p0,curr,prev = puntatori a elenco begin if (prev 0) else punt(prev ) := punt(curr ); else p0 := punt(curr ); endif end remove;
Esempio 1 A C D P0 B E 0 In figura viene mostrata l eliminazione del nodo contenente B LIST2 in una lista di alfanumerici. Viene modificato solo il valore del puntatore del primo nodo. Si osservi che Il nodo contenente B non viene eliminato fisicamente.
Esempio 2 P0 1.2 9.0 0.1 0 LIST aggiornata P0 1.2 9.0 0.1 0 0.02 In figura viene mostrata l inserimento di un nodo al secondo posto di LIST: lista lineare di reali. Sono modificati i valori dei puntatori del primo nodoche adesso punterà al nodo inserito e di quest ultimo che conterrà il vecchio indirizzo del primo nodo.
Esercitazione La pila: funzioni principali La funzione int size(tipostack *s), ritorna la lunghezza della pila La funzione void destroy(tipostack *s), distrugge la la memoria allocata per la pila La funzione void deleteelement(tipostack *s, tipoelemento data), elimina un elemento della pila medinante la definizione delle operazioni ammesse per una pila: inserimento e prelievo dei dati solo dalla cima (top) della struttura Mostra funzione size() Mostra funzione destroy() Mostra funzione deleteelement()
La Pila versione dinamica Esempio Nel seguito si implementa un programma in Linguaggio C per la gestione delle pile utilizzando elementi di una LISTA dinamica. La definizione di un elemento della PILA avviene mediante una dichiarazione del tipo: struct ele{ int data; struct ele *next; }; Mentre lo Stack si definisce come: typedef struct{ int count; elem *top; }stack; Mostra Definzioni (parte I del programma)
La Pila versione dinamica cont Esempio Il programma principale ha inizio con l inizializzazione Della strutturaa stack mediante le direttive: vstack.top=null; vstack.count=0; Mostra Main (parte II del programma) Mostra Main (parte III del programma)
La Pila versione dinamica cont Esempio Il programma principale è strutturato in diversi moduli che di seguito verranno analizzati. La funzione void show(stack vstack), mostra gli elementi nello stack. La funzione void push(stack * vstack), inserisce gli elementi nello stack La funzione void pop(stack * vstack), elimina un elemento dallo Stack. Mostra void show() Mostra void push() Mostra void pop()
La Pila versione dinamica cont Esempio Il programma principale è strutturato in diversi moduli che di seguito verranno analizzati. La funzione void delete(stack * vstack), cancella elementi dallo stack liberando memoria. La funzione void top(stack vstack), restituisce la cima dello Stack. La funzione void isempty(stack vstack), verifica se lo Stack è vuoto. Mostra void delete() Mostra void top() Mostra void isempty()
La Pila versione dinamica cont Esempio Il programma principale è strutturato in diversi moduli che di seguito verranno analizzati. La funzione void isfull(stack vstack), verifica se lo Stack è pieno. La funzione void size(stack vstack), restituisce la dimensione dello Stack. Mostra void isfull() Mostra void size()
Materiali di studio Materiale di studio (1) Nick Parlante, LinkedListBasics [.pdf] (2) Nick Parlante, LinkedListProblems [.pdf] Libri consigliati (a) Donald Knuth. The Art of Computer Programming, Volume 1: Fundamental Algorithms, Third Edition.Addison- Wesley, 1997. ISBN 0-201-89683-4. Section 2.2.1: Stacks, Queues, and Deques, pp. 238--243. Sitografia essenziale [1] Definizione del National Institute of Standards and Technology (NIST) ( visitato ottobre 2009 ) http://www.itl.nist.gov/div897/sqg/dads/html/abstractdatatype.html [2] Donald Knuth ( visitato ottobre 2009 ) http://www-cs-faculty.stanford.edu/~knuth/taocp.html