Algorithmen und Datenstrukturen Verkettete Liste in C++

Werbung
Algorithmen und
Datenstrukturen
Dipl. Inform. Andreas Wilkens
[email protected]
Verkettete Liste in C++
eine verkettete Liste objektorientiert
programmiert
Programm:
linkedlist05.cpp
Implementierung der Methoden
Durch eine präzise Beschreibung der
Methoden kann der Programmieraufwand
deutlich reduziert werden
2
1
Vorteile von verketteten Listen
gegenüber Arrays
große Flexibilität
maximale Größe der Liste muss nicht im
voraus bekannt sein
maximale Größe nur von der
Speichergröße abhängig
sehr einfache Operationen auf die
Elemente der Liste
3
Nachteile von verketteten
Listen gegenüber Arrays
kein Wahlfreier Zugriff auf das n-te
Element
unterschiedliche Zugriffszeiten auf
verschiedene Elemente
erhöhter Speicherbedarf, da nicht nur
die Nutzdaten, sondern auch die Zeiger
abgelegt werden müssen
4
2
Weniger gut geeignete
Operationen für Listen
(im Gegensatz zum Array)
Finden des k-ten Elements
Lokalisieren eines Elements vor dem
aktuellen Element
5
Doppelt verkettete Listen
Vorteile?
Nachteile?
6
3
Ringförmig verkettete Listen
Vorteile?
Nachteile?
7
Ringförmig verkettete Listen
als doppelt verkettete Liste
8
4
mögliche Klausuraufgabe
Gegeben sei für die folgende Aufgabe eine
einfach verkettete Liste, die als Nutzdaten die
Markennamen von vielen (nicht allen!) in
Deutschland käuflichen Biersorten enthält.
Ihnen sei von dieser Liste lediglich der rootPointer bekannt.
Beschreiben Sie verbal oder als Pseudocode
was zu tun ist, wenn der Knoten „Jever“ aus
der Liste gelöscht werden soll!
9
mögliche Lösung
1.
2.
3.
4.
5.
6.
Steige über den root-Pointer in die Liste ein.
Falls root-Pointer bereits auf "Jever"-Knoten zeigt, dann Sonderfall,
setzte Arbeitspointer B auf root-Pointer, setzte anschließend rootPointer auf B->next. Gehe zu Schritt 5.
Laufe in der Liste von Knoten zu Knoten, bis der next-Pointer des
aktuellen Knotens auf "Jever" oder auf NULL zeigt.Falls NULL, dann
fertig, Knoten Jever ist nicht in der Liste enthalten.Falls next-Pointer
des aktuellen Knotens auf "Jever" zeigt, setze Arbeitspointer A auf
den aktuellen Knoten. Setze zweiten Arbeitspointer B auf A->next,
also auf "Jever".
Setze A->next auf B->next, damit ist der "Jever"-Knoten aus der
Liste ausgeklinkt.
Auf den "Jever"-Knoten kann noch über den zweiten Arbeitspointer B
zugegriffen werden, Knoten kann z.B. noch aus dem Speicher
gelöscht werden, eventuell vorher die Nutzdaten retten.
Fertig
10
5
Elementare Datenstrukturen
Array
Linked List
Stack
Queue
Tree
(Feld)
(Verkettete Liste)
(Stapel)
(Warteschlange)
(Baum)
11
Stack (Stapel)
Sonderform einer allgemeinen Liste
Starke Einschränkungen beim Zugriff
auf die Elemente
Hinzufügen und Entfernen/Lesen nur an
einem Ende erlaubt ( Top)
LIFO – Last In First Out
12
6
Stack (Stapel)
ein Bücherstapel
13
Aufgabe
Entwerfen Sie eine Klasse „Stack“.
Welche Nutzdaten soll ihr Stack verwalten?
Welche Methoden bekommt ihre Klasse?
Wie lauten die Schnittstellen?
Wie lauten die
Schnittstellenbeschreibungen?
14
7
Elementare Datenstrukturen
Array
Linked List
Stack
Queue
Tree
(Feld)
(Verkettete Liste)
(Stapel)
(Warteschlange)
(Baum)
15
Queue (Warteschlange)
Wie beim Stack starke Einschränkungen
beim Zugriff
Hinzufügen nur an einem Ende
Entfernen/Lesen nur am anderen Ende
FIFO – First In First Out
16
8
Queue (Warteschlange)
Warteschlange an der Kasse
17
Aufgabe
Entwerfen Sie eine Klasse „Queue“.
Welche Nutzdaten soll ihre Queue
verwalten?
Welche Methoden bekommt ihre Klasse?
Wie lauten die Schnittstellen?
Wie lauten die
Schnittstellenbeschreibungen?
18
9
Herunterladen