Grundlagen der Programmierung Prof. H. Mössenböck 12. Dynamische Datenstrukturen Warum "dynamisch" • Elemente werden zur Laufzeit (dynamisch) mit new angelegt • Datenstruktur kann dynamisch wachsen und schrumpfen Wichtigste dynamische Datenstrukturen Liste Baum Graph Bestehen aus "Knoten", die über "Kanten" miteinander verbunden sind. Knoten ... Objekte Kanten ... Zeiger 2 Verknüpfen von Knoten class Node { int val; Node next; Node(int v) {val = v;} } Erzeugen a Node a = new Node(3); Node b = new Node(5); Verknüpfen a.next = b; b 3 a 5 b 3 5 3 Unsortierte Liste Einfügen am Listenende class List { Node head = null, tail = null; void append (int val) { // Einfügen am Listenende Node p = new Node(val); if (head == null) head = p; else tail.next = p; tail = p; } ... } head tail tail p 8 3 head 7 tail p Benutzung val List list = new List(); list.append(8); list.append(3); list.append(7); ... val 4 Unsortierte Liste (Forts.) Einfacher ist es, am Listenanfang einzufügen class List { Node head = null; void prepend (int val) { // Einfügen am Listenanfang Node p = new Node(val); p.next = head; head = p; } ... } head p head val Benutzung 8 head p 3 7 ... list.prepend(5); list.prepend(2); ... val 5 Unsortierte Liste (Forts.) head class List { 8 Node head = null; ... p boolean contains (int val) { // Suchen head Node p = head; while (p != null && p.val != val) p = p.next; 8 // p == null || p.val == val return p != null; } p void delete (int val) { // Löschen eines Werts Node p = head, prev = null; head while (p != null && p.val != val) { prev = p; p = p.next; 8 } // p == null || p.val == val if (p != null) { // p.val == val prev prev p if (p == head) head = p.next else prev.next = p.next; head } 8 } } prev p 3 p 7 Suchen von 7 7 Suchen von 5 p 3 p p p 3 7 Löschen von 3 3 7 Löschen von 8 p 6