J Übungen zu Algorithmen und Datenstrukturen 2 WS 2011/2012 Dipl.-Ing. Marc Kurz Institut für Pervasive Computing Univ.-Prof. Dr. Alois Ferscha Letzter Abgabetermin: Di. 01.11.2011, 23:59 Uhr Abgabe: http://www.pervasive.jku.at/Teaching/ Übung 2 Abstrakte Datentypen I 1. Doppelt verkettete Liste 16 Punkte Einfügeposition Implementieren Sie den abstrakten Datentyp DoubleLinkedList (doppelt verkettete Liste mit je einem Dummy-Knoten am Beginn und am Ende der Liste, sowie je einen Zeiger head und tail auf diese Knoten). Die leere Liste enthält damit zwei Knoten head und tail (siehe Abbildung): Integer (25) Integer (48) Integer (60) data data data data next next next next next prev prev prev prev prev head DummyElemente data tail Integer (52) node compareTo data next prev Die Liste soll Elemente vom Typ Comparable speichern. Verwenden Sie beim (aufsteigend) sortierten Einfügen mittels addSorted die Methode compareTo, um die Elemente miteinander zu vergleichen und z.B. so die richtige Einfügeposition für einen neuen Knoten zu finden. Benutzen Sie zur Implementierung exakt die angegebene Schnittstelle (für jede Klasse eine eigene Datei): public class DoubleLinkedList<T extends Comparable<T>> implements MyList<T> { … } interface MyList<T extends Comparable<T>> { int getSize(); // void addFirst(T val) // throws IllegalArgumentException; void addLast(T val) // throws IllegalArgumentException; void addAll(int index, MyList<T> l) // throws IllegalArgumentException; // void sort(); // void addSorted(T val) // throws IllegalArgumentException; // T removeFirst() // throws NoSuchElementException; T removeLast() // throws NoSuchElementException; boolean remove(T val) // throws IllegalArgumentException; // void clear(); // boolean contains(T val) // throws IllegalArgumentException; // T getFirst() // throws NoSuchElementException; T getLast() // throws NoSuchElementException; T get(int index) // throws IllegalArgumentException; // void reverse(); // Object[] toArray(); // String toString(); // } Liefert die Anzahl der Listenelemente (in O(1)) Fügt Element am Anfang der Liste ein Hängt Element am Ende der Liste an Fügt alle Elemente der übergebenen Liste an der … … spezifizierten Indexposition (0<=index<=getSize()) ein Sortiert Listenelemente in aufsteigender Reihenfolge Fügt Element aufsteigend sortiert in Liste ein (die Liste … … muss zuvor gegebenenfalls sortiert werden) Gibt das erste Listenelement zurück und entfernt es Gibt das letzte Listenelement zurück und entfernt es Entfernt das übergebene Elemente von der Liste, und gibt … … genau dann true zurück wenn es enthalten ist Entfernt alle Elemente von der Liste (in O(1)) Gibt genau dann true zurück wenn übergebenes Element in … … der Liste enthalten ist Gibt das erste Element der Liste zurück Gibt das letzte Element der Liste zurück Gibt das Element an der spezifizierten Indexposition … … (0<=index<getSize()) zurück Dreht die Liste um (mit Hilfe von Zeigeroperationen) Liefert eine Array-Repräsentation der Listenelemente Liefert eine String-Repräsentation der Listenelemente J Übungen zu Algorithmen und Datenstrukturen 2 WS 2011/2012 Dipl.-Ing. Marc Kurz Institut für Pervasive Computing Univ.-Prof. Dr. Alois Ferscha Letzter Abgabetermin: Di. 01.11.2011, 23:59 Uhr Abgabe: http://www.pervasive.jku.at/Teaching/ Übung 2 Verwenden Sie für die Knoten Ihrer Liste die Klasse DLNode: public class DLNode<T extends Comparable<T>> { public T data; public DLNode<T> next; public DLNode<T> prev; public DLNode(T data) { this.data = data; this.next = null; this.prev = null; } } // // // // T muss Inhalt Zeiger Zeiger Comparable implementieren des Knotens auf den nachfolgenden Knoten auf den vorhergehenden Knoten Überprüfen Sie grundsätzlich die übergebenen Argumente (null-Objekte dürfen nicht in die Liste eingefügt werden) und achten Sie auf einen sauberen Programmierstil. Kommentieren Sie jene Programmteile, die nicht oder nur schwer aus dem Quelltext erschlossen werden können. Abzugeben sind die Java-Sourcen für die Implementierungen von DoubleLinkedList und DLNode. Sie brauchen weder das vorgegebene Interface, noch einen Testtreiber oder Ausgaben von Testläufen abgeben; Ihre Klassen werden von uns getestet! Halten Sie dazu unbedingt die vorgegebene Schnittstelle ein! Das gilt auch für alle weiteren Übungen. Ein Java-Tutorial zu Generics finden sie hier: http://java.sun.com/docs/books/tutorial/extra/generics/index.html 2. Java Collections 2 + 6 Punkte a) Lesen Sie sich die Dokumentation des Java Collection Frameworks (speziell zu den Listen) durch (zu finden unter http://download.oracle.com/javase/6/docs/technotes/guides/collections/index.html) und beantworten Sie folgende Fragen: Was ist der Unterschied zwischen einer ArrayList und einer LinkedList? Bei welchen Operationen (suchen, einfügen/löschen am Anfang, einfügen/löschen am Ende und sortieren) ist eine ArrayList bzw. LinkedList effizienter? Begründen Sie Ihre Antworten! b) Implementieren Sie eine einfach verkettete sortierte Liste unter Zuhilfenahme des Java Collections Framework, wobei Sie die bestehende Klasse java.util.LinkedList erweitern sollen. Benutzen Sie zur Implementierung exakt die angegebene Schnittstelle (für jede Klasse eine eigene Datei): interface MySortedList<T extends Comparable<T>> extends java.util.List<T> { void sortList(); // Sortiert die Liste aufsteigend void addSorted(T val); // Fügt Element aufsteigend sortiert in Liste ein void addSorted(MySortedList<T> subList); // Fügt eine Sub-Liste sortiert ein } Implementieren Sie das Interface in folgender Klasse: public class MySortedLinkedList<T extends Comparable<T>> extends LinkedList<T> implements MySortedList<T> { … } Achten Sie auf eine möglichst effiziente Implementierung, indem Sie auf die Eigenheiten der LinkedList (siehe Dokumentation bzw. Hinweise) Rücksicht nehmen. Hinweise: Verwenden Sie wenn möglich die verfügbaren Methoden der Superklasse. Verwenden Sie für eine effiziente Lösung nicht den Index der Elemente zum Durchlaufen der Liste (falls nötig), sondern einen geeigneten Iterator (siehe Dokumentation des Collection Frameworks). Auch bei diesem Beispiel reicht es, die implementierte Klasse MySortedLinkedList abzugeben. Testklassen oder das Interface MySortedList sollen nicht in der Abgabe enthalten sein.