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

            {

                  if(off())//если итератор не установлен выходим из функции

                        return false;

                  cur=cur->next;//переходим к следующему элементу списка смежности

                  if(!off()){

                        rez=cur->num;

                        return true;

                  }

                  return false;

            }

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

            {

                  if(off() || !g->vz || ((vznode*)cur)->data==NULL)//проверяем параметры

                        throw 1;

                  return *((vznode*)cur)->data;//получаем данные

            }

      };

};   

 

#endif

MatrixGraph.h

#ifndef _matrixGraph

#define _matrixGraph

 

#include "ATD.h"

 

template<class T1>

class matrixGraph:public GraphATD<T1>

{

      //класс матрица

      struct matrix

      {

            bool** mas;//массив смежности

            int sz;//размер

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

            matrix(int _sz)//конструктор

            {

                  sz=_sz;

                  mas=new bool*[sz];

                  for(int i=0;i<sz;i++)//создаём массив и заполняем его нулями

                        mas[i]=new bool[sz];

                  for(i=0;i<sz;i++)

                        for(int j=0;j<sz;j++)

                              mas[i][j]=0;

            }

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

            {

                  for(int i=0;i<sz;i++)

                        delete [] mas[i];

                  delete [] mas;

            }

            bool insert(int v1,int v2)//вставка нового элемента

            {

                  if(v1==v2 || v1<0 ||v2<0 || v1>=sz ||v2>=sz)//проверка параметров

                        return false;

                  if(mas[v1][v2])

                        return false;

                  else{//вставка ребра

                        mas[v1][v2]=1,number++;return true;}

            }

 

            bool del(int v1,int v2)//удаление элемента

            {

                  if(v1==v2 || v1<0 ||v2<0 || v1>=sz ||v2>=sz)//проверка параметров

                        return false;

                  if(!mas[v1][v2])

                        return false;

                  else{//удаление элемента

                        mas[v1][v2]=0,number--;return true;}

            }

 

 

            bool exist(int v1,int v2)//проверка существования

            {

                  if(v1==v2 || v1<0 ||v2<0 || v1>=sz ||v2>=sz)//проверка параметров

                        return false;

                  return mas[v1][v2];//проверка существования элемента

            }

      };

 

      //класс взвешаная матрица

      //наследует все свойства простой матрицы

      struct vzmatrix:public matrix

      {

            T1*** ves;//массив указателей на веса рёбер

            vzmatrix(int _sz):matrix(_sz)//конструктор

            {

                  ves=new T1**[sz];//создаём массив указателей на веса и заполняем его нулями

                  for(int i=0;i<sz;i++)

                        ves[i]=new T1*[sz];

                  for(i=0;i<sz;i++)

                        for(int j=0; j<sz; j++)

                              ves[i][j]=NULL;

            }

 

            ~vzmatrix():~matrix()//деструктор

            {

                  for(int i=0;i<sz;i++)

                        delete [] ves[i];

                  delete [] ves;

            }

            void setVes(int v1,int v2,T1 _data)//задание веса

            {

                  if(v1==v2 || v1<0 ||v2<0 || v1>=sz ||v2>=sz)//проверка параметров

                        return;

                  ves[v1][v2]=new T1(_data);//задание веса

            }

 

            T1* getVes(int v1,int v2)//получение веса

            {

                  if(v1==v2 || v1<0 ||v2<0 || v1>=sz ||v2>=sz || ves[v1][v2]==NULL)//проверка параметров