
- •Федеральное агентство по образованию
- •Тема 3. Бинарные деревья 41
- •Тема 4. Графы 66
- •Введение
- •Терминология
- •Классификация структур данных по различным признакам
- •Типовые операции над структурами данных
- •Эффективность алгоритмов. O-обозначения
- •Тема 1. Стеки, очереди, деки
- •Операции над стеком
- •Реализация стека
- •Реализация основных операций над стеком
- •Использование стека для преобразования форм записи выражений.
- •Очередь
- •Операции над очередью
- •Операции над деком
- •Реализация очереди и дека
- •Реализация основных операций над очередью и деком
- •Итератор
- •Лабораторная работа 1. Стеки, очереди, деки
- •Тема 2. Односвязные и двусвязные линейные списки
- •Линейный список
- •Операции над линейным списком
- •Реализация линейного списка в виде односвязной динамической структуры
- •Реализация основных операций над односвязным списком
- •Циклический список
- •Операции над циклическим списком
- •Односвязная реализация циклического списка
- •Реализация основных операций над односвязным циклическим списком
- •Реализация линейного списка в виде двусвязной динамической структуры
- •Реализация основных операций над двусвязным списком
- •Циклический двусвязный список
- •Реализация основных операций над двусвязным циклическим списком
- •Лабораторная работа 2. Односвязные и двусвязные линейные списки
- •Тема 3. Бинарные деревья
- •Основные понятия и определения
- •Построение бинарного дерева
- •Операции над бинарным деревом
- •Реализация бинарного дерева
- •Реализация основных операций над бинарным деревом
- •Дерево выражения
- •Дерево поиска
- •Операции над деревом поиска
- •Реализация дерева поиска
- •Реализация операций над деревом поиска
- •Сбалансированные деревья
- •Включение в сбалансированное дерево
- •Лабораторная работа 3. Бинарные деревья
- •Тема 4.Графы
- •Основные понятия и определения
- •Граф g7
- •Операции над графом
- •Реализация графа
- •Реализация основных операций над ориентированным графом
- •Обход ориентированного графа
- •Вычисление расстояния между узлами ориентированного графа
- •Лабораторная работа 4. Ориентированные графы
- •Библиографический список
Реализация линейного списка в виде двусвязной динамической структуры
Односвязный список имеет ряд недостатков. Такой список нельзя просматривать в обратном направлении. Располагая только значением указателя на данный элемент, удалить последний невозможно. При необходимости иметь такую возможность можно воспользоваться соответствующей структурой данных, называемой линейным двусвязным списком. Каждый элемент такого списка содержит два указателя. Один указывает на предшествующий элемент, а другой – на последующий. Понятия предшествующего и последующего элементов, начала и конца списка логически эквивалентны, т.к. доступ к каждому элементу может быть осуществлен с любого конца списка и список полностью симметричен. При описании двусвязных списков используют термины «левый» и «правый» для определения элементов, расположенных соответственно слева и справа от текущего элемента.
Динамическая реализация линейного двусвязного списка имеет вид:
Переменные ссылочного типа HeadиRearуказывают соответственно на начало и конец списка (на его крайний левый и крайний правый элементы). В конце каждого направления содержится указательnil.
Работа с двусвязным линейным списком предполагает выполнение всех операций, определенных для односвязного линейного списка.
Описание класса tDCList (DCList – Doubly Connected List):
type
tValue= Real;// тип значения элемента списка – вещественный
pItem= ^tItem; // тип указателя на элемент двусвязногосписка
tItem= record// тип элемента двусвязногосписка
Value: tValue; // содержательная часть элемента списка
Left, Right: pItem; // указатели на элементы слева и справа от текущего
end; // record tItem
tDCList = class // класс – двусвязный список
protected
fHead, fRear: pItem;// поля – указатели на начало и конец списка
fSize:Word;// поле – число элементов списка
public
// Свойство - число элементов списка (доступ по чтению и записи)
property Size: Word read fSize write fSize;
// Свойство – указатель на начало списка (доступ по чтению и записи)
property Head: pItem read fHead write fHead;
// Свойство – указатель на конец списка (доступ по чтению и записи)
property Rear: pItem read fRear write fRear;
// Включение элемента со значением v справа от элемента с адресом Addr
procedure InsertRight(Addr: pItem; v: tValue);
// Включение элемента со значением v слева от элемента с адресом Addr
procedure InsertLeft(Addr: pItem; v: tValue);
// Исключение элемента справа от элемента с указателем Addr
function DeleteRight(Addr: pItem): tValue;
// Исключение из списка элемента с указателем Addr
function Delete(Addr: pItem): tValue;
// Возвращение адреса элемента со значением v
function Search(v: tValue): pItem;
// Включение элемента со значением v в начало списка
procedureInsertHead(v:tValue);
// Включение элемента со значением v в конец списка
procedure InsertRear(v: tValue);
function DeleteHead: tValue; // исключение из начала
function DeleteRear: tValue; // исключение из конца
function Empty: Boolean; // возвращение true, если список пуст
procedureClear;// очистка списка
constructorCreate;// конструктор - создание пустого списка
destructor Destroy; override; // деструктор - удаление списка
end; // tDCList
Для двусвязного списка справедливо следующее правило: если Addrесть указатель на любой его элемент, то
Addr^.Left^.Right = Addr = Addr^.Right^.Left.