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