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

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

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

Выход: нет

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

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

Вход:   нет

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

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

Выход: нет

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

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

Вход:   нет

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

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

Выход: нет

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

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

Вход:   нет

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

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

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

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


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

// Класс итератор исходящих ребер является вложенным в        // шаблонный класс «Простой граф»

    class Outbox_Edge_Iterator : Iterator

    {

        int vertex_number;

        int vertex_idx;

        public Outbox_Edge_Iterator(Graph g, int num):base(g)

        {

            vertex_number = num;

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

                //MGraph mgraph = (MGraph)g;

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

                {

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

                    {

                        current_elem = i;

                        break;

                    }

                }

        }

        public override object Current

        {

            get

            {

                if (current_elem >= gr.vertexData.Count)

                    return null;

                GEdge edge = null;

                switch (gr.type)

                {

                    case Graph_Type.TYPE_LIST:

                        {

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

                            //foreach (GEdge e in lst)

                            //    if (e.v_end == (int)gr.vertexData[current_elem])

                            //        edge = e;

                            edge = lst.Count == 0 || current_elem >= lst.Count ? null : lst[current_elem];

                            break;

                        }

                    case Graph_Type.TYPE_MATRIX:

                        {

                            edge = ((MGraph)gr).matrix[vertex_idx, current_elem];

                            break;

                        }

                }

                return edge;

            }

            set

            {

                current_elem = (int)value;

            }

        }

        public override void next()

        {

            if (current_elem >= gr.getEdgeCountForVertex(vertex_number) && gr.type == Graph_Type.TYPE_LIST)

                return;

            else if (current_elem+1 >= gr.V && gr.type == Graph_Type.TYPE_MATRIX)

                return;

            //while (true)

            //{

                current_elem++;

                if (gr.type == Graph_Type.TYPE_MATRIX)

                {

                    while(!gr.EdgeExists(vertex_number, (int)gr.vertexData[current_elem]))

                        current_elem++;

                }

        }

        public override void begin()

        {

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

            //{

            //    MGraph mgraph = (MGraph)gr;

            if (gr.type == Graph_Type.TYPE_LIST)

            {

                LGraph lg = (LGraph)gr;

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

                current_elem = 0;

            }

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

            {

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