- •Федеральное агентство по образованию
- •Тема 3. Бинарные деревья 41
- •Тема 4. Графы 66
- •Введение
- •Терминология
- •Классификация структур данных по различным признакам
- •Типовые операции над структурами данных
- •Эффективность алгоритмов. O-обозначения
- •Тема 1. Стеки, очереди, деки
- •Операции над стеком
- •Реализация стека
- •Реализация основных операций над стеком
- •Использование стека для преобразования форм записи выражений.
- •Очередь
- •Операции над очередью
- •Операции над деком
- •Реализация очереди и дека
- •Реализация основных операций над очередью и деком
- •Итератор
- •Лабораторная работа 1. Стеки, очереди, деки
- •Тема 2. Односвязные и двусвязные линейные списки
- •Линейный список
- •Операции над линейным списком
- •Реализация линейного списка в виде односвязной динамической структуры
- •Реализация основных операций над односвязным списком
- •Циклический список
- •Операции над циклическим списком
- •Односвязная реализация циклического списка
- •Реализация основных операций над односвязным циклическим списком
- •Реализация линейного списка в виде двусвязной динамической структуры
- •Реализация основных операций над двусвязным списком
- •Циклический двусвязный список
- •Реализация основных операций над двусвязным циклическим списком
- •Лабораторная работа 2. Односвязные и двусвязные линейные списки
- •Тема 3. Бинарные деревья
- •Основные понятия и определения
- •Построение бинарного дерева
- •Операции над бинарным деревом
- •Реализация бинарного дерева
- •Реализация основных операций над бинарным деревом
- •Дерево выражения
- •Дерево поиска
- •Операции над деревом поиска
- •Реализация дерева поиска
- •Реализация операций над деревом поиска
- •Сбалансированные деревья
- •Включение в сбалансированное дерево
- •Лабораторная работа 3. Бинарные деревья
- •Тема 4.Графы
- •Основные понятия и определения
- •Граф g7
- •Операции над графом
- •Реализация графа
- •Реализация основных операций над ориентированным графом
- •Обход ориентированного графа
- •Вычисление расстояния между узлами ориентированного графа
- •Лабораторная работа 4. Ориентированные графы
- •Библиографический список
Циклический список
Для доступа к требуемому элементу линейного списка необходимо просматривать список с его начала независимо от положения исходной точки просмотра. Это замедляет операции доступа к элементам в списке. Замыкание элементов списка в кольцо позволяет устранить этот недостаток. Такой список называется циклическим. Просмотр циклического списка можно начинать с любого элемента, а не только с его начала, причем началом списка может служить любой из его элементов. Логическая структура циклического списка:
Операции над циклическим списком
Над циклическим списком смогут быть выполнены все операции, определенные для линейного списка. Заметим, что в логической структуре циклического списка понятия «начало» и «конец» являются условными и определяются положением указателя на некоторый элемент списка, являющийся заголовочным.
Для циклического списка также вводится новая операция – сцепление двух циклических списков – Сoncat(с1,с2).
Односвязная реализация циклического списка
Реализация циклического списка с помощью динамических переменных:
Такой список называется односвязным циклическим списком. Из любого элемента списка можно достичь любого другого элемента. Отметим, что циклический список не имеет первого и последнего элементов. Внешний указательHeadудобно использовать в качестве указателя на текущий элемент списка. При решении конкретных задач условно можно считать, что он адресуетпоследний элемент списка, что автоматически делает следующий за ним элемент первым.
Класс tCircleListможет быть описан следующим образом:
type
tValue= Real;// тип значения элемента списка - вещественный
pItem= ^tItem; // тип указателя на элемент списка
tItem= record// тип элемента списка
Value: tValue; // содержательная часть элемента списка
Next : pItem; // указатель на следующий элемент списка
end; // record tItem
tCircleList=class // класс - циклический список
protected
fHead: pItem;// поле - указатель на текущий элемент списка
fSize:Word;// поле - число элементов списка
public
// Свойство - число элементов списка (доступ по чтению и записи)
property Size: Word read fSize write fSize;
// Свойство – указатель на начало списка (доступ по чтению и записи)
property Head: Word read fHead write fHead;
// Включение элемента со значением v после элемента с адресом Addr
procedure InsertAfter(Addr: pItem; v: tValue);
// Включение элемента со значением v перед элементом с адресом Addr
procedure InsertBefore(Addr: pItem; v: tValue);
// Исключение элемента, следующего за элементом с адресом Addr
function DeleteAfter(Addr: pItem): tValue;
// Исключение элемента с указателем Addr
functionDelete(Addr:pItem):tValue;
// Включение элемента со значением v в начало списка
procedureInsertHead(v:tValue);
// Включение элемента со значением v в конец списка
procedureInsertRear(v:tValue);
// Исключение элемента из начала списка
functionDeleteHead:tValue;
// Исключение элемента из конца списка
function DeleteRear:tValue;
procedure Concat(var CList2: tCircleList); // сцепление со списком CList2
// Поиск в списке элемента со значением v и возвращение его адреса
function Search(v: tValue): pItem;
function Empty: Boolean; // возвращение true, если список пуст
procedureClear; // очистка списка
constructorCreate; // конструктор - создание пустого списка
destructor Destroy; override; // деструктор - удаление списка
end; // class tCircleList
Класс tCircleListне объявлен наследником классаtListпоскольку реализация практически всех его методов отличается от реализации одноимённых методов для нециклического списка. Отличия, в основном, заключаются в следующем:
– для операций InsertAfterиInsertBeforeпо-другому осуществляются включение элемента в пустой список и включение в начало и конец циклического списка;
– применение операции DeleteAfterдля циклического списка, состоящего из одного элемента, не должно приводить к исключению самого этого элемента;
– методы DeleteAfterиDeleteдолжны восстанавливать указатель на последний элемент циклического списка, если он исключается при выполнении этих операций;
– в методах SearchиClearпризнаком завершения просмотра циклического списка является достижение вспомогательным указателем того элемента, с которого начался просмотр.
И только конструктор Createи деструкторDestroyреализуются так же как и одноимённые методы классаtList.
Очевидно, что операции включения и исключения справа и слева от текущего элемента (InsertHead,InsertRear,DeleteHead,DeleteRear) выполняют те же действия, что и одноимённые операции для нециклического списка. Отличие заключается в том, что новые операции изменяют значение указателя на последний элемент циклического списка, если список расширился влево или вправо либо сузился слева или справа.