
- •Тема 1. Стеки, очереди, деки 7
- •Тема 2. Односвязные и двусвязные линейные списки 21
- •Тема 3. Бинарные деревья 40
- •Тема 4. Графы 65
- •Введение
- •Терминология
- •Классификация структур данных по различным признакам
- •Типовые операции над структурами данных
- •Эффективность алгоритмов. O-обозначения
- •Тема 1. Стеки, очереди, деки
- •Операции над стеком
- •Реализация стека
- •Реализация основных операций над стеком
- •Использование стека для преобразования форм записи выражений.
- •Очередь
- •Операции над очередью
- •Операции над деком
- •Реализация очереди и дека
- •Реализация основных операций над очередью и деком
- •Итератор
- •Лабораторная работа 1. Стеки, очереди, деки
- •Тема 2. Односвязные и двусвязные линейные списки
- •Линейный список
- •Операции над линейным списком
- •Реализация линейного списка в виде односвязной динамической структуры
- •Реализация основных операций над односвязным списком
- •Циклический список
- •Операции над циклическим списком
- •Односвязная реализация циклического списка
- •Реализация основных операций над односвязным циклическим списком
- •Реализация линейного списка в виде двусвязной динамической структуры
- •Реализация основных операций над двусвязным списком
- •Циклический двусвязный список
- •Реализация основных операций над двусвязным циклическим списком
- •Лабораторная работа 2. Односвязные и двусвязные линейные списки
- •Тема 3. Бинарные деревья
- •Основные понятия и определения
- •Построение бинарного дерева
- •Операции над бинарным деревом
- •Реализация бинарного дерева
- •Реализация основных операций над бинарным деревом
- •Дерево выражения
- •Дерево поиска
- •Операции над деревом поиска
- •Реализация дерева поиска
- •Реализация операций над деревом поиска
- •Сбалансированные деревья
- •Включение в сбалансированное дерево
- •Лабораторная работа 3. Бинарные деревья
- •Тема 4. Графы
- •Основные понятия и определения
- •Граф g7
- •Операции над графом
- •Реализация графа
- •Реализация основных операций над ориентированным графом
- •Обход ориентированного графа
- •Вычисление расстояния между узлами ориентированного графа
- •Лабораторная работа 4. Ориентированные графы
- •Библиографический список
Тема 2. Односвязные и двусвязные линейные списки
-
Линейный список
Линейный список представляет собой упорядоченный набор элементов, в котором включение новых элементов и исключение существующих могут выполняться в любом месте списка. Каждый элемент списка характеризуется одним и тем же набором полей. Логическая структура линейного списка
A |
D |
F |
B |
C |
|
|
|
|
|
Начало
Число элементов списка не ограничено. Список, в котором нет ни одного элемента, называется пустым. Стеки, очереди и деки, рассмотренные в теме 1, являются частными случаями линейного списка, поскольку имеют ограниченную дисциплину обслуживания.
Списковые структуры находят широкое применение при решении следующих задач: топологическая сортировка, например в задачах сетевого планирования, арифметические действия с многочленами, операции с длинными числами, построение таблиц имен в трансляторах, моделирование ситуаций реального мира и т.д.
-
Операции над линейным списком
Над линейным списком l могут быть выполнены все операции, определенные для стека, очереди и дека (тема 1), а также следующие операции:
1) включение элемента со значением v в список после элемента с заданным адресом p – InsertAfter(l,p,v);
2) включение элемента со значением v в список l перед элементом с заданным адресом p – InsertBefore(l,p,v);
3) исключение из списка l элемента с адресом p – Delete(l,p);
4) исключение из списка l элемента, следующего за элементом с адресом p – DeleteAfter(l,p);
5) поиск в списке l элемента с заданным значением v – Search(l,v) и возвращение его адреса.
-
Реализация линейного списка в виде односвязной динамической структуры
Список, реализованный предложенным способом, называется односвязным линейным списком, т.к. каждый элемент этого списка содержит ссылку только на один соседний элемент. Описание класса tList:
type
tValue= Real; // тип значения элемента списка - вещественный
pItem= ^tItem; // тип указателя на элемент списка
tItem= record // тип элемента списка
Value: tValue; // содержательная часть элемента списка
Next : pItem; // указатель на следующий элемент списка
end; // record tItem
tList = class // класс - список
protected
fHead: pItem; // поле - указатель на начало списка
fSize: Word; // поле - число элементов списка
public
// свойство – указатель на начало списка (доступ по чтению)
property Head: pItem read fHead;
// свойство - число элементов списка (доступ по чтению)
property Size: Word read fSize;
// Включение элемента со значением v после элемента с адресом Addr
procedure InsertAfter(Addr: pItem; v: tValue);
// Включение элемента со значением v перед элементом с адресом Addr
procedure InsertBefore(Addr: pItem; v: tValue);
// Исключение из списка элемента после элемента с адресом Addr
function DeleteAfter(Addr: pItem): tValue;
function Delete(Addr: pItem): tValue; // исключение элемента с адресом Addr
// Поиск в списке элемента со значением v и возвращение его адреса
function Search(v: tValue): pItem;
// Включение элемента со значением v в начало списка
procedure InsertHead(v: tValue);
// Включение элемента со значением v в конец списка
procedure InsertRear(v: tValue);
function DeleteHead: tValue; // исключение элемента из начала списка
function DeleteRear: tValue; // исключение элемента из конца списка
function Empty: Boolean; // возвращение true, если список пуст
procedure Clear; // очистка списка
constructor Create; // конструктор - создание пустого списка
destructor Destroy; override; // деструктор - удаление списка
end; // class tList