Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

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

Ähnliche Präsentationen


Präsentation zum Thema: "1 // 13_2_ADT_Unger_Graph // ungerichteter, knotenmarkierter Graph als ADT // #include struct Knoten { public: void Erzeuge_Kn (int, char*); char* Get_Marke."—  Präsentation transkript:

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; } };


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

Ähnliche Präsentationen


Google-Anzeigen