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

                  while(tmp!=NULL)

                  {

                        rez->Insert(i,tmp->num);

                        if(vz && ((vznode*)tmp)->data!=NULL)

                              rez->SetEdge(i,tmp->num,*((vznode*)tmp)->data);

                        tmp=tmp->next;

                  }

            }

            return rez;

      };

 

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

      {

            if(v1==v2 || v1>=sz || v2>=sz || v1<0 || v2<0)//проверяем входные параметры

                  return false;

            if(array[v1]->insert(v2))//осуществляем вставку элемента в соответствующий список смежности

            {

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

                        array[v2]->insert(v1);

                  number++;

                  return true;

            }

            return false;

      }

      bool Delete(int v1,int v2)//удаление

      {

            if(v1==v2 || v1>=sz || v2>=sz || v1<0 || v2<0)//проверяем входные параметры

                  return false;

            if(array[v1]->del(v2))//удаляем элемент из соответственного списка смежности

            {

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

                        array[v2]->del(v1);

                  number--;

                  return true;

            }

            return false;

      }

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

      {

            if(v1<0 || v2<0 || v1>=sz || v2>=sz)//проверяем входные параметры

                  return false;

            return array[v1]->Exist(v2);//осуществляем проверку в соответственном списке смежности

      }

 

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

      {

            if(v1==v2 || v1>=sz || v2>=sz || v1<0 || v2<0 || !vz)//проверка входных параметров

                  return false;

            array[v1]->SetData(v2,data);//задаем параметры соответствующего элемента списка смежности

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

                  array[v2]->SetData(v1,data);

            return true;

      }

 

 

      T1* GetEdge(int v1,int v2)//получение данных

      {

            if(v1==v2 || v1>=sz || v2>=sz || v1<0 || v2<0 || !vz)//проверяем входные параметры

                  throw "params not in interval";

            return array[v1]->getData(v2);//получаем параметры соответственного узла списка смежности

      }

 

      class Iterator;

      friend class Iterator;

      class Iterator:public IteratorATD<T1>//Итератор

      {

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

            int vNum;         //номер вершины, для которой создан итератор

            node* cur;        // указатель на текущую смежную вершину

      public:

            Iterator(listGraph<T1>* _g,int _vNum)//конструктор

            {//инициализируем параметры

                  g=_g;

                  vNum=_vNum;

                  cur=NULL;

            }

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

            bool beg(int &rez)//установка на начало

            {

                  if(vNum>=g->sz || vNum<0)//проверка параметров

                        return false;

                  cur=g->array[vNum]->ph;//устанавливаем элемент на голову соответствующего списка смежности

                  if(!off())

                        rez=cur->num;

                  return !off();

            }

            bool off()//опрос окончания просмотра смежных вершин,

            {

                  if(cur==NULL)//если итератор не установле то cur равен NULL

                        return true;

                  return false;

            }

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