Liste concatenate - INTRANETdemarco/sd/lezioni/lezione05.pdf · tail.setNext(node); // add node at...

37
Ø a y e x v head (front della coda) tail (rear della coda) il front della coda è memorizzato nel primo nodo (head) della lista il rear della coda è memorizzato nell’ultimo nodo (tail) della lista Liste concatenate Liste concatenate Implementazione della coda con liste concatenate Implementazione della coda con liste concatenate Strutture Dati

Transcript of Liste concatenate - INTRANETdemarco/sd/lezioni/lezione05.pdf · tail.setNext(node); // add node at...

Ø

aye x v

head (front della coda) tail (rear della coda)

il front della coda è memorizzato nel primo nodo (head) della lista

il rear della coda è memorizzato nell’ultimo nodo (tail) della lista

Liste concatenateListe concatenateImplementazione della coda con liste concatenateImplementazione della coda con liste concatenate

Strutture Dati

ADT CodaADT CodaImplementazione con liste concatenateImplementazione con liste concatenate

Strutture Dati

public class NodeQueue<E> implements Queue<E>{ protected Node<E> head, tail; // the head and tail nodes protected int size;

/** Creates an empty queue. */ public NodeQueue() { head = null; tail = null; size = 0; } public int size() { //# Return the current queue size return size; } public boolean isEmpty() { //# Returns true iff queue is empty if ( (head==null) && (tail==null) ) return true; return false; }...

Strutture Dati

... public void enqueue(E elem) { Node<E> node = new Node<E>(); node.setElement(elem); node.setNext(null); // node will be new tail node if (size == 0) head = node; // special case of a previously empty queue else tail.setNext(node); // add node at the tail of the list tail = node; // update the reference to the tail node size++; }

public E front() //# Return the first queue element throws EmptyQueueException { if (size == 0) throw new EmptyQueueException("Queue is empty."); return head.getElement(); }...

ADT CodaADT CodaImplementazione con liste concatenateImplementazione con liste concatenate

Strutture Dati

... public E dequeue() throws EmptyQueueException { if (size == 0) throw new EmptyQueueException("Queue is empty."); E tmp = head.getElement(); head = head.getNext(); size--; if (size == 0) tail = null; // the queue is now empty return tmp; }}

ADT CodaADT CodaImplementazione con liste concatenateImplementazione con liste concatenate

La lista di nodi (Node List)La lista di nodi (Node List)Il concetto di posizioneIl concetto di posizione

il concetto di posizione formalizza l'idea di posto di un elemento

La lista di nodi (node list) è un contenitore di oggetti che:

memorizza ciascun elemento in una posizione

mantiene le posizioni degli oggetti in un ordinamento lineare

La posizione non è altro che il nome che permette di riferirsi all'elemento ad essa associato

Strutture Dati

posizione L

Attenzione: la posizione è associata sempre allo stesso elemento

La lista di nodi (Node List)La lista di nodi (Node List)Il concetto di posizioneIl concetto di posizione

Strutture Dati

Attenzione: la posizione è associata sempre allo stesso elemento

posizione L

non cambia mai, neanche in seguito a inserimenti

La lista di nodi (Node List)La lista di nodi (Node List)Il concetto di posizioneIl concetto di posizione

Strutture Dati

Attenzione: la posizione è associata sempre allo stesso elemento

posizione L

non cambia mai, neanche in seguito a inserimenti o cancellazioni

La lista di nodi (Node List)La lista di nodi (Node List)Il concetto di posizioneIl concetto di posizione

Strutture Dati

Morale: continueremo a riferirci allo stesso elemento con la stessa posizione

Attenzione: la posizione è associata sempre allo stesso elemento

posizione L

La lista di nodi (Node List)La lista di nodi (Node List)Il concetto di posizioneIl concetto di posizione

Strutture Dati

La posizione come tipo astratto di datiLa posizione come tipo astratto di dati

La posizione definisce essa stessa un tipo astratto di dati che supporta il seguente unico metodo:

element(): Restituisce l'elemento in questa posizione

La lista di nodi (Node List)La lista di nodi (Node List)

Strutture Dati

Il tipo astratto di dati Node ListIl tipo astratto di dati Node ListTipo di dati e operazioniTipo di dati e operazioni

Tipi di dati:oggetti arbitrari (come al solito)

Operazioni:

Metodi generici:

- integer size()

- boolean isEmpty()

Metodi di accesso:

- Position first(): Restituisce la posizione del primo elemento della lista

- Position last(): Restituisce la posizione dell’ultimo elemento della lista

- Position prev(Position p): Restituisce la posizione dell’ elemento che precede l’elemento in posizione p

- Position next(Position p): Restituisce la posizione dell’ elemento che segue l’elemento in posizione p

Strutture Dati

Metodi di aggiornamento:

- E set(Position p, E e): Rimpiazza l'elemento in posizione p con e, restituendo l'elemento che prima era in posizione p

- addBefore (Position p, E e): Inserisce l’elemento e nella posizione che precede la posizione p

- addAfter(Position p, E e): Inserisce l’elemento e nella posizione che segue la posizione p

- addFirst(E e): Inserisce l’elemento e come primo elemento

- addLast(E e): Inserisce l'elemento e come ultimo elemento

- E remove(Position p): Rimuove e restituisce l’elemento in posizione p

Strutture Dati

Il tipo astratto di dati Node ListIl tipo astratto di dati Node ListTipo di dati e operazioniTipo di dati e operazioni

Il tipo astratto di dati Node ListIl tipo astratto di dati Node ListEccezioniEccezioni

InvalidPositionException

Viene lanciata quando viene specificata come argomento una posizione non valida(ad esempio la posizione è null oppure è inesistente)

BoundaryViolationException

Viene lanciata quando si tenta di accedere ad una posizione al di fuori della lista(ad esempio si chiama il metodo next sull'ultima posizione della lista)

EmptyListExceptionViene lanciata quando si invocano i metodi first() o last() su una lista vuota

Strutture Dati

Il tipo astratto di dati Node ListIl tipo astratto di dati Node ListL'interfaccia PositionL'interfaccia Position

package position;

public interface Position<E> {E element();

}

Strutture Dati

Il tipo astratto di dati Node ListIl tipo astratto di dati Node ListL'interfaccia PositionListL'interfaccia PositionList

public interface PositionList<E> {

public int size(); public boolean isEmpty();

public Position<E> first() throws EmptyListException;

public Position<E> last() throws EmptyListException;

public Position<E> next(Position<E> p) throws InvalidPositionException, BoundaryViolationException;

public Position<E> prev(Position<E> p) throws InvalidPositionException, BoundaryViolationException; public void addFirst(E e);

public void addLast(E e);

...}

Strutture Dati

Il tipo astratto di dati Node ListIl tipo astratto di dati Node ListL'interfaccia PositionListL'interfaccia PositionList

public interface PositionList<E> {

... public void addAfter(Position<E> p, E e) throws InvalidPositionException; public void addBefore(Position<E> p, E e) throws InvalidPositionException;

public E remove(Position<E> p) throws InvalidPositionException;

public E set(Position<E> p, E e) throws InvalidPositionException;

}

Strutture Dati

Implementazione basata su liste dopp. concatenateImplementazione basata su liste dopp. concatenate

header trailer

Liste doppiam. concatenate

NODI

ADT Lista

POSIZIONI

I nodi della lista doppiamente concatenata implementano le posizioni dell'ADT node list

Il tipo astratto di dati Node ListIl tipo astratto di dati Node List

Strutture Dati

Implementazione dell'interfaccia PositionImplementazione dell'interfaccia PositionIl tipo astratto di dati Node ListIl tipo astratto di dati Node List

public class DNode<E> implements Position<E> { private DNode<E> prev, next; private E element;

public DNode(DNode<E> newPrev, DNode<E> newNext, E elem) { prev = newPrev; next = newNext; element = elem; }

public E element() { if ((prev == null) && (next == null)) throw new InvalidPositionException("La posizione non e` in una lista!"); return element; } public DNode<E> getNext() { return next; } public DNode<E> getPrev() { return prev; } public void setNext(DNode<E> newNext) { next = newNext; } public void setPrev(DNode<E> newPrev) { prev = newPrev; } public void setElement(E newElement) { element = newElement; }}

Strutture Dati

Implementazione di addAfterImplementazione di addAfter

header trailer

A B C

posizione p

Algorithm addAfter(p,e):

Il tipo astratto di dati Node ListIl tipo astratto di dati Node List

Strutture Dati

Algorithm addAfter(p,e):

Crea un nuovo nodo v

header trailer

A B C

posizione p

Implementazione di addAfterImplementazione di addAfterIl tipo astratto di dati Node ListIl tipo astratto di dati Node List

Strutture Dati

e

Algorithm addAfter(p,e):

Crea un nuovo nodo vv.setElement(e)

header trailer

A B C

posizione p

Implementazione di addAfterImplementazione di addAfterIl tipo astratto di dati Node ListIl tipo astratto di dati Node List

Strutture Dati

Algorithm addAfter(p,e):

Crea un nuovo nodo vv.setElement(e)v.setPrev(p)

header trailer

A B C

posizione p

e

Implementazione di addAfterImplementazione di addAfterIl tipo astratto di dati Node ListIl tipo astratto di dati Node List

Strutture Dati

Algorithm addAfter(p,e):

Crea un nuovo nodo vv.setElement(e)v.setPrev(p)v.setNext(p.getNext())

e

header trailer

A B C

posizione p

Implementazione di addAfterImplementazione di addAfterIl tipo astratto di dati Node ListIl tipo astratto di dati Node List

Strutture Dati

Algorithm addAfter(p,e):

Crea un nuovo nodo vv.setElement(e)v.setPrev(p)v.setNext(p.getNext())(p.getNext()).setPrev(v)

e

header trailer

A B C

posizione p

Implementazione di addAfterImplementazione di addAfterIl tipo astratto di dati Node ListIl tipo astratto di dati Node List

Strutture Dati

Algorithm addAfter(p,e):

Crea un nuovo nodo vv.setElement(e)v.setPrev(p)v.setNext(p.getNext())(p.getNext()).setPrev(v)p.setNext(v)

header trailer

A B C

posizione p

e

Implementazione di addAfterImplementazione di addAfterIl tipo astratto di dati Node ListIl tipo astratto di dati Node List

Strutture Dati

Algorithm remove(p):

D

Il tipo astratto di dati Node ListIl tipo astratto di dati Node List

header trailer

A B

posizione p

C

posizione p.getPrev()

posizione p.getNext()

Implementazione di removeImplementazione di remove

Strutture Dati

Algorithm remove(p):

temp := p.element(p.getPrev()).setNext(p.getNext())

D

header trailer

A B

posizione p

C

posizione p.getPrev()

posizione p.getNext()

Il tipo astratto di dati Node ListIl tipo astratto di dati Node ListImplementazione di removeImplementazione di remove

Strutture Dati

Algorithm remove(p):

temp := p.element(p.getPrev()).setNext(p.getNext())(p.getNext()).setPrev(p.getPrev())

D

header trailer

A B

posizione p

C

posizione p.getPrev()

posizione p.getNext()

Il tipo astratto di dati Node ListIl tipo astratto di dati Node ListImplementazione di removeImplementazione di remove

Strutture Dati

Algorithm remove(p):

temp := p.element(p.getPrev()).setNext(p.getNext())(p.getNext()).setPrev(p.getPrev())p.setPrev( null )

D

header trailer

A B

posizione p

C

posizione p.getPrev()

posizione p.getNext()

Ø

Il tipo astratto di dati Node ListIl tipo astratto di dati Node ListImplementazione di removeImplementazione di remove

Strutture Dati

Algorithm remove(p):

temp := p.element(p.getPrev()).setNext(p.getNext())(p.getNext()).setPrev(p.getPrev())p.setPrev( null )p.setNext( null )

D

header trailer

A B

posizione p

C

posizione p.getPrev()

posizione p.getNext()

Ø Ø

Il tipo astratto di dati Node ListIl tipo astratto di dati Node ListImplementazione di removeImplementazione di remove

Strutture Dati

Algorithm remove(p):

temp := p.element(p.getPrev()).setNext(p.getNext())(p.getNext()).setPrev(p.getPrev())p.setPrev( null )p.setNext( null )return temp

D

header trailer

A B

posizione p

C

posizione p.getPrev()

posizione p.getNext()

Ø Ø

Il tipo astratto di dati Node ListIl tipo astratto di dati Node ListImplementazione di removeImplementazione di removeIl tipo astratto di dati Node ListIl tipo astratto di dati Node ListImplementazione di removeImplementazione di removeIl tipo astratto di dati Node ListIl tipo astratto di dati Node ListImplementazione di removeImplementazione di removeIl tipo astratto di dati Node ListIl tipo astratto di dati Node ListImplementazione di removeImplementazione di remove

Strutture Dati

Implementazione dell'interfaccia PositionListImplementazione dell'interfaccia PositionListIl tipo astratto di dati Node ListIl tipo astratto di dati Node List

import position.*;

public class NodePositionList<E> implements PositionList<E> {

protected int numElts; // Numero di elementi nella lista protected DNode<E> header, trailer; // Nodi sentinella

public NodePositionList() { numElts = 0; header = new DNode<E>(null, null, null); trailer = new DNode<E>(header, null, null); header.setNext(trailer); }

...}

Strutture Dati

Implementazione dell'interfaccia PositionListImplementazione dell'interfaccia PositionListIl tipo astratto di dati Node ListIl tipo astratto di dati Node List

public class NodePositionList<E> implements PositionList<E> {... public int size() { return numElts; } public boolean isEmpty() { return (numElts == 0); } public Position<E> first() throws EmptyListException { if (isEmpty()) throw new EmptyListException("La lista e` vuota"); return header.getNext(); }

public Position<E> last() throws EmptyListException { if (isEmpty()) throw new EmptyListException("La lista e` vuota"); return trailer.getPrev(); }...}

Strutture Dati

Implementazione dell'interfaccia PositionListImplementazione dell'interfaccia PositionListIl tipo astratto di dati Node ListIl tipo astratto di dati Node List

public class NodePositionList<E> implements PositionList<E> {... protected DNode<E> checkPosition(Position<E> p) throws InvalidPositionException { if (p == null) throw new InvalidPositionException

("Null passato come posizione"); if (p == header) throw new InvalidPositionException

("header non e` una posizione valida di una lista"); if (p == trailer) throw new InvalidPositionException

("trailer non e` una posizione valida di una lista"); try { DNode<E> temp = (DNode<E>) p; if ((temp.getPrev() == null) || (temp.getNext() == null))

throw new InvalidPositionException ("La posizione non fa parte di una lista");

return temp; } catch (ClassCastException e) { throw new InvalidPositionException

("Il tipo della posizione non e` valido per questa lista"); } }...}

Strutture Dati

Implementazione dell'interfaccia PositionListImplementazione dell'interfaccia PositionListIl tipo astratto di dati Node ListIl tipo astratto di dati Node List

public class NodePositionList<E> implements PositionList<E> {...

public Position<E> prev(Position<E> p) throws InvalidPositionException, BoundaryViolationException { DNode<E> v = checkPosition(p); DNode<E> prev = v.getPrev(); if (prev == header) throw new BoundaryViolationException

("non posso retrocedere oltre l'inizio della lista"); return prev; }

public Position<E> next(Position<E> p) throws InvalidPositionException, BoundaryViolationException { DNode<E> v = checkPosition(p); DNode<E> next = v.getNext(); if (next == trailer) throw new BoundaryViolationException

("non posso avanzare oltre la fine della lista"); return next; }...}

Strutture Dati

Implementazione dell'interfaccia PositionListImplementazione dell'interfaccia PositionListIl tipo astratto di dati Node ListIl tipo astratto di dati Node List

public class NodePositionList<E> implements PositionList<E> {...

public void addAfter(Position<E> p, E element) throws InvalidPositionException { DNode<E> v = checkPosition(p); numElts++; DNode<E> newNode = new DNode<E>(v, v.getNext(), element); v.getNext().setPrev(newNode); v.setNext(newNode); }

public void addFirst(E element) { numElts++; DNode<E> newNode = new DNode<E>(header, header.getNext(), element); header.getNext().setPrev(newNode); header.setNext(newNode); }

...}

Strutture Dati

Implementazione dell'interfaccia PositionListImplementazione dell'interfaccia PositionListIl tipo astratto di dati Node ListIl tipo astratto di dati Node List

public class NodePositionList<E> implements PositionList<E> {...

public E remove(Position<E> p) throws InvalidPositionException { DNode<E> v = checkPosition(p); numElts--; DNode<E> vPrev = v.getPrev(); DNode<E> vNext = v.getNext(); vPrev.setNext(vNext); vNext.setPrev(vPrev); E vElem = v.element(); // scollega la posizione dalla lista rendendola invalida v.setNext(null); v.setPrev(null); return vElem; }

...}

Strutture Dati