Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Nikolaus Anderman Geändert vor über 11 Jahren
1
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido dittrich@cs.uni-dortmund.de
2
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 2 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
3
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 3 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
4
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 4 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!
5
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 5 Verkettete Listen Element Inhalt vom Typ int weiter nächstes Element: Zeiger vom Typ Liste
6
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 6 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"
7
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 7 Verkettete Liste Version 1 Der Zeiger, der eine Liste beendet, heißt NULL –NULL ist in C++ vordefiniert.
8
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 8 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).
9
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 9 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
10
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 10 Die Funktion Einlesen new Liste erzeugt eine neue Instanz von Liste und gibt einen Zeiger darauf zurück.
11
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 11 Einlesen Beim Eintritt in die Funktion Kopf = NULL Kopf nach K = new Liste K keine Verbindung zwischen beiden
12
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 12 Einlesen Kopf K Nach Einlesen von i = 1, K->Element = i 1 nach K->weiter = Kopf nach Kopf = K
13
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 13 Einlesen Kopf K 1 nach K = new Liste; K->Element = 2; K 2
14
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 14 Einlesen Kopf K 1 K 2 nach Kopf = K nach K->weiter = Kopf
15
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 15 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"; }
16
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 16 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
17
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 17 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 )
18
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 18 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.
19
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 19 Verkettete Liste: Einfügen am Ende Idee: Zeiger auf das letzte Element. Fuß Kopf
20
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 20 Initialisierung des Codes ein wenig trickreich Programm: Verkettete Liste: Einfügen am Ende Verkettete Liste 2
21
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 21 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
22
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 22 Beispiel: Entfernen von 3 1 4 3 2
23
Kap 7: Verkettete ListenVorl EINI-I"Prof. Dr. G. Dittrich 17.01.2000 23 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
Ähnliche Präsentationen
© 2025 SlidePlayer.org Inc.
All rights reserved.