Предусловия: нет
Процесс: создание объекта итератора исходящих рёбер, vertex_number = v_num
Выход: нет
Постусловия: создан объект итератор исходящих рёбер вершины
Установка итератора на первое ребро
Вход: нет
Предусловия: вершина vertex_number существует и множество её исходящих ребер не пусто
Процесс: установка итератора на первое исходящее ребро вершины
Выход: нет
Постусловия: итератор установлен на первое исходящее ребро вершины
Установка итератора на следующее ребро
Вход: нет
Предусловия: вершина vertex_number существует и множество её исходящих ребер не пусто и итератор не вышел за пределы множества исходящих ребер вершины
Процесс: установка итератора на следующее исходящее ребро вершины
Выход: нет
Постусловия: итератор установлен на следующее исходящее ребро вершины
Проверка на выход за границы коллекции
Вход: нет
Предусловия: нет
Процесс: проверка вышел ли итератор за пределы коллекции
Выход: true-если итератор вышел за пределы, иначе false
Постусловия: нет
// Класс итератор исходящих ребер является вложенным в // шаблонный класс «Простой граф»
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++)
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.