EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Gliederung Kapitel 7 Verkettete Liste Version 1 –Einhängen am Kopf Verkettete Liste Version 1a –Einlesen rekursiv Verkettete Liste Version 2 –Einhängen am Fuß Verkettete Liste Version 3 –Mit Entfernen
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Verkettete Listen Problem: –Möchte ganze Zahlen einlesen (Ende == 0); weiß nicht, wie viele Zahlen eingegeben werden. Mit Feldern? Problem. Lösung: z.B. Verkettete Liste
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Verkettete Listen struct Liste { int Element; Liste *weiter; }; Eine Variable vom Typ Liste enthält also wieder einen Zeiger auf ein Datum vom Typ Liste Also: auch in Typdeklaration Verwendung von Rekursion möglich!
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Verkettete Listen Element Inhalt vom Typ int weiter nächstes Element: Zeiger vom Typ Liste
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Verkettete Liste Version 1 Eine Variable, vereinbart als Liste *x, kann also z. B. auf so etwas zeigen: 37 9 hier ist die Liste zu Ende, der Zeiger zeigt "auf Null"
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Verkettete Liste Version 1 Der Zeiger, der eine Liste beendet, heißt NULL –NULL ist in C++ vordefiniert.
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Verkettete Liste Version 1 Liste *Einlesen (); void Ausdrucken (Liste *); int main () { Liste *Ls; Ls = Einlesen (); Ausdrucken (Ls); return 0; } Einlesen ist eine (parameterlose) Funktion, die einen Zeiger auf eine Liste zurückgibt ( Ausdrucken hat einen Zeiger auf eine Liste als Parameter).
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich setze die Werte in dem neuen Element Die Funktion Einlesen Liste * Einlesen () { Liste *K, *Kopf = NULL; int i; cout << "Erstes Element? "; cin >> i; while (i != 0) { K = new Liste; K->Element = i; K->weiter = Kopf; Kopf = K; cout << "naechstes Element? ; cin >> i; } return Kopf; } initialisiere Kopf zu NULL erzeuge neues Listenelement
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Die Funktion Einlesen new Liste erzeugt eine neue Instanz von Liste und gibt einen Zeiger darauf zurück.
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Einlesen Beim Eintritt in die Funktion Kopf = NULL Kopf nach K = new Liste K keine Verbindung zwischen beiden
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Einlesen Kopf K Nach Einlesen von i = 1, K->Element = i 1 nach K->weiter = Kopf nach Kopf = K
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Einlesen Kopf K 1 nach K = new Liste; K->Element = 2; K 2
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Einlesen Kopf K 1 K 2 nach Kopf = K nach K->weiter = Kopf
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Die Funktion Ausdrucken Die Funktion Ausdrucken ist rekursiv (d. h. ruft sich selbst auf) void Ausdrucken (Liste *K) { if (K != NULL) { cout Element << '\t' Ausdrucken (K->weiter); } else // jetzt ist K == NULL cout << "\nDas wars\n"; }
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Ausdrucken + Programm Parameter K –weist auf nichts mehr (d.h. NULL): das war´s; Beendigung des Aufrufs, –nicht-leere Restliste: Ausdruck des Elements, erneuter Aufruf für die restliche Liste (d. h. die bei K->weiter beginnende Liste) –Programm: Verkettete Liste 1
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Einlesen (rekursiv) Liste *Einlesen () { Liste *K; int i; cout > i; K = new Liste; K->Element = i; K->weiter = (i != 0 ? Einlesen (): NULL); return K; } hier steckt die Abbruchbedingung es wird ein neues Element erzeugt (mit new )
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Einlesen (rekursiv) K->weiter = (i != 0 ? Einlesen (): NULL); Kritische Stelle i != 0 : der Zeiger K->weiter wird auf dasjenige Element gesetzt, das sich durch erneutes Einlesen ergibt, i == 0 : der Zeiger wird auf NULL gesetzt, kein weiterer Aufruf.
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Verkettete Liste: Einfügen am Ende Idee: Zeiger auf das letzte Element. Fuß Kopf
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Initialisierung des Codes ein wenig trickreich Programm: Verkettete Liste: Einfügen am Ende Verkettete Liste 2
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Verkettete Liste incl. Entfernen Gegeben: Liste L, ganze Zahl i L ist leer: gib L zurück L ->Element == i : gib Liste L->weiter zurück L ->Element != i: –entferne i aus der Liste L->weiter –gib L zurück
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Beispiel: Entfernen von
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich Entfernen aus einer Liste Liste *Entferne (int i, Liste *L) { if (L == NULL) return L; else if (L ->Element == i) return L->weiter; else { L->weiter = Entferne (i, L->weiter); return L; } Fall 1 Fall 2 Fall 3 Verkettete Liste 3