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

                  delete iter;

            }

 

            bool beg(int &rez)//    установка итератора на первую смежную вершину,

            {return iter->beg(rez);}

 

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

            {return iter->off();}

 

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

            {

                  if(iter->next(rez)) return true;

                  return false;

            }

           

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

            {

                  Ed tmp;

                  try{

                        tmp = **iter;

                  }

                  catch (...) {

                        return NULL;

                  }

                  return tmp;

            }

      };

};

#endif

ListGraph.h

#ifndef _listGraph

#define _listGraph

#include "ATD.h"

 

 

//Представление графа при помощи списков смежности

template<class T1>

class listGraph:public GraphATD<T1>

{

      //узел списка смежности(не взвешаный)

            struct node

            {

                  node* next;//указатель на следующий эллемент

                  int num;//номер смежной вершины

                  node(int _num)

                  {

                        next=NULL;

                        num=_num;

                  }

            };

      //узел списка смежности(взвешаный)

            struct vznode:public node

            {

                  T1* data;//указатель на данные

                  vznode(int _num):node(_num)

                  {

                        data=NULL;

                  }

            };

      struct list//список смежности

      {

            friend class Iterator;

            node* ph;

            bool vz;

            list(bool _vz)//конструктор-входной параметр признак взвешанности

            {

                  vz=_vz;

                  ph=NULL;

            }

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

            {

                  if(ph==NULL)//если список пуст - добавляем новый элемент в голову

                        if(!vz)

                              ph=new node(_num);

                        else

                              ph=(node*)new vznode(_num);

                  else//иначе проверяем существование этого элемента в списке

                  {     //и если добавляемый элемент не существует в списке - добавляем его вконец

                        node* tmp=ph;

                        if(tmp->num==_num) return false;

                        while(tmp->next!=NULL) 

                        {

                              if(tmp->num!=_num)

                                   tmp=tmp->next;

                              else

                                   return false;

                        }

                        if(tmp->num!=_num)

                              if(!vz)

                                   tmp->next=new node(_num);

                              else

                                   tmp->next=(node*)new vznode(_num);

                  }

                  return true;

            }

 

            bool del(int _num)//удаление

            {

                  if(ph==NULL) return false;

                  node* tmp=ph;

                  if(ph->num==_num)//проверяем наличие удаляемого элемента в голове списка

                  {

                        ph=ph->next;

                        if(!vz)     delete tmp;

                        else {

                              delete ((vznode*)tmp)->data;

                              delete tmp;

                        }

                        return true;

                  }

                  else//если элемента нет в начале списка, то проверяем все остальные элементы

                  {

                        while(tmp->next!=NULL)

                        {