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

                        throw 1;

                  return ves[v1][v2];//получение веса

            }

      };

 

      matrix* mas;      //укзатель на объект представления маатрицы

      int number;       //колличество эллементов

      int sz;                 //размер матрицы

      bool or,vz;       //свойства

public:

      matrixGraph(int _sz,bool _or,bool _vz)//конструктор

      {//инициализация параметров

            or=_or;

            vz=_vz;

            sz=_sz;

            number=0;

            if(!vz)//создание соответственного класс представления

                  mas=new matrix(_sz);

            else

                  mas=(matrix*)new vzmatrix(_sz);

      }

      ~matrixGraph()

      {

            delete mas;

      }

 

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

            return 2;

      };

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

      {return mas->sz;}

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

      {return number;}

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

      {return or;}

      bool Weighed()

      {return vz;}

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

      {

            if(mas->insert(v1,v2)){//вставка ребра в объект класса представления

                  number++;

            if(!or)//если граф не ориентированный, то вставляем обратное ребро

                  mas->insert(v2,v1);

            return true;

            }

            return false;

      }

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

      {

            if(mas->del(v1,v2))//удаление ребра из объекта класса представления

                  number--;

            else return false;

            if(!or)//если граф не ориентированный, то удаляем обратное ребро

                  mas->del(v2,v1);

            return true;

      }

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

      {

            return mas->exist(v1,v2);//проверяем наличие ребра

      }

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

      {

            if(!vz)//задать вес можно только во взвешанную структуру

                  throw "not weighed";

            ((vzmatrix*)mas)->setVes(v1,v2,data);//задаём вес

            if(!or)//если граф неориентированный - задаём вес обратного ребра

                  ((vzmatrix*)mas)->setVes(v2,v1,data);

            return true;

      }

 

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

      {

            if(!vz || !Edge(v1,v2))//получить вес можно только из взвешаннной структуры

                  throw "not weighed or not exist data";

            return ((vzmatrix*)mas)->getVes(v1,v2);//получаем вес

      }

 

      GraphATD<T1>* ToListGraph()

      {

            GraphATD<T1>* rez=(GraphATD<T1>*)new listGraph<T1>(mas->sz,or,vz);//создаем L-граф

            for(int i=0;i<mas->sz;i++)//копируем все эллементы из текущего объекта в новый

            {

                  for(int j=0;j<mas->sz;j++)

                  {

                        if(Edge(i,j))

                        {

                              rez->Insert(i,j);

                              if(vz && ((vzmatrix*)mas)->ves[i][j]!=NULL)

                                   rez->SetEdge(i,j,*((vzmatrix*)mas)->ves[i][j]);

                        }

                  }

            }

            return rez;

      }

 

      GraphATD<T1>* ToMatrixGraph()

      {

            return (GraphATD<T1>*)this;

      }

 

      class Iterator;

      friend class Iterator;

     

      //итератор

      class Iterator:public IteratorATD<T1>

      {

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