Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido

Ähnliche Präsentationen


Präsentation zum Thema: "EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido"—  Präsentation transkript:

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


Herunterladen ppt "EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido"

Ähnliche Präsentationen


Google-Anzeigen