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

Slides:



Advertisements
Ähnliche Präsentationen
Ziele von EINI I + II Einführen in „Informatik“
Advertisements

Klassen - Verkettete Liste -
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Claudio Moraga; Gisbert Dittrich

EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 9 Claudio Moraga; Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Claudio Moraga; Gisbert Dittrich
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 5 Claudio Moraga; Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 3 Claudio Moraga, Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 4 Claudio Moraga; Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 2 Gisbert Dittrich; Claudio Moraga FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 12 Claudio Moraga, Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 11 Claudio Moraga, Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 10 Claudio Moraga; Gisbert Dittrich FBI Unido
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
Zusammenfassung Vorwoche
PKJ 2005/1 Stefan Dissmann Zusammenfassung Vorwoche Methoden sind mit einem Namen versehene Programmabschnitte besitzen Rückgabetyp, Namen, Parameterliste.
Weiteres Programm Studium des Breitendurchlaufs Hierzu
Einfach verkettete Listen
Einfach verkettete Listen (OOP)
PRJ 2007/1 Stefan Dissmann Verkettete datenstruktur: Liste Problem: Liste, die eine beliebige Zahl von Elementen verwaltet Operationen: Erzeugen, Anfügen,
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung
Javakurs FSS 2012 Lehrstuhl Stuckenschmidt
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Vorlesung 2 SWS WS 99/00 Gisbert Dittrich FBI Unido
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmierung Wintersemester 2009/10 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fakultät.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Einführung in die Programmiersprache C 4
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Thomas Hilpold: Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger.
Einführung in die Informatik für Naturwissenschaftler und Ingenieure (alias Einführung in die Programmierung) (Vorlesung) Prof. Dr. Günter Rudolph Fachbereich.
1 // Verkettete Liste 3 // demonstriert verkettete Listen und // Rekursion // (mit Entfernen eines Listenelementes) // #include struct Liste { int Element;
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
1 // Verkettete Liste 2 // demonstriert verkettete Listen und // Rekursion // (Einfügen am "Fuß") // #include struct Liste { int Element; Liste *weiter;
 Präsentation transkript:

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

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

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

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

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

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

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

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

Kap 7: Verkettete Listen Vorl EINI-I" Einlesen Kopf K Nach Einlesen von i = 1 ; K->Element = i; 1 nach K->weiter = Kopf; nach Kopf = K;

Kap 7: Verkettete Listen Vorl EINI-I" K Kopf 1 nach K = new Liste; 2 Einlesen K->Element = 2;

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

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

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

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

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

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

Kap 7: Verkettete Listen Vorl EINI-I" 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 Listen Vorl EINI-I" Verkettete Liste: Einfügen am Ende Idee: Zeiger auf das letzte Element. FußKopf

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

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

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

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

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

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

Kap 7: Verkettete Listen Vorl EINI-I" Beispiel: Entfernen von

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

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

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

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

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

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