1 // 13_2_ADT_Unger_Graph // ungerichteter, knotenmarkierter Graph als ADT // #include struct Knoten { public: void Erzeuge_Kn (int, char*); char* Get_Marke.

Slides:



Advertisements
Ähnliche Präsentationen
Vorbereitung: struct knoten { int x; struct knoten *l, *r; } *b, *bh, **bp; b: Zeiger auf Wurzel bh: Hilfszeiger bp: Zeiger auf Zeiger auf knoten b bp.
Advertisements

Klassen - Verkettete Liste -
Ein- und Ausgabe von Dateien
Universität Dortmund, Lehrstuhl Informatik 1 EINI II Einführung in die Informatik für Naturwissenschaftler und Ingenieure.
Claudio Moraga; Gisbert Dittrich
Sortieren mit Binären Bäumen
Java: Dynamische Datentypen
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (20 – Graphen)
1 Vorlesung Informatik 2 Algorithmen und Datenstrukturen (26 - Graphen) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (07 - Skiplisten) Prof. Th. Ottmann.
Vorlesung Informatik 2 Algorithmen und Datenstrukturen (05 – Elementare Datenstrukturen) Prof. Th. Ottmann.
Informatik II, SS 2008 Algorithmen und Datenstrukturen Vorlesung 6 Prof. Dr. Thomas Ottmann Algorithmen & Datenstrukturen, Institut für Informatik Fakultät.
Vers. 6: Der Konfigurationsdialog Quelle: Spieleprogrammierung mit DirectX und C++, U. Kaiser und P. Lensing, Galileo Computing (2007)
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.
EINI-I Einführung in die Informatik für Naturwissenschaftler und Ingenieure I Kapitel 7 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 Vorlesung 2 SWS WS 99/00 Gisbert Dittrich 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 Kapitel 10 Claudio Moraga; Gisbert Dittrich FBI Unido
Klausur „Diskrete Mathematik II“
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Listen-
PRJ 2007/1 Stefan Dissmann Motivation Problem: gleiche Datenstrukturen werden für verschiedene Objekte gebraucht: z.B. Listen von Studierenden, Kunden,
PKJ 2005/1 Stefan Dissmann Rückblick auf 2005 Was zuletzt in 2005 vorgestellt wurde: Klassen mit Attributen, Methoden und Konstruktoren Referenzen auf.
Die Methode public Knoten einfuegenVor (Datenelement dNeu, Datenelement dVergleich) public Knoten einfuegenVor(Datenelement dNeu, Datenelement dVergleich){
Planung einfache Dateibehandlung (externe Dateien, Öffnen, Lesen/Schreiben, Schließen). Diskussion des Problems, die Wörter in einem gegebenen Text.
Weiteres Programm Studium des Breitendurchlaufs Hierzu
Wir müssen also überlegen: Implementierung der Knoten, Implementierung der Kanten, daraus: Implementierung des Graphen insgesamt. Annahme: die Knoteninhalte.
Informatikunterricht mit Java
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,
Rekursion mit Listen: Quicksort
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
Einführung in die Informatik für Naturwissenschaftler und Ingenieure
Einführung in die Programmierung Wintersemester 2012/13 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
Einführung in die Programmierung Wintersemester 2008/09 Prof. Dr. Günter Rudolph Lehrstuhl für Algorithm Engineering Fakultät für Informatik TU Dortmund.
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 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 Programmiersprache C 4
Einfach und doppelt verkettete Listen in JAVA by Jens Weibler
Institut für Wirtschaftsinformatik – Software Engineering, JKU Linz 1 Thomas Hilpold: Algorithmen und Datenstrukturen SS 2005 Mag.Th. Hilpold u. Dr. A.Stritzinger.
EPROG Tutorium #3 Philipp Effenberger
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.
Java-Kurs - 8. Übung Besprechung der Hausaufgabe.
1 // Laengste Zeile bestimmen // // Liest die Eingabe Zeichen fuer Zeichen, bis // das erscheint. // Die laengste Zeile wird ausgegeben (bei.
10 Graphen gerichtete und ungerichtete, mit Marken an Ecken und/oder Kanten Anwendungsgebiete: Verkehrsnetze, Kommunikationsnetze, Netzpläne, Spiele,...
Java-Kurs - 4. Übung Hausaufgabe Weitere Kontrollstrukturen
1 // Heap als ADT // JW: V1.0 // Vorlage gemaess EED-Quelltext // #include #include // für double pow (double d, int i) #include // fuer INT_MIN.
1 // 6_1_KKarte als Struct // // demonstriert structs // Bei Behandlung von "Randfällen" nicht robust. // Fehlerhaft !? #include const char ZeilenEnde.
Mag. Thomas Hilpold, Universität Linz, Institut für Wirtschaftsinformatik – Software Engineering 1 Algorithmen und Datenstrukturen 1 SS 2002 Mag.Thomas.
1 // Verkettete Liste 3 // demonstriert verkettete Listen und // Rekursion // (mit Entfernen eines Listenelementes) // #include struct Liste { int Element;
Binärer Suchbaum IV AVL-Baum I
Institut für Kartographie und Geoinformation Prof. Dr. Lutz Plümer Diskrete Mathematik I Vorlesung Binärer Suchbaum III- -AVL-Baum-
Diskrete Mathe Diskrete Mathematik I Listen Vorlesung 4.
1 // 9_1_Datei_IO //Elementare Verwendung von Dateien // Vorsicht: nicht robust, #include const int maxLen = 70; void Schreiben(char *, ofstream *); void.
Programmiersprachen II Graph_Algorithmen Einführung Prof. Dr. Reiner Güttler Fachbereich GIS HTW.
1 // Verkettete Liste 2 // demonstriert verkettete Listen und // Rekursion // (Einfügen am "Fuß") // #include struct Liste { int Element; Liste *weiter;
Tutorium Software-Engineering SS14 Florian Manghofer.
Zwei Denkansätze zur Klasse Schlange
Die Klasse Vielfrass in Java
 Präsentation transkript:

1 // 13_2_ADT_Unger_Graph // ungerichteter, knotenmarkierter Graph als ADT // #include struct Knoten { public: void Erzeuge_Kn (int, char*); char* Get_Marke (); void Set_Marke (char*); int Get_ID (); private: char * Markierung; int ID; };

2 // 13_2_ADT_Unger_Graph // ungerichteter, knotenmarkierter Graph als ADT // Fortsetzung struct Kante { public: Knoten * Get_StartKn (); Knoten * Get_ZielKn (); void Set_StartKn (Knoten *); void Set_ZielKn (Knoten *); private: Knoten * StartKn; Knoten * ZielKn;}; struct Knotenlistenelement { Knoten aktKnoten; Knotenlistenelement * naechsterKn;}; struct Kantenlistenelement { Kante aktKante; Kantenlistenelement * naechsteKa; };

3 // 13_2_ADT_Unger_Graph // ungerichteter, knotenmarkierter Graph als ADT // Fortsetzung struct Graph { public: void Init(); void Druck(); void Knoten_Einfuegen(int, char*); void Kante_Einfuegen(int, int); //void Knoten_Loeschen(int);derzeit nicht //void Kante_Loeschen(int); implementiert ! bool Istleer(); bool IstKnotenda(int); bool IstKanteda(int, int); private: Knotenlistenelement* Knotenliste; Kantenlistenelement* Kantenliste; Kantenlistenelement* Hilf; /* wichtig: wird in Kante_Einfuegen verwendet, darf aber nicht lokal dazu definiert sein; --> Garbage Collection !!!*/};

4 // 13_2_ADT_Unger_Graph // ungerichteter, knotenmarkierter Graph als ADT // Fortsetzung void Knoten::Erzeuge_Kn(int id, char* label) { ID=id; Markierung=label;} char* Knoten::Get_Marke() { return Markierung;} int Knoten::Get_ID() { return ID;} void Knoten::Set_Marke(char* Marke) { Markierung=Marke;} Knoten* Kante::Get_StartKn() { return StartKn;} Knoten* Kante::Get_ZielKn() { return ZielKn;} void Kante::Set_StartKn(Knoten * SKn) { StartKn=SKn;} void Kante::Set_ZielKn(Knoten* ZKn) { ZielKn=ZKn;}

5 // 13_2_ADT_Unger_Graph // ungerichteter, knotenmarkierter Graph als ADT // Fortsetzung void Graph::Init() { Knotenliste=NULL; Kantenliste=NULL;} void Graph::Knoten_Einfuegen(int KnotenID,char *Marke){ Knotenlistenelement* Hilfsknoten= new Knotenlistenelement; if (IstKnotenda(KnotenID)) cout << "Knoten " << KnotenID << " existiert bereits. Einfügen des Knotens abgebrochen" << endl; else { Hilfsknoten->aktKnoten.Erzeuge_Kn(KnotenID, Marke); // Knoten erzeugen Hilfsknoten->aktKnoten.Set_Marke(Marke); Hilfsknoten->naechsterKn=NULL;

6 // 13_2_ADT_Unger_Graph // ungerichteter, knotenmarkierter Graph als ADT // Fortsetzung if (Knotenliste==NULL) // Knoten in die Liste einhaengen Knotenliste=Hilfsknoten; // wenn vorher Knotenliste leer else { Hilfsknoten->naechsterKn=Knotenliste; // Einfuegen am Kopf der Liste Knotenliste=Hilfsknoten; }

7 // 13_2_ADT_Unger_Graph // ungerichteter, knotenmarkierter Graph als ADT // Fortsetzung void Graph::Kante_Einfuegen(int StartKnID, int ZielKnID) { Knotenlistenelement* akKn; Knoten * SKn; Knoten * ZKn; if (!(IstKanteda(StartKnID, ZielKnID)) && StartKnID!=ZielKnID) // Kante noch nicht existent und keine Schlinge { if (IstKnotenda(StartKnID) && IstKnotenda(ZielKnID)) // existieren die partizipierenden Knoten? { akKn=Knotenliste;

8 // 13_2_ADT_Unger_Graph // ungerichteter, knotenmarkierter Graph als ADT // Fortsetzung while (akKn!=NULL) // Durchlauf durch die Knotenliste { if (akKn->aktKnoten.Get_ID()==StartKnID) SKn=&(akKn->aktKnoten); // Bei Pattern Matching Referenz auf Knoten merken! if (akKn->aktKnoten.Get_ID()==ZielKnID) ZKn=&(akKn->aktKnoten); // Bei Pattern Matching Referenz auf Knoten merken! akKn=akKn->naechsterKn; // naechste Iteration vorbereiten } Hilf=new Kantenlistenelement; Hilf->aktKante.Set_StartKn(SKn); Hilf->aktKante.Set_ZielKn(ZKn); Hilf->naechsteKa=Kantenliste;

9 // 13_2_ADT_Unger_Graph // ungerichteter, knotenmarkierter Graph als ADT // Fortsetzung // Am Kopf einfuegen Kantenliste=Hilf; } else cout << "Einer der Knoten der einzufü- genden Kante {" << StartKnID << "," << ZielKnID << "} existiert gar nicht. Einfügen der Kante abgebrochen.\n"; } else cout << "Die Kante {" << StartKnID << "," << ZielKnID << "} existiert bereits. Einfügen der Kante abgebrochen\n"; }

10 // 13_2_ADT_Unger_Graph // ungerichteter, knotenmarkierter Graph als ADT // Fortsetzung /* void Knoten_Loeschen(int id) { // hier muss zuerst kontrolliert werden, ob der Knoten Start- bzw. Zielknoten einer ex. Kante ist. // Wenn ja, dann muss eine Fehlerbehandlung erfolgen. }; */ bool Graph::Istleer() { if (Knotenliste==NULL) return true; else return false; }

11 // 13_2_ADT_Unger_Graph // ungerichteter, knotenmarkierter Graph als ADT // Fortsetzung bool Graph::IstKnotenda(int KnotenID) { Knotenlistenelement* akKn; bool erg=false; akKn=Knotenliste; while (akKn!=NULL) /* Durchlauf durch die Knotenliste bei Pattern Matching erg auf true setzen*/ { if (akKn->aktKnoten.Get_ID()==KnotenID) erg=true; akKn=akKn->naechsterKn; } return erg; }

12 // 13_2_ADT_Unger_Graph // ungerichteter, knotenmarkierter Graph als ADT // Fortsetzung bool Graph::IstKanteda(int Kn1, Kn2) { Kantenlistenelement* akKa; int K1,K2; bool erg=false; akKa=Kantenliste; while (akKa!=NULL) /* Durchlauf durch die Kantenliste bei Pattern Matching erg auf true setzen*/ { K1=akKa->aktKante.Get_StartKn()->Get_ID(); K2=akKa->aktKante.Get_ZielKn()->Get_ID(); if ((K1==Kn1 && K2==Kn2) || (K1==Kn2 && K2==Kn1)) // ungerichteter Fall: Kante (a,b) = (b,a) erg=true; akKa=akKa->naechsteKa;} return erg;}

13 // 13_2_ADT_Unger_Graph // ungerichteter, knotenmarkierter Graph als ADT // Fortsetzung void Graph::Druck() { Kantenlistenelement* akKa; Knotenlistenelement* akKn; akKn=Knotenliste; cout << "\nDie Knoten des Graphen:" << endl; while (akKn!=NULL) // Durchlauf durch die Knotenliste des Graphen { cout aktKnoten.Get_ID() << ", "; akKn=akKn->naechsterKn; } cout << endl << endl;; akKa=Kantenliste; cout << "Die Kanten des Graphen:\n ";

14 // 13_2_ADT_Unger_Graph // ungerichteter, knotenmarkierter Graph als ADT // Fortsetzung while (akKa!=NULL) { cout << "(" aktKante.Get_StartKn()->Get_ID() << ", "; cout aktKante.Get_ZielKn()->Get_ID() << "), "; akKa=akKa->naechsteKa; } };