12. Dynamische Datenstrukturen

Werbung
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
Herunterladen