Präsentation herunterladen
Die Präsentation wird geladen. Bitte warten
Veröffentlicht von:Heiko Neller Geändert vor über 9 Jahren
1
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
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
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
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
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
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
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
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
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
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
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
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 // 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
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; } };
Ähnliche Präsentationen
© 2024 SlidePlayer.org Inc.
All rights reserved.