
- •Структуры данных и алгоритмы их обработки (Учебное пособие)
- •Москва 2007
- •1. Структуры данных и алгоритмы 6
- •1.2. Информация и ее представление
- •1.2.1. Природа информации
- •1.2.2. Хранение информации
- •1.2.3. Классификация структур данных
- •1.3. Операции над структурами данных
- •1.4. Порядок алгоритма
- •1.5. Структурность данных и технологии программирования
- •Контрольные вопросы
- •2. Простые структуры данных
- •2.1. Порядковые типы
- •2.2. Целочисленный тип
- •2.3. Символьный тип
- •2.4. Перечисляемый тип
- •2.5. Интервальный тип
- •2.6. Логический тип
- •2.7. Битовый тип
- •2.8. Вещественный тип
- •2.9. Указательный тип
- •Контрольные вопросы
- •3. Объектные типы данных
- •3.1. Объявление и реализация классов
- •Interface
- •Implementation
- •3.2. Директивы видимости
- •3.3. Свойства классов
- •3.4. Структурированная обработка ошибок
- •3.5. Применение объектов
- •Контрольные вопросы
- •4. Статические структуры данных
- •4.1. Векторы
- •4.2. Массивы
- •4.3. Множества
- •4.4. Записи
- •4.5. Таблицы
- •4.6. Операции над статическими структурами
- •4.6.1. Алгоритмы поиска
- •4.6.2. Алгоритмы сортировки
- •Самые медленные алгоритмы сортировки
- •Быстрые алгоритмы сортировки
- •Самые быстрые алгоритмы сортировки
- •Сортировка слиянием
- •Контрольные вопросы
- •5. Полустатические структуры данных
- •5.1. Стеки
- •5.1.1. Стеки в вычислительных системах
- •5.2. Очереди fifo
- •5.2.1. Очереди с приоритетами
- •5.2.2. Очереди в вычислительных системах
- •5.3. Деки
- •5.3.1. Деки в вычислительных системах
- •5.4. Строки
- •5.4.1. Операции над строками
- •5.4.2. Представление строк в памяти
- •3 A b d 8 p q r s t u V w
- •V w ptr nil
- •1 8 П р е д с т а в
- •2 7 ? Л е н и е ?
- •1 8 С т р о к и з
- •1 8 В е н ь я м и
- •1 8 С у п р а в л
- •1 8 Я е м о й д л
- •1 4 И н о й ? ? ? ? nil
- •6.2. Связные линейные списки
- •6.2.1. Машинное представление связных линейных списков
- •Inf next
- •Inf next
- •Inf nil
- •6.2.2. Реализация операций над связными линейными списками
- •Inf next
- •Inf next
- •Inf next
- •Inf next
- •Inf next
- •Inf next
- •Inf next
- •Inf next
- •Inf next
- •Inf next
- •Inf next
- •Inf next
- •6.2.3. Применение линейных списков
- •6.3. Нелинейные разветвленные списки
- •6.3.1. Основные понятия
- •6.3.2. Представление списковых структур в памяти
- •6.3.3. Операции обработки списков
- •6.4. Язык программирования lisp
- •6.5. Управление динамически выделяемой памятью
- •Контрольные вопросы
- •7. Нелинейные структуры данных
- •7.1. Графы и деревья
- •(B) (a) (b) (a)
- •V0 v1 v2 v5 v6 v3 v4 v7 v8 v9 v10 (v0) (v1) (v7) (v8) (v9) (v10) (v3) (v2) (v4) (v5) (v6)
- •7.3. Бинарные деревья
- •7.3.1. Представление бинарных деревьев
- •7.3.2. Прохождение бинарных деревьев
- •7.4. Алгоритмы на деревьях
- •7.4.1. Сортировка с прохождением бинарного дерева
- •7.4.2. Сортировка методом турнира с выбыванием
- •7.4.3. Применение бинарных деревьев для сжатия информации
- •7.4.4. Представление выражений с помощью деревьев
- •7.5. Представление сильноветвящихся деревьев
- •Контрольные вопросы
- •8. Методы ускорения доступа к данным
- •8.1. Хеширование данных
- •8.1.1. Функции хеширования
- •8.1.2. Оценка качества хеш-функции
- •8.1.3. Методы разрешения коллизий
- •8.1.4. Переполнение таблицы и рехеширование
- •8.2. Организация данных для поиска по вторичным ключам
- •8.2.1. Инвертированные индексы
- •8.2.2. Битовые карты
- •Контрольные вопросы
- •Листинги рабочих примеров
- •1. Создание и управление списковыми объектами
- •Interface
- •Implementation
- •Interface
- •Implementation
- •3. Моделирование работы стека
- •Interface
- •Implementation
- •Interface
- •Implementation
- •4. Создание и редактирование бинарных деревьев
- •5. Создание и редактирование сильноветвящихся деревьев
- •Задания для самостоятельной работы
- •Литература
- •144Кафедра Вычислительной Техники и Программирования Московского Государственного Открытого Университета
(3) (2) prev … …Inf next
Inf next
Inf next
Inf next
(1)
Рис. 6.9. Перестановка соседних элементов 1-связного списка.
{ Перестановка двух соседних элементов в 1-связном списке }
procedure ExchangeSll(
prev: sllptr { указатель на элемент, предшествующий переставляемой паре });
var p1, p2: sllptr); { указатели на элементы пары }
begin
p1:=prev^.next; { указатель на 1-й элемент пары }
p2:=p1^.next; { указатель на 2-й элемент пары }
p1^.next:=p2^.next; { 1-й элемент пары указывает на следующий за парой }
p2^.next:=p1; { 1-й элемент пары теперь следует за 2-ым }
prev^.next:=p2; { 2-й элемент пары теперь становится 1-ым }
end;
В процедуре перестановки для двухсвязного списка нетрудно учесть и перестановку в начале и конце списка (рис. 6.10).
(5)
(2)
(4)
(6) (3) (1) … …
PREV
INF NEXT … …
PREV
INF NEXT
PREV
INF NEXT
PREV
INF NEXT
Рис. 6.10. Перестановка соседних элементов 2-связного списка.
Копирование части списка.При копировании исходный список сохраняется в памяти, и создается новый список. Информационные поля элементов нового списка содержат те же данные, что и в элементах старого списка, но поля связок в новом списке совершенно другие, поскольку элементы нового списка расположены по другим адресам в памяти. Существенно, что операция копирования предполагает дублирование данных в памяти.
{ Копирование части 1-связного списка; head - указатель на начало копируемой
части; num - число элементов. Функция возвращает указатель на список-копию }
function CopySll(head: sllptr; num: integer): sllptr;
var cur, head2, cur2, prev2: sllptr;
begin
{ исходный список пуст - копия пуста }
if head = nil then
CopySll:=nil else
begin
cur:=head;
prev2:=nil;
{ перебор исходного списка до конца или по счетчику num }
while (num > 0) and (cur <> nil) do
begin
{ выделение памяти для элемента выходного списка и
запись в него информационной части }
New(cur2);
cur2^.inf:=cur^.inf;
{ если 1-й эл-т выходного списка - запоминается указатель на
начало, иначе - записывается указатель в предыдущий элемент }
if prev2 <> nil then
prev2^.next:=cur2 else head2:=cur2;
prev2:=cur2; { текущий элемент становится предыдущим }
cur:=cur^.next; { продвижение по исходному списку }
num:=num-1; { подсчет элементов }
end;
cur2^.next:=nil; { пустой указатель - в последний элемент выходного списка }
CopySll:=head2; { вернуть указатель на начало выходного списка }
end;
end;
Слияние двух списков.Операция слияния заключается в формировании из двух списков одного и аналогична операции сцепления строк. В случае односвязного списка слияние выполняется просто. Последний элемент первого списка содержит пустой указатель на следующий элемент, этот указатель служит признаком конца списка. Вместо пустого указателя в последний элемент первого списка заносится указатель на начало второго списка. Таким образом, второй список становится продолжением первого.
{ Слияние двух списков. head1 и head2 - указатели на начала
списков. На результирующий список указывает head1 }
procedure UniteSll(var head1, head2: sllptr);
var cur: sllptr;
begin { если 2-й список пустой - нечего делать }
if head2 <> nil then
begin
{ если 1-й список пустой, выходным списком будет 2-й }
if head1 = nil then
head1:=head2 else
{ перебор 1-го списка до последнего его элемента }
begin
cur:=head1;
while cur^.next <> nil do
cur:=cur^.next;
{ последний элемент 1-го списка указывает на начало 2-го }
cur^.next:=head2;
end;
head2:=nil; { 2-й список аннулируется }
end;
end;