
- •Федеральное агентство по образованию
- •Тема 3. Бинарные деревья 41
- •Тема 4. Графы 66
- •Введение
- •Терминология
- •Классификация структур данных по различным признакам
- •Типовые операции над структурами данных
- •Эффективность алгоритмов. O-обозначения
- •Тема 1. Стеки, очереди, деки
- •Операции над стеком
- •Реализация стека
- •Реализация основных операций над стеком
- •Использование стека для преобразования форм записи выражений.
- •Очередь
- •Операции над очередью
- •Операции над деком
- •Реализация очереди и дека
- •Реализация основных операций над очередью и деком
- •Итератор
- •Лабораторная работа 1. Стеки, очереди, деки
- •Тема 2. Односвязные и двусвязные линейные списки
- •Линейный список
- •Операции над линейным списком
- •Реализация линейного списка в виде односвязной динамической структуры
- •Реализация основных операций над односвязным списком
- •Циклический список
- •Операции над циклическим списком
- •Односвязная реализация циклического списка
- •Реализация основных операций над односвязным циклическим списком
- •Реализация линейного списка в виде двусвязной динамической структуры
- •Реализация основных операций над двусвязным списком
- •Циклический двусвязный список
- •Реализация основных операций над двусвязным циклическим списком
- •Лабораторная работа 2. Односвязные и двусвязные линейные списки
- •Тема 3. Бинарные деревья
- •Основные понятия и определения
- •Построение бинарного дерева
- •Операции над бинарным деревом
- •Реализация бинарного дерева
- •Реализация основных операций над бинарным деревом
- •Дерево выражения
- •Дерево поиска
- •Операции над деревом поиска
- •Реализация дерева поиска
- •Реализация операций над деревом поиска
- •Сбалансированные деревья
- •Включение в сбалансированное дерево
- •Лабораторная работа 3. Бинарные деревья
- •Тема 4.Графы
- •Основные понятия и определения
- •Граф g7
- •Операции над графом
- •Реализация графа
- •Реализация основных операций над ориентированным графом
- •Обход ориентированного графа
- •Вычисление расстояния между узлами ориентированного графа
- •Лабораторная работа 4. Ориентированные графы
- •Библиографический список
Реализация основных операций над двусвязным списком
Включение элемента со значением v в двусвязный список справа от элемента с заданным адресом Addrвыполняется по следующей схеме:
Реализация операции приведена ниже. Предполагается, что значение Addrотлично отnilи элемент с адресомAddrприсутствует в списке. Если список пуст, то новый элемент включается в начало списка. При включении в конец списка указательRearпередвигается на включенный элемент.
proceduretDCList.InsertRight(Addr: pItem; v: tValue);
var
NewItem: pItem; // указатель на новый элемент
begin
NewItem:= New(pItem); // выделение памяти под новый элемент списка
NewItem^.Value:=v;
ifEmpty
thenbegin// если список пуст, включаем в его начало
NewItem^.Left:= nil; NewItem^.Right:= nil;
fHead:= NewItem; fRear:= NewItem; end
else begin // список не пуст
NewItem^.Left:= Addr;
NewItem^.Right:= Addr^.Right;
ifAddr=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), то расположенный слева от удаляемого элемент должен стать последним.
functiontDCList.Delete(Addr: pItem): tValue;
begin
Delete:= Addr^.Value;
ifAddr=fHead
thenfHead:=Addr^.Right// исключается первый элемент
elseAddr^.Left^.Right:=Addr^.Right;// исключается не первый элемент
if Addr=fRear
then fRear:=Addr^.Left // исключается последний элемент
elseAddr^.Right^.Left:=Addr^.Left;// исключается не последний элемент
Dispose(Addr);
Dec(fSize);// уменьшение числа элементов на1
end;// function tDCList.Delete
Исключение из двусвязного списка элемента, расположенного справа от элемента с адресом Addrможно выполнить следующим образом: передвинуть указательAddrна элемент, который необходимо удалить, и исключить его из списка с помощью операцииDelete.
functiontDCList.DeleteRight(Addr: pItem): tValue;
begin
ifAddr=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.