Übung 10: Dynamische Datenstrukturen und Rekursion Abgabetermin: TT.MM.JJJJ Name: Matrikelnummer: Gruppe: G1 (Prähofer) G2 (Wolfinger) G3 (Wolfinger) Aufgabe Punkte gelöst abzugeben schriftlich abzugeben elektronisch Aufgabe 09.X 12 Java-Programm Java-Programm Testergebnisse Korr. Pkte Aufgabe 10.x: Verkettete lineare Liste Implementieren Sie eine einfach verkettete lineare Liste in der Klasse List. Verwenden Sie dabei die Klasse Node für die Knoten der Liste. class List { Node head; public List() { class Node { int val; Node next; public Node(int val) { Vervollständigen Sie die beiden Konstruktoren und implementieren Sie in der Klasse List folgende Methoden: void prepend(int val) fügt den Wert val vorne in die Liste ein void append(int val) fügt den Wert val hinten in die Liste ein boolean issorted() stellt fest, ob die Werte der Knoten der Liste aufsteigend sortiert sind void insert(int val) fügt den Wert val in eine sortierte Liste an der richtigen Stelle ein, sodass die neue Liste wieder sortiert ist und String tostring() liefert eine Zeichenkette mit den Werten der Knoten, durch Beistriche voneinander getrennt. Testen Sie Ihre Methoden, auch für Fehlerfälle. Lösungsidee Nachstehende Abbildung zeigt in a) wie die Objektstruktur einer Liste mit zwei Knoten aussieht, und in b) das Klassendiagramm.
Java-Programm 1 class Node { 2 int val; 3 Node next; 4 public Node(int val) { 5 this.val = val; 6 7 8 9 public class List { 10 Node head; 11 public List() { 12 head = null; 13 14 public void prepend(int val) { 15 Node n = new Node(val); 16 n.next = head; 17 head = n; 18 19 public String tostring() { 20 StringBuffer b = new StringBuffer(); 21 Node p = head; 22 while(p!= null) { 23 b.append(','); 24 b.append(p.val); 25 p = p.next; 26 27 b.delete(0, 1); 28 return b.tostring(); 29 30 public void append(int val) { 31 Node n = new Node(val); 32 if(head == null) { 33 head = n; 34 else { 35 Node p = head; 36 while(p.next!= null) 37 p = p.next; 38 p.next = n; 39 40 41 public boolean issorted() { 42 Node p = head; 43 while(p!= null) { 44 if(p.next!= null && p.val > p.next.val) 45 return false; 46 p = p.next; 47 48 return true; 49 50 public void insert(int val) { 51 Node n = new Node(val); 52 Node p = head, prev = null; 53 while(p!= null && p.val < n.val) { 54 prev = p; 55 p = p.next; 56 57 if(prev == null) { 58 head = n; 59 else { 60 prev.next = n; 61 62 n.next = p; 63 64 public static void main(string[] args) { 65 List 66 67 68 Out.println(l); 69 Out.println(l.isSorted()); 70 71 72 73 l.append(2); 74 Out.println(l); 75 Out.println(l.isSorted()); 76 77 78 l.append(2);
79 80 Out.println(l); 81 Out.println(l.isSorted()); 82 83 84 l.insert(2); 85 l.insert(1); 86 l.insert(3); 87 l.insert(0); 88 Out.println(l); 89 Out.println(l.isSorted()); 90 91 Testspezifikation: Methode prepend: o Mit nicht-leerer Liste Methode append: o Mit Liste mit einem Element o Mit Liste mit vielen Elementen Methode sorted: => true o Mit Liste mit einem Element => true o Mit sortierter Liste mit zwei Elementen => true o Mit unsortierte Liste mit zwei Elementen => false o Mit sortierter Liste mit mehreren Elementen => true o Mit unsortierte Liste mit mehreren Elementen => false Methode insert: o Einfügen in leere Liste o Einfügen in Liste mit 1 Element am Anfang o Einfügen in Lsite mit 1 Element am Ende o Einfugen in Liste mit mehreren Elementen am Anfang o Einfugen in Liste mit mehreren Elementen am Ende o Einfugen in Liste mit mehreren Elementen in der Mitte Methode tostring o Mit Liste mit einem Element o Mit Liste mit vielen Elementen Testprogramm: public class ListTest { public static void main(string[] args) { List l; Out.println("-------- Test Methode tostring ---------------"); Out.println("Leere Liste []: " + l.tostring()); // Mit Liste mit einem Element Out.println("Leere Liste [3]: " + l.tostring()); // Mit Liste mit mehreren Elementen l.prepend(0); // Methode prepend: Out.println("-------- Test Methode prepend ---------------");
Out.println("Liste [1]: " + l.tostring()); // Mit nicht-leerer Liste Out.println("Liste [2, 1]: " + l.tostring()); Out.println("Liste [3, 2, 1]: " + l.tostring()); // Methode append: Out.println("-------- Test Methode append ---------------"); Out.println("Liste [1]: " + l.tostring()); // Mit nicht-leerer Liste l.append(2); Out.println("Liste [1, 2]: " + l.tostring()); Out.println("Liste [1, 2, 3]: " + l.tostring()); l.append(4); l.append(5); l.append(6); Out.println("Liste [1, 2, 3, 4, 5, 6]: " + l.tostring()); // Methode sorted Out.println("-------- Test Methode sorted ---------------"); => true // Mit Liste mit einem Element => true // Mit sortierter Liste mit zwei Elementen => true l.append(2); // Mit sortierter Liste mit mehreren Elementen => true l.insert(2); // Mit unsortierte Liste mit zwei Elementen => false // Mit unsortierte Liste mit mehreren Elementen => false // Methode insert Out.println("-------- Test Methode insert ---------------"); // Einfügen in leere Liste l.insert(3); Out.println("Liste [3]: " + l.tostring()); // Einfügen in Liste mit 1 Element am Anfang l.insert(1);
Out.println("Liste [1, 3]: " + l.tostring()); // Einfügen in Lsite mit 1 Element am Ende l.insert(5); Out.println("Liste [1, 3, 5]: " + l.tostring()); // Einfugen in Liste mit mehreren Elementen am Anfang l.insert(0); Out.println("Liste [0, 1, 3, 5]: " + l.tostring()); // Einfugen in Liste mit mehreren Elementen in der Mitte l.insert(2); Out.println("Liste [0, 1, 2, 3, 5]: " + l.tostring()); l.insert(4); Out.println("Liste [0, 1, 2, 3, 4, 5]: " + l.tostring()); // Einfugen in Liste mit mehreren Elementen am Ende l.insert(6); Out.println("Liste [0, 1, 2, 3, 4, 5, 6]: " + l.tostring()); // main Testergebnis: -------- Test Methode tostring --------------- Leere Liste []: [] Leere Liste [3]: [3] Leere Liste [2, 3]: [2, 3] Leere Liste [2, 3]: [1, 2, 3] Leere Liste [2, 3]: [0, 1, 2, 3] -------- Test Methode prepend --------------- Liste [1]: [1, 0, 1, 2, 3] Liste [2, 1]: [2, 1, 0, 1, 2, 3] Liste [3, 2, 1]: [3, 2, 1, 0, 1, 2, 3] -------- Test Methode append --------------- Liste [1]: [1] Liste [1, 2]: [1, 2] Liste [1, 2, 3]: [1, 2, 3] Liste [1, 2, 3, 4, 5, 6]: [1, 2, 3, 4, 5, 6] -------- Test Methode sorted --------------- Liste [] sorted = true Liste [1] sorted = true Liste [1, 2] sorted = true Liste [1, 2, 3] sorted = true Liste [1, 2, 3, 3] sorted = true Liste [1, 2, 2, 3, 3] sorted = true Liste [2, 1] sorted = false Liste [3, 2, 1] sorted = false Liste [3, 3, 2, 1] sorted = false Liste [1, 2, 1] sorted = false -------- Test Methode insert --------------- Liste [3]: [3] Liste [1, 3]: [1, 3] Liste [1, 3, 5]: [1, 3, 5] Liste [0, 1, 3, 5]: [0, 1, 3, 5] Liste [0, 1, 2, 3, 5]: [0, 1, 2, 3, 5] Liste [0, 1, 2, 3, 4, 5]: [0, 1, 2, 3, 4, 5] Liste [0, 1, 2, 3, 4, 5, 6]: [0, 1, 2, 3, 4, 5, 6]