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

Постусловия: нет


7.2 Клиентское определение класса «Итератор вершин»

   class Vertex_Iterator : Iterator

    {

        protected int start_idx;

        System.Collections.ArrayList visited = new System.Collections.ArrayList();

        public override object Current

        {

            get

            {

                return current_elem;

            }

            set

            {

                current_elem = (int)value;

            }

        }

        public override void next()

        {

            double dist = -1;

            int best = -1;

                for (int i = 0; i < gr.V; i++)

                {

                    if (gr.EdgeExists((int)gr.vertexData[current_elem], (int)gr.vertexData[i]) && !visited.Contains(i) )

                    {

                        PointF pBegin = (PointF)gr.vertexCoords[current_elem];

                        PointF pEnd = (PointF)gr.vertexCoords[i];

                        double newdist = Math.Sqrt(Math.Pow(pEnd.X - pBegin.X, 2.0) + Math.Pow(pEnd.Y - pBegin.Y, 2.0));

                        if (dist > newdist)

                        {

                            dist = newdist;

                            best = i;

                        }

                        current_elem = i;

                        visited.Add(current_elem);

                       // break;

                    }

                }

        }

        public Vertex_Iterator(Graph g, int start_num): base(g)

        {

            //gr = g;

            //Current = 0;

            start_idx = current_elem = (int)g.getVertex(start_num);

            visited.Add(current_elem);

        }

        public override void begin()

        {

            Current = start_idx;

            visited.Clear();

            visited.Add(start_idx);

        }

        public override void end()

        {

            Current = gr.vertexData.Count - 1;

        }

    }


8.  «Итератор ребер»

8.1 АТД “Итератор рёбер”

            ОБЩАЯ ХАРАКТЕРИСТИКА:

Это объект, позволяющий клиентской программе получить доступ к значениям данных, скрытых в коллекции «Простой статический граф», играя  роль обобщенного указателя на данные, хранящиеся в коллекции. Даёт возможность перемещаться по рёбрам графа, осуществлять переход к первому и следующим рёбрам, получать дескриптор текущего ребра.

ОПЕРАЦИИ:

Конструктор

Вход:   ссылка на объект типа «Простой граф»

Предусловия: нет

Процесс: создание объекта итератора рёбер

Выход: нет

Постусловия: создан объект итератор рёбер графа

Установка итератора на первое ребро

Вход:   нет

Предусловия: множество ребер не пусто

Процесс: установка итератор на первое ребро графа

Выход: нет

Постусловия: итератор установлен на первое ребро графа

Установка итератора на следующее ребро

Вход:   нет

Предусловия: множество ребер не пусто и итератор не вышел за пределы графа

Процесс: установка итератор на следующее ребро графа

Выход: нет

Постусловия: итератор установлен на следующее ребро графа

Проверка на выход за границы коллекции

Вход:   нет

Предусловия: нет

Процесс: проверка вышел ли итератор за пределы коллекции

Выход: true-если итератор вышел за пределы, иначе false

Постусловия: нет

Получение дескриптора текущего ребра

Вход:   нет

Предусловия: множество ребер не пусто и итератор не вышел за пределы графа

Процесс: получение дескриптора ребра

Выход: дескриптор ребра, на которое указывает итератор; генерация исключения при несоблюдении предусловия

Постусловия: нет


8.2 Клиентское определение класса «Итератор рёбер»

   class Edge_Iterator : Iterator

    {

        int num_beg;

        int num_end;

        GEdge start;

        System.Collections.ArrayList visited = new System.Collections.ArrayList();

        public Edge_Iterator(Graph g, int _num_beg, int _num_end) : base(g)

        {

            num_beg = _num_beg;

            num_end = _num_end;

               int idx1 = (int)gr.getVertex(num_beg);

               int idx2 = (int)gr.getVertex(num_end);

           if(g.type == Graph_Type.TYPE_LIST)

           {