- •Тема 1. Стеки, очереди, деки 7
- •Тема 2. Односвязные и двусвязные линейные списки 21
- •Тема 3. Бинарные деревья 40
- •Тема 4. Графы 65
- •Введение
- •Терминология
- •Классификация структур данных по различным признакам
- •Типовые операции над структурами данных
- •Эффективность алгоритмов. O-обозначения
- •Тема 1. Стеки, очереди, деки
- •Операции над стеком
- •Реализация стека
- •Реализация основных операций над стеком
- •Использование стека для преобразования форм записи выражений.
- •Очередь
- •Операции над очередью
- •Операции над деком
- •Реализация очереди и дека
- •Реализация основных операций над очередью и деком
- •Итератор
- •Лабораторная работа 1. Стеки, очереди, деки
- •Тема 2. Односвязные и двусвязные линейные списки
- •Линейный список
- •Операции над линейным списком
- •Реализация линейного списка в виде односвязной динамической структуры
- •Реализация основных операций над односвязным списком
- •Циклический список
- •Операции над циклическим списком
- •Односвязная реализация циклического списка
- •Реализация основных операций над односвязным циклическим списком
- •Реализация линейного списка в виде двусвязной динамической структуры
- •Реализация основных операций над двусвязным списком
- •Циклический двусвязный список
- •Реализация основных операций над двусвязным циклическим списком
- •Лабораторная работа 2. Односвязные и двусвязные линейные списки
- •Тема 3. Бинарные деревья
- •Основные понятия и определения
- •Построение бинарного дерева
- •Операции над бинарным деревом
- •Реализация бинарного дерева
- •Реализация основных операций над бинарным деревом
- •Дерево выражения
- •Дерево поиска
- •Операции над деревом поиска
- •Реализация дерева поиска
- •Реализация операций над деревом поиска
- •Сбалансированные деревья
- •Включение в сбалансированное дерево
- •Лабораторная работа 3. Бинарные деревья
- •Тема 4. Графы
- •Основные понятия и определения
- •Граф g7
- •Операции над графом
- •Реализация графа
- •Реализация основных операций над ориентированным графом
- •Обход ориентированного графа
- •Вычисление расстояния между узлами ориентированного графа
- •Лабораторная работа 4. Ориентированные графы
- •Библиографический список
-
Реализация основных операций над двусвязным списком
Включение элемента со значением v в двусвязный список справа от элемента с заданным адресом Addr выполняется по следующей схеме:
Реализация операции приведена ниже. Предполагается, что значение Addr отлично от nil и элемент с адресом Addr присутствует в списке. Если список пуст, то новый элемент включается в начало списка. При включении в конец списка указатель Rear передвигается на включённый элемент.
procedure tDCList.InsertRight(Addr: pItem; v: tValue);
var
NewItem: pItem; // указатель на новый элемент
begin
NewItem:= New(pItem); // выделение памяти под новый элемент списка
NewItem^.Value:= v;
if Empty
then begin // если список пуст, включаем в его начало
NewItem^.Left:= nil; NewItem^.Right:= nil;
fHead:= NewItem; fRear:= NewItem; end
else begin // список не пуст
NewItem^.Left:= Addr;
NewItem^.Right:= Addr^.Right;
if Addr=fRear
then fRear:= NewItem // если включение в конец списка
else Addr^.Right^.Left:= NewItem; // если включение в середину
Addr^.Right:= NewItem;
end;
Inc(fSize); // увеличение числа элементов списка на 1
end; // procedure tDCList.InsertRight
Включение элемента в двусвязный список слева от элемента с адресом Addr выполняется подобно включению справа, но все левые указатели заменяются правыми и наоборот, и вместо ситуации включения в конец списка анализируется ситуация включения в начало списка.
Исключение из двусвязного списка элемента с указателем Addr. При реализации операции необходимо рассмотреть следующие частные случаи:
– если исключается элемент в начале списка (Addr=fHead), то расположенный справа от удаляемого элемент должен стать первым;
– если исключается элемент в конце списка (Addr=fRear), то расположенный слева от удаляемого элемент должен стать последним.
function tDCList.Delete(Addr: pItem): tValue;
begin
Delete:= Addr^.Value;
if Addr=fHead
then fHead:=Addr^.Right // исключается первый элемент
else Addr^.Left^.Right:=Addr^.Right; // исключается не первый элемент
if Addr=fRear
then fRear:=Addr^.Left // исключается последний элемент
else Addr^.Right^.Left:=Addr^.Left; // исключается не последний элемент
Dispose(Addr);
Dec(fSize); // уменьшение числа элементов на 1
end; // function tDCList.Delete
Исключение из двусвязного списка элемента, расположенного справа от элемента с адресом Addr можно выполнить следующим образом: передвинуть указатель Addr на элемент, который необходимо удалить, и исключить его из списка с помощью операции Delete.
function tDCList.DeleteRight(Addr: pItem): tValue;
begin
if Addr=fRear
then WriteLn('Исключаемый элемент отсутствует')
else begin
Addr:= Addr^.Right; DeleteRight:= Delete(Addr);
end;
end; // function tDCList.DeleteRight
Так же легко исключить элемент, стоящий слева от заданного. В этом случае необходимо проанализировать ситуацию Addr=fHead, которая означает, что исключаемый элемент отсутствует в списке.
Операции исключения элементов из двусвязного списка DeleteRight и Delete неприменимы к пустому списку; при их реализации предполагается, что Addr<>nil, и элемент с заданным адресом присутствует в списке.
Поиск элемента с заданным значением v в двусвязном списке выполняется так же как и поиск элемента в односвязном списке с той разницей, что указатель Next в функции Search заменяется на Right.