Liste concatenate
Implementazione della coda con liste concatenate
head (front della coda)
tail (rear della coda)
Ø
e
y
a
x
v
il front della coda è memorizzato nel primo nodo (head) della lista
il rear della coda è memorizzato nell’ultimo nodo (tail) della lista
Strutture Dati
ADT Coda
Implementazione con liste concatenate
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 size;
}
//# Return the current queue size
public boolean isEmpty() { //# Returns true iff queue is empty
if ( (head==null) && (tail==null) )
return true;
return false;
}
...
Strutture Dati
ADT Coda
Implementazione con liste concatenate
...
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();
}
...
Strutture Dati
ADT Coda
Implementazione con liste concatenate
...
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;
}
}
Strutture Dati
La lista di nodi (Node List)
Il concetto di posizione
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
il concetto di posizione formalizza l'idea di posto di un elemento
La posizione non è altro che il nome che permette di riferirsi
all'elemento ad essa associato
Strutture Dati
La lista di nodi (Node List)
Il concetto di posizione
Attenzione: la posizione è associata sempre allo stesso elemento
posizione L
Strutture Dati
La lista di nodi (Node List)
Il concetto di posizione
Attenzione: la posizione è associata sempre allo stesso elemento
posizione L
non cambia mai, neanche in seguito a inserimenti
Strutture Dati
La lista di nodi (Node List)
Il concetto di posizione
Attenzione: la posizione è associata sempre allo stesso elemento
posizione L
non cambia mai, neanche in seguito a inserimenti o cancellazioni
Strutture Dati
La lista di nodi (Node List)
Il concetto di posizione
Attenzione: la posizione è associata sempre allo stesso elemento
posizione L
Morale: continueremo a riferirci allo stesso elemento con la stessa posizione
Strutture Dati
La lista di nodi (Node List)
La 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
Strutture Dati
Il tipo astratto di dati Node List
Tipo 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
Il tipo astratto di dati Node List
Tipo di dati e operazioni
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 List
Eccezioni
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)
EmptyListException
Viene lanciata quando si invocano i metodi first() o last() su una lista vuota
Strutture Dati
Il tipo astratto di dati Node List
L'interfaccia Position
package position;
public interface Position<E> {
E element();
}
Strutture Dati
Il tipo astratto di dati Node List
L'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 List
L'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
Il tipo astratto di dati Node List
Implementazione basata su liste dopp. concatenate
header
Liste doppiam.
concatenate
NODI
trailer
ADT Lista
POSIZIONI
I nodi della lista doppiamente concatenata implementano le posizioni dell'ADT node list
Strutture Dati
Il tipo astratto di dati Node List
Implementazione dell'interfaccia Position
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
Il tipo astratto di dati Node List
Implementazione di addAfter
Algorithm addAfter(p,e):
posizione p
header
trailer
A
Strutture Dati
B
C
Il tipo astratto di dati Node List
Implementazione di addAfter
Algorithm addAfter(p,e):
Crea un nuovo nodo v
posizione p
header
trailer
A
Strutture Dati
B
C
Il tipo astratto di dati Node List
Implementazione di addAfter
Algorithm addAfter(p,e):
Crea un nuovo nodo v
v.setElement(e)
posizione p
header
trailer
A
B
e
Strutture Dati
C
Il tipo astratto di dati Node List
Implementazione di addAfter
Algorithm addAfter(p,e):
Crea un nuovo nodo v
v.setElement(e)
v.setPrev(p)
posizione p
header
trailer
A
B
e
Strutture Dati
C
Il tipo astratto di dati Node List
Implementazione di addAfter
Algorithm addAfter(p,e):
Crea un nuovo nodo v
v.setElement(e)
v.setPrev(p)
v.setNext(p.getNext())
posizione p
header
trailer
A
B
e
Strutture Dati
C
Il tipo astratto di dati Node List
Implementazione di addAfter
Algorithm addAfter(p,e):
Crea un nuovo nodo v
v.setElement(e)
v.setPrev(p)
v.setNext(p.getNext())
(p.getNext()).setPrev(v)
posizione p
header
trailer
A
B
e
Strutture Dati
C
Il tipo astratto di dati Node List
Implementazione di addAfter
Algorithm addAfter(p,e):
Crea un nuovo nodo v
v.setElement(e)
v.setPrev(p)
v.setNext(p.getNext())
(p.getNext()).setPrev(v)
p.setNext(v)
posizione p
header
trailer
A
B
e
Strutture Dati
C
Il tipo astratto di dati Node List
Implementazione di remove
Algorithm remove(p):
posizione
p.getPrev()
posizione p
posizione
p.getNext()
header
trailer
A
Strutture Dati
B
C
D
Il tipo astratto di dati Node List
Implementazione di remove
Algorithm remove(p):
temp := p.element
(p.getPrev()).setNext(p.getNext())
posizione
p.getPrev()
posizione p
posizione
p.getNext()
header
trailer
A
Strutture Dati
B
C
D
Il tipo astratto di dati Node List
Implementazione di remove
Algorithm remove(p):
temp := p.element
(p.getPrev()).setNext(p.getNext())
(p.getNext()).setPrev(p.getPrev())
posizione
p.getPrev()
posizione p
posizione
p.getNext()
header
trailer
A
Strutture Dati
B
C
D
Il tipo astratto di dati Node List
Implementazione di remove
Algorithm remove(p):
temp := p.element
(p.getPrev()).setNext(p.getNext())
(p.getNext()).setPrev(p.getPrev())
p.setPrev( null )
posizione
p.getPrev()
posizione p
posizione
p.getNext()
header
trailer
A
Strutture Dati
Ø
B
C
D
Il tipo astratto di dati Node List
Implementazione di remove
Algorithm remove(p):
temp := p.element
(p.getPrev()).setNext(p.getNext())
(p.getNext()).setPrev(p.getPrev())
p.setPrev( null )
p.setNext( null )
posizione
p.getPrev()
posizione p
posizione
p.getNext()
header
trailer
A
Strutture Dati
Ø
B
Ø
C
D
Il tipo astratto di dati Node List
Implementazione di remove
Algorithm remove(p):
temp := p.element
(p.getPrev()).setNext(p.getNext())
(p.getNext()).setPrev(p.getPrev())
p.setPrev( null )
p.setNext( null )
return temp
posizione
p.getPrev()
posizione p
posizione
p.getNext()
header
trailer
A
Strutture Dati
Ø
B
Ø
C
D
Il tipo astratto di dati Node List
Implementazione dell'interfaccia PositionList
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
Il tipo astratto di dati Node List
Implementazione dell'interfaccia PositionList
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
Il tipo astratto di dati Node List
Implementazione dell'interfaccia PositionList
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
Il tipo astratto di dati Node List
Implementazione dell'interfaccia PositionList
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
Il tipo astratto di dati Node List
Implementazione dell'interfaccia PositionList
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
Il tipo astratto di dati Node List
Implementazione dell'interfaccia PositionList
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