LISTE Una LISTA è una sequenza ordinata e finita di elementi, possiamo dire un multinsieme in cui lo stesso valore dell’insieme può essere presente anche più volte. Ciascun elemento della lista occupa una posizione ben precisa, come in una sequenza, quindi siamo in grado di individuare, il primo, il secondo….. l’ultimo elemento della lista. Generalmente un multinsieme è gestito attraverso l’uso dei vettori con allocazione statica della memoria, in questo caso si tratta dell’implementazione statica di una lista, basata su un array. Questa soluzione presenta però molti limiti: a) Allocazione di memoria statica: occupa, già inizialmente, tutto lo spazio richiesto dalla struttura b) Difficoltà ad inserire l’n+1-esimo elemento se gli n elementi previsi non sono sufficienti Nella risoluzione dei problemi informatici, si può rendere necessario dover gestire collezioni di dati, le cui dimensioni variano dinamicamente (ci sono casi in cui la dimensione degli elementi è sconosciuta al programmatore) e spesso, se ne vuole, allocare a tempo di esecuzione, solo la memoria strettamente necessaria; si ricorre, allora, ad una implementazione basata sulla gestione dinamica della memoria attraverso l’allocazione di riferimenti ad oggetti. L’oggetto, viene in un primo momento dichiarato, quindi gli viene assegnato un nome ed un indirizzo della zona di memoria chiamata STACK, e attraverso la funzione NEW viene creata una parte dinamica, allocata nella zona di memoria HEAP contenente tutte le caratteristiche specifiche del nostro oggetto e quindi la sua vera struttura, così come specificato nella classe a cui l’oggetto appartiene. Le celle di memoria dinamiche, sono create e distrutte, quando il programma è in esecuzione. Il Garbage Collector, speciale routine di sistema, provvede alla pulizia della memoria, infatti si occupa di ricercare nell’Heap, gli oggetti non più referenziati, rendendo disponibile la memoria che essi occupavano. Gli elementi della lista sono individuati come NODI, mentre i riferimenti sono individuati come ARCHI Nothing Radice o testa elementi della lista o NODI Un elemento della nostra lista, è una struttura a due campi, il primo campo contiene il valore dell’elemento, il secondo campo, contiene l’indirizzo di memoria in cui si trova l’elemento ad esso logicamente connesso (elemento successivo). Solo i tipi Riferimento, possono contenere il valore Nothing Attraverso la funzione IsNothing, utilizzabile solo sui tipi riferimento, è possibile determinare se è presente o meno un riferimento ad altro oggetto. Ogni elemento della lista conosce il suo successore, quindi partendo dal primo elemento della lista, è possibile attraversare tutti gli elementi. Le strutture dati dinamiche, sono gestire dal programmatore, attraverso operazioni che variano in funzione della forma di aggregazione dei vari elementi, generalmente possiamo classificarle in: PILA, CODA, LISTA, GRAFO ed ALBERO. PILA La PILA è una struttura dati dinamica gestita in modalità LIFO (LAST IN FIRST OUT), l’ultimo elemento inserito è il primo ad essere estratto, proprio come per una pila di piatti. Gli elementi si rappresentano come idealmente posizionati uno sopra l’altro, e vengono inseriti (PUSH) ed estratti (POP) dalla stessa estremità, uno alla volta. Questa struttura viene utilizzata, quando si vuole tenere traccia di informazioni da recuperare, nell’ordine inverso, rispetto all’ordine di inserimento (pensiamo, ad esempio all’operazione che permette di annullare le ultime operazioni eseguite) Inserimento (Push) Estrazione (Pop) Nothing Testa Inserimenti ed estrazioni avvengono dallo stesso estremo Inserimento Estrazione CODA La CODA è una struttura dinamica, gestita in modalità FIFO (FIRST IN FIRST OUT). L’inserimento (PUSH) degli elementi avviene ad una estremità; l’estrazione (POP) di un elemento avviene dal lato opposto. L’organizzazione a CODA viene utilizzata per memorizzare dinamicamente informazioni che devono essere recuperate nello stesso ordine con cui sono state inserite; esempio classico è una coda di clienti in fila allo sportello postale, oppure la gestione dello Spool di stampa, in cui i documenti da stampare devono essere prodotti con lo stesso ordine con cui sono inviati alla stampa. Nothing Nothing Inserimento in coda Nothing Estrazione in testa LISTA CONCATENATA La lista concatenata è una successione di elementi di cui conosce il riferimento al primo nodo detto testa, ed il riferimento all’ultimo nodo detto coda della lista o fondo. Esistono diversi tipi di lista: Lista semplice, Lista ordinata, Lista doppia che può essere percorsa nei due sensi. Gli inserimenti in una lista, possono avvenire in testa, in coda, oppure in una posizione all’interno della lista (per rispettare un ordine ben preciso).