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 Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido

Ähnliche Präsentationen


Präsentation zum Thema: "EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido"—  Präsentation transkript:

1 EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido moraga@cs.uni-dortmund.de

2 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.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 Listen Vorl EINI-I" 18.12.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 Listen Vorl EINI-I" 18.12.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 Listen Vorl EINI-I" 18.12.2000 5 Verkettete Listen Element Inhalt vom Typ int weiter nächstes Element: Zeiger vom Typ Liste

6 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 6 Verkettete Liste Version 1 Eine Variable, vereinbart als Liste *x, kann also z. B. auf so etwas zeigen: 7 9 hier ist die Liste zu Ende, der Zeiger zeigt "auf Null" 3 x

7 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 7 Verkettete Liste Version 1 Der Zeiger, der eine Liste beendet, heißt NULL –NULL ist in C++ vordefiniert.

8 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 8 Verkettete Liste Version 1 Liste *Einlesen (); void Ausdrucken (Liste *); main () { Liste *Ls; Ls = Einlesen (); Ausdrucken (Ls); } 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 Listen Vorl EINI-I" 18.12.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 Listenexemplar

10 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 10 Die Funktion Einlesen new Liste erzeugt ein neues Exemplar von Liste und gibt einen Zeiger darauf zurück.

11 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 11 Einlesen Beim Eintritt in die Funktion Kopf = NULL; Kopf nach K = new Liste; K keine Verbindung zwischen beiden

12 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.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 Listen Vorl EINI-I" 18.12.2000 13 K Kopf 1 nach K = new Liste; 2 Einlesen K->Element = 2;

14 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 14 Einlesen Kopf K 1 K 2 nach Kopf = K; nach K->weiter = Kopf;

15 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.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 << "\n Das wars\n"; }

16 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.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 Listen Vorl EINI-I" 18.12.2000 17 // K7-P1: Verkettete_Liste 1 // demonstriert verkettete Listen und Rekursion #include struct Liste { int Element; Liste *weiter; }; Liste * Einlesen(); void Ausdrucken(Liste *); main() { Liste *Ls; Ls = Einlesen(); Ausdrucken(Ls); }; 1

18 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 18 Liste * Einlesen() { Liste *K, *Kopf = NULL; int i; cout << "Erstes Element? "; cin >> i; // Vorsicht: nur Zahlen eingeben !!!! while (i != 0) { K = new Liste; K->Element = i; K->weiter = Kopf; Kopf = K; cout << "naechstes Element? "; cin >> i; } return Kopf; } 2

19 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 19 void Ausdrucken(Liste *K) { if (K != NULL) { cout Element << '\t'; Ausdrucken(K->weiter); } else // jetzt ist K == NULL cout << "\n\n\t Das wars, Leute! \n"; } 3 Ausführen

20 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 20 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 Exemplar erzeugt (mit new )

21 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 21 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.

22 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 22 Verkettete Liste: Einfügen am Ende Idee: Zeiger auf das letzte Element. FußKopf

23 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 23 Initialisierung des Codes ein wenig trickreich Programm: Verkettete Liste: Einfügen am Ende Verkettete Liste 2

24 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 24 // K7-P2: Verkettete Liste 2 // demonstriert verkettete Listen und // Rekursion // (Einfügen am "Fuß") // #include struct Liste { int Element; Liste *weiter; }; 1

25 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 25 main() { Liste * Einlesen(), *Ls; void Ausdrucken(Liste *); Ls = Einlesen(); Ausdrucken(Ls); } 2

26 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 26 Liste * Einlesen() { Liste *Kopf = NULL, *Fuss = NULL; int i; cout > i; while (i != 0) { Liste *K = new Liste; K->Element = i; K->weiter = NULL; if (Kopf == Fuss){ //noch nichts eingefuegt Kopf = K; Kopf->weiter = Fuss;} else if (Fuss == NULL){ Kopf->weiter = K; Fuss = K;} else { Fuss->weiter = K; Fuss = K;} cout > i; } return Kopf; } 3

27 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 27 void Ausdrucken(Liste *K) { if (K != NULL) { cout Element << '\t'; Ausdrucken(K->weiter); } else // jetzt ist K == NULL cout << "\n\n\t Das wars, Leute\n"; } 4 Ausführen

28 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 28 Verkettete Liste incl. Entfernen Gegeben: Liste * L, ganze Zahl i Liste 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

29 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 29 Beispiel: Entfernen von 3 1 4 3 2

30 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 30 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

31 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 31 // K7-P3: Verkettete Liste 3 // demonstriert verkettete Listen // und Rekursion // (mit Entfernen eines Listenelementes) // #include struct Liste { int Element; Liste *weiter; }; 1

32 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 32 Liste * Einlesen(); Liste * Entferne(int i, Liste * ); void Ausdrucken(Liste *); int GanzeZahlLesen(char *); void GanzeZahlSchreiben(char *, int); main() { Liste *Ls; int ent; Ls = Einlesen(); cout << "\neingelesene Liste: " << endl; Ausdrucken(Ls); ent = GanzeZahlLesen("\n\nEntfernen? "); while ((ent != -1) && (Ls != NULL)) { // -1 Abbruchkriterium aus Entfernen GanzeZahlSchreiben ("\nListe nach Entfernen von: ", ent); Ls = Entferne(ent, Ls); Ausdrucken(Ls); ent = GanzeZahlLesen("\n\nEntfernen? ");} cout << "\n\n\tCiao << endl; } 2

33 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 33 int GanzeZahlLesen(char * prompt) { int i; cout << prompt; cout << "(ganze Zahl bzw. Abbruch mit -1)\t"; cin >> i; return i; } void GanzeZahlSchreiben(char * prompt, int Zahl) { cout << prompt << Zahl << endl; } 3

34 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 34 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; } 4

35 Kap 7: Verkettete Listen Vorl EINI-I" 18.12.2000 35 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;} } void Ausdrucken(Liste * MeineListe){ while (MeineListe != NULL){ cout Element << ", "; MeineListe = MeineListe->weiter; } 5 Ausführen


Herunterladen ppt "EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 Claudio Moraga, Gisbert Dittrich FBI Unido"

Ähnliche Präsentationen


Google-Anzeigen