- •Федеральное агентство по образованию
- •Тема 3. Бинарные деревья 41
- •Тема 4. Графы 66
- •Введение
- •Терминология
- •Классификация структур данных по различным признакам
- •Типовые операции над структурами данных
- •Эффективность алгоритмов. O-обозначения
- •Тема 1. Стеки, очереди, деки
- •Операции над стеком
- •Реализация стека
- •Реализация основных операций над стеком
- •Использование стека для преобразования форм записи выражений.
- •Очередь
- •Операции над очередью
- •Операции над деком
- •Реализация очереди и дека
- •Реализация основных операций над очередью и деком
- •Итератор
- •Лабораторная работа 1. Стеки, очереди, деки
- •Тема 2. Односвязные и двусвязные линейные списки
- •Линейный список
- •Операции над линейным списком
- •Реализация линейного списка в виде односвязной динамической структуры
- •Реализация основных операций над односвязным списком
- •Циклический список
- •Операции над циклическим списком
- •Односвязная реализация циклического списка
- •Реализация основных операций над односвязным циклическим списком
- •Реализация линейного списка в виде двусвязной динамической структуры
- •Реализация основных операций над двусвязным списком
- •Циклический двусвязный список
- •Реализация основных операций над двусвязным циклическим списком
- •Лабораторная работа 2. Односвязные и двусвязные линейные списки
- •Тема 3. Бинарные деревья
- •Основные понятия и определения
- •Построение бинарного дерева
- •Операции над бинарным деревом
- •Реализация бинарного дерева
- •Реализация основных операций над бинарным деревом
- •Дерево выражения
- •Дерево поиска
- •Операции над деревом поиска
- •Реализация дерева поиска
- •Реализация операций над деревом поиска
- •Сбалансированные деревья
- •Включение в сбалансированное дерево
- •Лабораторная работа 3. Бинарные деревья
- •Тема 4.Графы
- •Основные понятия и определения
- •Граф g7
- •Операции над графом
- •Реализация графа
- •Реализация основных операций над ориентированным графом
- •Обход ориентированного графа
- •Вычисление расстояния между узлами ориентированного графа
- •Лабораторная работа 4. Ориентированные графы
- •Библиографический список
Реализация графа
Одним из способов представления графа является матричный способ. При представлении графа с помощью матрицы инцидентности строки матрицы соответствуют узлам графа, а столбцы – дугам; на пересечении каждой строки и столбца ставится 1, если дуга инцидентна узлу, и 0 в противном случае.
Граф представляют также с помощью матрицы смежности узлов. И строки и столбцы матрицы при этом соответствуют узлам графа, а на пересечении каждой строки и столбца ставится 1, если соответствующие узлы смежные, и 0 в противном случае.
Несмотря на очевидные преимущества (простота включения и исключения дуг, простота реализации большинства основных алгоритмов обработки графа), матричное представление графа не всегда удобно, поскольку число узлов (и дуг для матрицы инцидентности) требуется знать заранее. Если граф должен создаваться или изменяться во время выполнения программы, то для каждого добавления или удаления узла надо строить новую матрицу. Кроме того, память должна быть отведена для всех возможных дуг.
Очевидным решением является представление графа, при котором все узлы графа и инцидентные им дуги объединены в связанные списки. Конкретные реализации списковых структур могут быть различными: односвязные и двусвязные, линейные и циклические списки.
Списковое представление является одним из наиболее удобных и универсальных способов представления графа и позволяет представлять любые графы: ориентированные и неориентированные, взвешенные и невзвешенные, хранить информацию, связанную с дугами и узлами графа.
Рассмотрим один из способов связанного представления графа. Узлы графа объединяются в список, каждый элемент которого содержит три поля: Value(информация, связанная с узлом графа),NextNode(указатель на следующий элемент списка узлов графа) иArcList(указатель на список дуг, выходящих из данного узла, – список смежности). Каждый элемент списка смежности представляет дугу графа и содержит два поля:RearNode(указатель на элемент в списке узлов графа, которым заканчивается дуга) иNextArc(указатель на следующий элемент списка смежности данного узла).Для взвешенного графаэлемент списка дуг должен содержать дополнительное полеWeight(вес дуги).Для неориентированного графасписок дуг для каждого узла должен содержать все дуги, инцидентные этому узлу (входящие и выходящие), при этом каждая дуга будет присутствовать в представлении графа дважды, так как инцидентна двум узлам.
Пример ориентированного невзвешенногографа и его представление с помощью линейных односвязных списков:

Переменная ссылочного типа Headуказывает на начало списка узлов графа. Каждый узелNodeграфа состоит из трех полей:Value,ArcListиNextNode. ДугаArcсодержит два поля:NextArcиRearNode. Последний узел графа и последняя дуга из списка дуг каждого узла содержат указательnil. ПолеArcListузла содержит значениеnilв том случае, если этот узел не имеет исходящих из него дуг.
Описание класса tOrGraph(OrientedGraph– ориентированный граф) с использованием линейных односвязных списков имеет вид:
type
tValue = Char; // тип информационной части узла графа – Char
pArc = ^tArc;// тип указателя на дугу графа
pNode = ^tNode; // тип указателя на узел графа
tNode=record// тип узла графа
Value : tValue; // информационная часть узла графа
NextNode : pNode; // указатель на следующий узел графа
ArcList : pArc; // указатель на список смежности узла
end;// tNode
tArc = record// тип элемента списка смежности узла - дуги графа
RearNode : pNode; // указатель на узел, являющийся концом дуги
NextArc : pArc; // указатель на следующую дугу узла графа
end;// tArc
tOrGraph=class// класс – ориентированный граф
protected
fHead: pNode;// поле - указатель на начало списка узлов
fNodesNumber:Word;// поле - количество узлов графа
fArcsNumber:Word;// поле - количество дуг графа
public
property Head: pNode read fHead write fHead;
property NodesNumber: Word read fNodesNumber write fNodesNumber;
property ArcsNumber: Word read fArcsNumber write fArcsNumber;
function NodeValue(Node: pNode):tValue; // значение узла Node
function NodeAddr(v: tValue): pNode; // адрес узла графа со значением v
function ArcAddr(Node1,Node2: pNode):pArc; // смежность узлов
function HeadNode(ArcNode: pArc): pNode; // начальный узел дуги
function RearNode(ArcNode: pArc): pNode; // конечный узел дуги
function Empty: Boolean; // наличие узлов в графе
procedure AddArc(Node1,Node2: pNode); // включение дуги
procedure DeleteArc(Node1,Node2: pNode); // исключение дуги
procedure AddNode(v: tValue); // включение узла
function DeleteNode(DisNode:pNode): tValue; // исключение узла
procedure Build(var f:Text); // построение графа
procedure Revision(var f:Text); // просмотр графа
procedureClear;// удаление всех узлов графа
constructor Create; // конструктор графа
destructor Destroy; // деструктор графа
end; // tOrGraph
