Разработка абстрактного типа данных «Простой граф», страница 7

      virtual bool next(int&)=0;//переход к следующей смежной вершине,

      virtual T1& operator*()=0;//доступ к данным текущего ребра.

      virtual ~IteratorATD(){};

};

 

#endif

Graph.h

#ifndef _Graph

#define _Graph

 

#include "ATD.h"

#include "listGraph.h"

#include "matrixGraph.h"

 

//Интерфейс класса ГРАФ

 

template<class Ed>

class graph

{

      int maxE;

      GraphATD<Ed> *g;//указатель на класс предвтавления

 

public:

 

      graph(int sz,bool or,bool vz)//конструктор--входные параметры размер, и свойства графа

      {

            g=(GraphATD<Ed>*)new listGraph<Ed>(sz,or,vz);

            maxE=sz*(sz-1);

            if(!or) maxE/=2;

      }

 

      ~graph()//деструктор

      {

            /*switch(g->Dense())

            {

            case 1: delete (listGraph<Ed>*)g; break;

            case 2: delete (matrixGraph<Ed>*)g; break;

            }*/

            delete g;

      }

 

      int V()//   - опрос числа вершин в графе,

      {return g->V();};

 

      int E()//   - опрос числа ребер в графе,

      {return g->E();}

 

      bool Directed()// опрос типа графа (ориентированный / неориентированный)

      {return g->Directed();}

 

      int Dense()//     опрос формы представления графа (L- граф 1 / M- граф 2),

      {return g->Dense();}

 

      bool Insert(int v1,int v2)//  вставка ребра, соединяющего вершины v1, v2,

      {return g->Insert(v1,v2);}

     

      bool Delete(int v1,int v2)//  удаление ребра, соединяющего вершины v1, v2,

      {return g->Delete(v1,v2);}

     

      bool Edge(int v1,int v2)//    опрос наличия ребра, соединяющего вершины v1, v2,

      {return g->Edge(v1,v2);}

 

      bool SetEdge(int v1,int v2,Ed data) //задание параметров ребра,

      {

            if(!g->Weighed() || !g->Edge(v1,v2)) return false;

            return g->SetEdge(v1,v2,data);

      }

     

      Ed* GetEdge(int v1,int v2)               //получение параметров ребра

      {

            if(!g->Weighed()) return NULL;

            Ed* tmp;

            try{

                  tmp = g->GetEdge(v1,v2);

            }

            catch (...) {

                  return NULL;

            }

            return tmp;

      }

 

      bool ToMatrixGraph()

      {

            if(g->Dense()==1)

            {

                  listGraph<Ed> *tmp;

                  tmp=(listGraph<Ed>*)g;

                  g=g->ToMatrixGraph();

                  tmp->~listGraph();

                  return true;

            }

            return false;

      }

 

      bool ToListGraph()

      {

            if(g->Dense()==2)

            {

                  matrixGraph<Ed> *tmp;

                  tmp=(matrixGraph<Ed>*)g;

                  g=g->ToListGraph();

                  tmp->~matrixGraph();

                  return true;

            }

            return false;

      }

 

      class Iterator;

      friend class Iterator;

 

      class Iterator          //интерфейс итератора

      {

            graph* graf;            //указатель на связанный с итератором граф

            IteratorATD<Ed>* iter;//указатель на обьект класса представления

            int v;

 

      public:

           

            Iterator(graph* g,int _v)//конструктор

            {

                  v=_v;

                  graf=g;

                  switch(g->Dense())//создаём соответственный объект класса представления

                  {

                  case 1:iter=(IteratorATD<Ed>*)new listGraph<Ed>::Iterator(((listGraph<Ed>*)graf->g),v); break;

                  case 2:iter=(IteratorATD<Ed>*)new matrixGraph<Ed>::Iterator(((matrixGraph<Ed>*)graf->g),v); break;

                  }

            }

 

            ~Iterator()//деструктор

            {