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

                }

                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];

            }

        }

    }

    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;

                    }

                }