Sei sulla pagina 1di 22

Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate

Laboratorio di Programmazione II Corso di Laurea in Bioinformatica Dipartimento di Informatica - Universit di Verona

Strutture Lineari: Lista

Sommario
Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate

Denizione Lista Implementazione tramite array Implementazione tramite stutture 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 l'interfaccia Lista


Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate

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)

Realizzazione basata su array


Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate

Implementazione Lista con array


Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate

Lista basata su Array Utilizzo un array per memorizzare gli elementi


private Object[] elementi;

L'array ha una dimensione iniziale ssata

private int dimensioneIniziale = 20;

Un campo intero mantiene il numero di oggetti attivi


private int nOggetti;

Costruttori
Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate

Costruttori Costruttore senza argomenti

public ListaArray(){ elementi = new Object[dimensioneIniziale]; nOggetti = 0; }

Costruttore con un argomento a cui passo la dimensione iniziale dell'array


public ListaArray(int capacita){ dimensioneIniziale = capacita; elementi = new Object[dimensioneIniziale]; nOggetti = 0; }

Gestione dimensione array


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 servizi


Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate

Implementazione dei metodi dell'interfaccia Gestione accesso a regioni non valide dell'array: Classe ListaArray.java

genero un eccezione IndexOutOfBoundsException

Esercizi
Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate

Esercizi su ListaArray implementare i seguenti metodi della classe ListaArray.java


il metodo indexOf(Object) il metodo remove(Object)
[consiglio] usare il metodo indexOf(Object o) ed il metodo remove(int k) gi implementati

Realizzazione basata su strutture collegate


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

Implementazione Lista con strutture collegate: ListaLink


Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate

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; } } ... }

Implementazione Lista con strutture collegate: ListaLink


Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate

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;

Implementazione Lista con strutture collegate: ListaLink


Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate

Costruttore
public ListaLink(){ head = null; nOggetti = 0; }

Nessun bisogno di denire la capacita' iniziale.

Implementazione Lista con strutture collegate: ListaLink


Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate

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:

creo un nuovo nodo modico i collegamenti per ottenere la struttura desiderata

Implementazione dei servizi


Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate

Implementazione dei metodi pubblici dell'interfaccia Gestione accesso a regioni non valide: Classe ListaLink.java

genero un eccezione IndexOutOfBoundsException

Confronto tra le implementazioni


Strutture Lineari: Lista Denizione Lista Realizzazione basata su array Realizzazione basata su strutture collegate

array vs. strutture collegate ListaArray

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

Esercizi su ListaLink Implementare il metodo Object remove(int k) della classe ListaLink.java

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

Potrebbero piacerti anche