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

                }

                num_beg = lst[0].v_beg;

                num_end = lst[0].v_end;

            }

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

            {

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

                {

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

                    {

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

                        {

                            num_beg = (int)gr.vertexData[j];

                            num_end = (int)gr.vertexData[i];

                            visited.Clear();

                            visited.Add(start);

                            return;

                        }

                    }

                }

            }

        }

        public override void end()

        {

            if (gr.type == Graph_Type.TYPE_LIST)

            {

                LGraph lg = (LGraph)gr;

                int i = lg.links.Count - 1;

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

                while (lst.Count == 0)

                {

                    i++;

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

                }

                int last = lst.Count - 1;

                num_beg = lst[last].v_beg;

                num_end = lst[last].v_end;

            }

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

            {

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

                {

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

                    {

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

                        {

                            num_beg = (int)gr.vertexData[j];

                            num_end = (int)gr.vertexData[i];

                            for (int x = 0; x < gr.E + 1; x++)

                                visited.Add(x);

                            return;

                        }

                    }

                }

            }

        }

        public override object Current

        {

            get

            {

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

                switch (gr.type)

                {

                    case Graph_Type.TYPE_LIST:

                        {

                            foreach (GEdge edge in (List<GEdge>)((LGraph)gr).links[idx])

                                if (edge.v_end == num_end)

                                    return edge;

                            break;

                        }

                    case Graph_Type.TYPE_MATRIX:

                        {

                            MGraph mg = (MGraph)gr;

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

                                if (mg.matrix[idx, i] != null)

                                {

                                    if (mg.matrix[idx, i].v_end == num_end)

                                        return mg.matrix[idx, i];

                                }

                            break;

                        }

                }

                return new GEdge(num_beg, num_end);

            }

            set

            {

                GEdge val = (GEdge)value;

                num_beg = (int)gr.vertexData[val.v_beg];

                num_end = (int)gr.vertexData[val.v_end];

            }

        }

    }

9.  «Итератор исходящих ребер»

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

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

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

            ДАННЫЕ

Параметры

vertex_number – номер вершины, из которой исходят ребра

            ОПЕРАЦИИ:

Конструктор

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