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