Capitolo 17 - Dipartimento di Informatica

Capitolo 17 Introduzione alle strutture di dati
Capitolo 17
Introduzione alle strutture di dati
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
1
Capitolo 17 Introduzione alle strutture di dati
Figura 1
Inserire un elemento in una lista concatenata
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
2
Capitolo 17 Introduzione alle strutture di dati
Figura 2
Un iteratore di lista
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
3
Capitolo 17 Introduzione alle strutture di dati
Figura 3
Una visione astratta dell’iteratore di lista
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
4
File ListTest.java
Capitolo 17 Introduzione alle strutture di dati
import java.util.LinkedList;
import java.util.ListIterator;
/**
Programma che illustra il funzionamento della classe LinkedList
*/
public class ListTest
{
public static void main(String[] args)
{
LinkedList staff = new LinkedList();
staff.addLast("Dick");
staff.addLast("Harry");
staff.addLast("Romeo");
staff.addLast("Tom");
// il segno ¦ nei commenti indica la posizione dell’iteratore
ListIterator iterator = staff.listIterator(); // ¦DHRT
iterator.next(); // D¦HRT
iterator.next(); // DH¦RT
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
5
Capitolo 17 Introduzione alle strutture di dati
// aggiunge altri elementi dopo il secondo
iterator.add("Juliet"); // DHJ¦RT
iterator.add("Nina"); // DHJN¦RT
iterator.next(); // DHJNR¦T
// toglie l’ultimo elemento traversato
iterator.remove(); // DHJN¦T
// stampa tutti gli elementi
iterator = staff.listIterator();
while (iterator.hasNext())
System.out.println(iterator.next());
}
}
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
6
Capitolo 17 Introduzione alle strutture di dati
Figura 4
Aggiunta di un anello alla testa di una lista concatenata
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
7
Capitolo 17 Introduzione alle strutture di dati
Figura 5
Togliere un anello dalla testa di una lista concatenata
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
8
Capitolo 17 Introduzione alle strutture di dati
Figura 6
Togliere un anello dalla parte centrale
di una lista concatenata
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
9
Capitolo 17 Introduzione alle strutture di dati
Figura 7
Aggiungere un anello nella parte centrale
di una lista concatenata
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
10
Capitolo 17 Introduzione alle strutture di dati
File LinkedList.java
import java.util.NoSuchElementException;
/**
Una lista concatenata è una sequenza di anelli dotata di
efficienti meccanismi di inserimento ed eliminazione.
Questa classe ha un sottoinsieme dei metodi della classe
standard java.util.LinkedList
*/
public class LinkedList
{
/**
Costruisce una lista concatenata vuota.
*/
public LinkedList()
{
first = null;
}
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
11
Capitolo 17 Introduzione alle strutture di dati
/**
Restituisce il primo elemento della lista concatenata.
@return il primo elemento della lista concatenata
*/
public Object getFirst()
{
if (first == null)
throw new NoSuchElementException();
return first.data;
}
/**
Toglie il primo elemento dalla lista concatenata.
@return l’elemento eliminato
*/
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
12
Capitolo 17 Introduzione alle strutture di dati
public Object removeFirst()
{
if (first == null)
throw new NoSuchElementException();
Object obj = first.data;
first = first.next;
return obj;
}
/**
Aggiunge un elemento in testa alla lista concatenata.
@param obj l’oggetto da aggiungere
*/
public void addFirst(Object obj)
{
Link newLink = new Link();
newLink.data = obj;
newLink.next = first;
first = newLink;
}
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
13
Capitolo 17 Introduzione alle strutture di dati
/**
Restituisce un iteratore per percorrere questa lista.
@return un iteratore per percorrere questa lista
*/
public ListIterator listIterator()
{
return new LinkedListIterator();
}
private Link first;
private class Link
{
public Object data;
public Link next;
}
private class LinkedListIterator
implements ListIterator
{
/**
Costruisce un iteratore che punta alla testa
della lista concatenata.
*/
14
Capitolo 17 Introduzione alle strutture di dati
public LinkedListIterator()
{
position = null;
previous = null;
}
/**
Sposta l’iteratore dopo l’elemento successivo.
@return l’elemento attraversato
*/
public Object next()
{
if (!hasNext())
throw new NoSuchElementException();
previous = position; // memorizza per remove
if (position == null)
position = first;
else
position = position.next;
return position.data;
}
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
15
Capitolo 17 Introduzione alle strutture di dati
/**
Controlla se c’è un elemento dopo la posizione dell’iteratore.
@return true se c’è un elemento dopo la posizione
dell’iteratore
*/
public boolean hasNext()
{
if (position == null)
return first != null;
else
return position.next != null;
}
/**
Aggiunge un elemento prima della posizione dell’iteratore
e sposta l’iteratore dopo l’elemento inserito.
@param obj l’oggetto da aggiungere
*/
public void add(Object obj)
{
if (position == null)
{
addFirst(obj);
position = first;
16
}
Capitolo 17 Introduzione alle strutture di dati
else
{
Link newLink = new Link();
newLink.data = obj;
newLink.next = position.next;
position.next = newLink;
position = newLink;
}
previous = null;
}
/**
Toglie l’ultimo elemento attraversato. Questo metodo può
essere chiamato soltanto dopo una chiamata al metodo next().
*/
public void remove()
{
if (position == first)
{
removeFirst();
position = first;
}
©2002 Apogeo
17
Capitolo 17 Introduzione alle strutture di dati
else
{
if (previous == null)
throw new IllegalStateException();
previous.next = position.next;
position = previous;
}
previous = null;
}
/**
Imposta il dato presente nell’ultimo elemento
attraversato.
@param obj il dato da impostare
*/
public void set(Object obj)
{
if (position == null)
throw new NoSuchElementException();
position.data = obj;
}
private Link position;
private Link previous;
}
}
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
18
File ListIterator.java
Capitolo 17 Introduzione alle strutture di dati
import java.util.NoSuchElementException;
/**
Una iteratore di lista consente l’accesso a una posizione
in una lista concatenata. Questa interfaccia contiene un
sottoinsieme dei metodi dell’interfaccia standard
java.util.ListIterator, in quanto i metodi per
l’attraversamento all’indietro sono esclusi.
*/
public interface ListIterator
{
/**
Sposta l’iteratore dopo l’elemento successivo.
@return l’elemento attraversato
*/
Object next();
/**
Controlla se c’è un elemento dopo la posizione
dell’iteratore.
@return true se c’è un elemento dopo la posizione
dell’iteratore
19
Capitolo 17 Introduzione alle strutture di dati
*/
boolean hasNext();
/**
Aggiunge un elemento prima della posizione dell’iteratore
e sposta l’iteratore dopo l’elemento inserito.
@param obj l’oggetto da aggiungere
*/
void add(Object obj);
/**
Toglie l’ultimo elemento attraversato. Questo metodo può
essere chiamato soltanto dopo una chiamata al metodo next().
*/
void remove();
/**
Imposta il dato presente nell’ultimo elemento attraversato.
@param obj il dato da impostare
*/
void set(Object obj);
}
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
20
Capitolo 17 Introduzione alle strutture di dati
Figura 8
Visione concreta di una lista concatenata
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
21
Capitolo 17 Introduzione alle strutture di dati
Figura 9
Visione astratta di una lista concatenata
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
22
Capitolo 17 Introduzione alle strutture di dati
Figura 10
Visione concreta di un lettore
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
23
Capitolo 17 Introduzione alle strutture di dati
Figura 11
Visione astratta di un vettore
©2002 Apogeo srl
Horstmann-Concetti di informatica e fondamenti di Java 2
24