Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Sommario
Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate
Denizione Lista
Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate
Lista
Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate
Operazioni di base Una lista L una sequenza nita di elementi di un insieme ssato U L =< a0 , a1 , ..., an > isEmpty(L): vero se L=<>, falso altrimenti. get(L,k): restituisce ak se 0 k n, errore altrimenti. length(L): restituisce 0 se L =<>, n+1 altrimenti. remove(L,k): elimina ak (la lista diventa < a0 , ..., ak 1 , ak +1 , ..., an >) e restituisce ak se 0 k n, errore altrimenti. insert(L,k,u): inserisce u in posizione k , spostando gli elementi a destra, se 0 k n, errore altrimenti.
Lista
Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate
Altre Operazioni Possono essere costruite utilizzando le operazioni di base: switch(L,u,k): scambia u con ak se 0<=k<=n isIn(L,u): vero se u appartiene alla lista false altrimenti
ciclo sulla lista e controllo ogni elemento con get insert(L,k,u) + remove(L,k+1)
Interfaccia Lista
Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate
Lista
Deniamo una interfaccia con i metodi fondamentali per una Lista Lista.java
Realizzare Lista Possiamo poi realizzare la lista in diversi modi. Punto chiave: come memorizziamo gli elementi della lista. Due possibilita' principali:
1 2
utilizzando un array (memoria statica) utilizzando una struttura collegata (memoria dinamica)
Costruttori
Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate
gestione array L'array non puo' variare la dimensione Debbo gestire la situazione in cui gli elementi che voglio aggiungere eccedono la dimensione iniziale scelta ogni volta che eccedo la dimensione iniziale creo un nuovo array con dimensione = dim. attuale + dim iniziale copio nel nuovo array gli elementi presenti trade-o
dimensione iniziale piccola rallentamenti nell'inserimento perche' debbo creare un nuovo array e copiare gli elementi presenti in quello vecchio dimensione iniziale grande spreco memoria
Implementazione dei metodi dell'interfaccia Gestione accesso a regioni non valide dell'array: Classe ListaArray.java
Esercizi
Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate
Strutture Collegate
Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate
Concetti di Base creazione dinamica della memoria per contenere gli oggetti della lista Nodo, struttura dati fondamentale:
Contiene l'elemento della lista Un collegamento al prossimo elemento
La lista un insieme di nodi collegati Un nodo iniziale mantiene il collegamento al primo nodo della lista L'ultimo nodo ha un collegamento a null
La classe Node Puo' essere dichiarata come classe annidata protected puo' essere utilizzata da eventuali classi derivate static non si riferisce ad un istanza di ListaLink
public class ListaLink implements Lista { protected static class Node { protected Object key; protected Node next; public Node(Object o) { key = o; next = null; } } ... }
Strutture per memorizzare la lista campo head collegato al primo nodo della lista
private Node head;
campo nOggetti mantiene il numero di elementi presente nell lista (Non necessario ma eciente)
private int nOggetti;
Costruttore
public ListaLink(){ head = null; nOggetti = 0; }
Gestione della lista Per accedere elemento k, debbo scandire la lista Quando elimino un elemento: modico i collegamenti per ottenere la struttura desiderata Quando inserisco un nuovo elemento:
Implementazione dei metodi pubblici dell'interfaccia Gestione accesso a regioni non valide: Classe ListaLink.java
ListaLink
accesso elemento O(1) Lunghezza pressata, riallocazione memoria quando si eccede la lunghezza dell'array accesso elemento O(n) (accesso sequenziale) allocata solo la memoria necessaria
Esercizi
Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate
si debbono considerare due casi: quando l'indice rappresenta il primo elemento della lista e quando l'indice rappresenta un elemento generico
Implementare il metodo Object[] toArray() della classe ListaLink Implementare il metodo eliminaDoppi() della classe ListaLink facoltativo Implementare il metodo equals() della classe ListaLink