- •Федеральное агентство по образованию
- •Тема 3. Бинарные деревья 41
- •Тема 4. Графы 66
- •Введение
- •Терминология
- •Классификация структур данных по различным признакам
- •Типовые операции над структурами данных
- •Эффективность алгоритмов. 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;
functionDelete(Addr:pItem):tValue;// исключение элемента с адресом Addr
// Поиск в списке элемента со значением v и возвращение его адреса
function Search(v: tValue): pItem;
// Включение элемента со значением v в начало списка
procedureInsertHead(v:tValue);
// Включение элемента со значением v в конец списка
procedure InsertRear(v: tValue);
function DeleteHead: tValue; // исключение элемента из начала списка
functionDeleteRear:tValue; // исключение элемента из конца списка
functionEmpty:Boolean; // возвращение true, если список пуст
procedureClear; // очистка списка
constructorCreate; // конструктор - создание пустого списка
destructor Destroy; override; // деструктор - удаление списка
end; // class tList
