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

                {

                    if (gr.EdgeExists(vertex_number, (int)gr.vertexData[i]))

                    {

                        current_elem = i;

                        break;

                    }

                }

            }

        }

        public override void end()

        {

            if (gr.type == Graph_Type.TYPE_LIST)

            {

                LGraph lg = (LGraph)gr;

                List<GEdge> lst = (List<GEdge>)lg.links[vertex_idx];

                current_elem = lst.Count - 1;

            }

            else if (gr.type == Graph_Type.TYPE_MATRIX)

            {

                for (int i = gr.V - 1; i > 0; i--)

                {

                    if (gr.EdgeExists(vertex_number, (int)gr.vertexData[i]))

                    {

                        current_elem = i;

                        break;

                    }

                }

            }

        }

    }

 

10.  «Итератор входящих ребер»

10.1 АТД “Итератор входящих рёбер”

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

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

            ДАННЫЕ

Параметры

vertex_number – номер вершины, в которую входят ребра

            ОПЕРАЦИИ:

Конструктор

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

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

Процесс: создание объекта итератора входящих рёбер, m_inVertex = v

Выход: нет

Постусловия: создан объект итератор входящих рёбер вершины

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

Вход:   нет

Предусловия: вершина vertex_number  существует и множество её входящих ребер не пусто

Процесс: установка итератора на первое входящее ребро вершины

Выход: нет

Постусловия: итератор установлен на первое входящее ребро вершины

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

Вход:   нет

Предусловия: вершина vertex_number  существует и множество её входящих ребер не пусто и итератор не вышел за пределы множества входящих ребер вершины

Процесс: установка итератора на следующее входящее ребро вершины

Выход: нет

Постусловия: итератор установлен на следующее входящее ребро вершины

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

Вход:   нет

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

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

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

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

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

Вход:   нет

Предусловия: вершина vertex_number  существует и множество её входящих ребер не пусто и итератор не вышел за пределы множества входящих ребер вершины

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

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

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


10.2 Клиентское определение класса «Итератор входящих рёбер»

    class Inbox_Edge_Iterator : Iterator

    {

        int vertex_number;

        int vertex_idx;

        public Inbox_Edge_Iterator(Graph g, int num)

            : base(g)

        {

            vertex_number = num;

            vertex_idx = (int)g.getVertex(num);

                //MGraph mgraph = (MGraph)g;

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

                {

                    if (g.EdgeExists((int)g.vertexData[i], vertex_number))

                    {

                        current_elem = i;

                        break;

                    }

                }

        }

        public override object Current

        {

            get

            {

                GEdge edge = null;

                if (current_elem >= gr.vertexData.Count)

                    return null;

                switch (gr.type)

                {

                    case Graph_Type.TYPE_LIST:

                        {

                            List<GEdge> lst = (List<GEdge>)((LGraph)gr).links[current_elem];