listen:verkettet:start
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
listen:verkettet:start [2024/09/18 07:52] – [Klassendiagramm] Martin Pabst | listen:verkettet:start [2024/09/27 08:45] (aktuell) – [Problem des ersten Ansatzes:] Martin Pabst | ||
---|---|---|---|
Zeile 10: | Zeile 10: | ||
<WRAP center round info 60%> | <WRAP center round info 60%> | ||
Eine einfach verkettete Liste ist ein Ersatz für das Array um dessen Nachteile (Größenbeschränkung, | Eine einfach verkettete Liste ist ein Ersatz für das Array um dessen Nachteile (Größenbeschränkung, | ||
- | Die Idee besteht darin, die Inhaltsobjekte | + | * Die Idee besteht darin, die Elemente der Liste hintereinanderzuhängen, |
+ | * Im Warteschlangen-Objekt wird | ||
+ | * die Referenz auf das erste Element | ||
+ | * die Referenz auf das letzte Element gespeichert um auf einfache Art weitere anhängen zu können. \\ | ||
+ | * Beim letzten Element der Liste ist einfach '' | ||
+ | |||
+ | Für die Implementierung einer Warteschlange an einer Supermarktkasse sieht das Objektdiagramm beispielhaft so aus: | ||
{{ : | {{ : | ||
- | Beim letzten Inhaltsobjekt der Liste ist einfach '' | + | </ |
+ | ==== Klassendiagramm ==== | ||
+ | <WRAP center round info 60%> | ||
+ | {{ : | ||
+ | Es ergibt sich das rechts dargestellte Klassendiagramm. \\ \\ | ||
+ | Die einfach verkettete Liste ist eine **rekursive** Datenstruktur, | ||
+ | Zwischen den Klassen Warteschlange und Kunde bestehen zwei **Aggregationsbeziehungen**. | ||
</ | </ | ||
Zeile 71: | Zeile 83: | ||
- | <WRAP center round important 60%> | + | ==== Aufgabe |
- | **Problem | + | Implementieren Sie die Methode |
- | Bei dieser Implementierung der Warteschlange müssen wir die Klasse | + | |
- | Der Kern des Problems liegt darin, dass der Code zur Modellierung der Daten (Klasse '' | + | |
- | **Problem 2: Performance beim Zugriff aufs n-te Element** \\ | + | |
- | Will man auf das n-te Element einer verketteten Liste zugreifen, so muss sich das Programm - beginnend beim ersten Element - n-mal "nach vorne hangeln" | + | |
- | </ | + | |
+ | [[.getAnzahl: | ||
- | ==== Klassendiagramm ==== | ||
- | <WRAP center round info 60%> | ||
- | Es ergibt sich folgendes Klassendiagramm: | ||
- | {{ : | ||
- | Die einfach verkettete Liste ist eine **rekursive** und **zusammengesetzte** Datenstruktur. Dabei weist **rekursiv** (lat. recurrere „zurücklaufen“) darauf hin, dass ein Inhalt-Objekt wiederum ein Inhalt-Objekt als Nachfolger hat. Die Datenstruktur ist zudem aus mehreren Klassen (Warteschlange, | ||
- | </ | ||
- | ===== Umsetzung in Java ===== | + | ===== Probleme des ersten Ansatzes: |
- | Sehen wir uns zunächst nur die Klassen und ihre Attribute an: | + | <WRAP center round important 60%> |
- | <code learnj> | + | **Problem 1: Vermischung von Struktur und Daten** \\ |
- | class Inhalt { | + | Bei dieser Implementierung der Warteschlange müssen wir die Klasse '' |
- | private String text; | + | Der Kern des Problems liegt darin, dass der Code zur Modellierung der Daten (Klasse '' |
- | | + | |
- | | + | **Problem 2: Performance beim Zugriff aufs n-te Element** \\ |
- | this.text = text; | + | Will man auf das n-te Element einer verketteten Liste zugreifen, so muss sich das Programm - beginnend beim ersten Element - n-mal "nach vorne hangeln" |
- | } | + | |
- | | + | </WRAP> |
- | return nachfolger; | + | |
- | } | + | |
- | + | ||
- | | + | |
- | println(text); | + | |
- | } | + | |
- | + | ||
- | } | + | |
- | + | ||
- | class Warteschlange { | + | |
- | + | ||
- | | + | |
- | + | ||
- | | + | |
- | erster = null; | + | |
- | } | + | |
- | + | ||
- | } | + | |
- | + | ||
- | + | ||
- | </code> | + | |
- | + | ||
- | Die Methode '' | + | |
- | + | ||
- | <code learnj> | + | |
- | public Inhalt erstenEntnehmen() { | + | |
- | + | ||
- | Inhalt z = erster; | + | |
- | + | ||
- | if(erster == null) { | + | |
- | | + | |
- | } | + | |
- | + | ||
- | erster = erster.getNachfolger(); | + | |
- | + | ||
- | return z; | + | |
- | + | ||
- | } | + | |
- | </ | + | |
- | + | ||
- | Schwieriger gestaltet sich das Einfügen des letzten Knotens, da das Warteschlangen-Objekt ja nur die Referenz auf den ersten Knoten speichert und man sich von diesem ausgehend zum letzten Knoten " | + | |
- | + | ||
- | ==== Hintenanstellen: | + | |
- | Die rekursive Lösung ist zweigeteilt. Der einfachste Fall (die Liste ist leer) wird direkt in der Klasse Warteschlange behandelt (es wird '' | + | |
- | + | ||
- | **Klasse Warteschlange: | + | |
- | <code learnj> | + | |
- | public void hintenAnstellenRekursiv(Inhalt inhalt) { | + | |
- | | + | |
- | erster = inhalt; | + | |
- | } else { | + | |
- | erster.hintenAnstellenRekursiv(inhalt); | + | |
- | } | + | |
- | } | + | |
- | </ | + | |
- | + | ||
- | **Klasse Inhalt:** | + | |
- | <code learnj> | + | |
- | public void hintenAnstellenRekursiv(Inhalt inhalt) { | + | |
- | | + | |
- | nachfolger = inhalt; | + | |
- | } else { | + | |
- | nachfolger.hintenAnstellenRekursiv(inhalt); | + | |
- | } | + | |
- | } | + | |
- | </ | + | |
- | + | ||
- | Auch die Ermittlung der Anzahl der enthaltenen Elemente kann sowohl iterativ als auch rekursiv gelöst werden. [[datenstrukturen: | + | |
- | + | ||
- | ==== Anzahl der enthaltenen Elemente: rekursiv ==== | + | |
- | Hier kümmert sich die Methode '' | + | |
- | === Klasse Warteschlange: | + | |
- | <code learnj> | + | |
- | public int getAnzahlRekursiv() { | + | |
- | | + | |
- | return 0; | + | |
- | } else { | + | |
- | return erster.getAnzahlRekursiv(); | + | |
- | } | + | |
- | } | + | |
- | </ | + | |
- | + | ||
- | === Klasse Inhalt: === | + | |
- | <code learnj> | + | |
- | /** | + | |
- | * Gibt die Anzahl der Elemente " | + | |
- | * zzgl. 1 zurück; | + | |
- | */ | + | |
- | public int getAnzahlRekursiv() { | + | |
- | | + | |
- | return 1; | + | |
- | } else { | + | |
- | return nachfolger.getAnzahlRekursiv() + 1; | + | |
- | } | + | |
- | + | ||
- | } | + | |
- | </ | + | |
- | + | ||
- | ===== Gesamtprogramm ===== | + | |
- | < | + | |
- | + | ||
- | <div class=" | + | |
- | + | ||
- | <script type=" | + | |
- | Warteschlange w = new Warteschlange(); | + | |
- | w.hintenAnstellenRekursiv(new Inhalt(" | + | |
- | w.hintenAnstellenRekursiv(new Inhalt(" | + | |
- | w.hintenAnstellenRekursiv(new Inhalt(" | + | |
- | + | ||
- | println(" | + | |
- | + | ||
- | Inhalt inhalt = w.erstenEntnehmen(); | + | |
- | inhalt.ausgabe(); | + | |
- | inhalt = w.erstenEntnehmen(); | + | |
- | inhalt.ausgabe(); | + | |
- | </ | + | |
- | + | ||
- | <script type=" | + | |
- | class Warteschlange { | + | |
- | + | ||
- | | + | |
- | + | ||
- | | + | |
- | erster = null; | + | |
- | } | + | |
- | + | ||
- | | + | |
- | if(erster == null) { | + | |
- | | + | |
- | } else { | + | |
- | | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | | + | |
- | + | ||
- | Inhalt z = erster; | + | |
- | + | ||
- | erster = erster.getNachfolger(); | + | |
- | + | ||
- | return z; | + | |
- | + | ||
- | } | + | |
- | + | ||
- | | + | |
- | if(erster == null) { | + | |
- | | + | |
- | } else { | + | |
- | | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | } | + | |
- | </ | + | |
- | + | ||
- | <script type=" | + | |
- | class Inhalt { | + | |
- | | + | |
- | | + | |
- | + | ||
- | | + | |
- | this.text = text; | + | |
- | } | + | |
- | + | ||
- | /** | + | |
- | * Gibt die Anzahl der Elemente " | + | |
- | * zzgl. 1 zurück; | + | |
- | */ | + | |
- | | + | |
- | if(nachfolger == null) { | + | |
- | | + | |
- | } else { | + | |
- | | + | |
- | } | + | |
- | + | ||
- | } | + | |
- | + | ||
- | | + | |
- | return nachfolger; | + | |
- | } | + | |
- | + | ||
- | | + | |
- | if(nachfolger == null) { | + | |
- | | + | |
- | } else { | + | |
- | | + | |
- | } | + | |
- | } | + | |
- | + | ||
- | + | ||
- | | + | |
- | println(text); | + | |
- | } | + | |
- | } | + | |
- | </ | + | |
- | + | ||
- | + | ||
- | </ | + | |
- | + | ||
- | </HTML> | + | |
listen/verkettet/start.1726645959.txt.gz · Zuletzt geändert: 2024/09/18 07:52 von Martin Pabst