- •Оглавление
- •Введение
- •Лабораторная работа №1. Реализация алгоритмов сортировки и поиска Задачи работы
- •Задание на лабораторную работу
- •Сортировка Шелла
- •Сортировка шейкером
- •Сортировка расческой (Comb sort)
- •Плавная сортировка (Smooth sort)
- •Метод Patience sorting
- •Лабораторная работа №2. Понятие контейнера данных. Основные типы контейнеров Задачи работы
- •Задание на лабораторную работу
- •Требования к отчетности по лабораторной работе
- •Предлагаемые этапы выполнения работы
- •Теоретический материал, необходимый для выполнения лабораторной работы Основные типы контейнеров Списки
- •Бинарные деревья поиска
- •Добавление элемента
- •Удаление элемента
- •Понятие сбалансированности дерева
- •Словари
- •Очереди с приоритетами
- •Очереди
- •Лабораторная работа №3. Использование стандартных контейнеров данных Задачи работы
- •Задание на лабораторную работу
- •Лабораторная работа №4. Использование стандартных реализаций алгоритмов stl Задачи работы
- •Задание на лабораторную работу
- •Кафедра компьютерной фотоники
Лабораторная работа №2. Понятие контейнера данных. Основные типы контейнеров Задачи работы
Задачами данной лабораторной работы являются:
Закрепление полученных знаний о контейнерах.
Развитие навыков программирования на языке C++.
Развитие навыков программной реализации концепций алгоритмов и программных объектов.
Задание на лабораторную работу
Разработать класс контейнера и демонстрационную программу, иллюстрирующую его использование:
Реализовать класс списка с операциями добавления элемента, удаления элемента, доступа к первому элементу, доступа к следующему за данным [5, разд. 10.2].
Реализовать класс бинарного дерева с операциями поиска, добавления и удаления элемента [5, гл. 12].
Реализовать класс ассоциативного массива. [5, гл. 12]
Разработать класс АВЛ-дерева [5, гл.13] (задача 13-3).
Разработать класс красно-черного дерева [5, гл. 13].
Реализовать класс массива элементов, значение которых может быть 0 или 1, с выделением 1 бита на каждый элемент (т.е. если мы храним 32 элемента – внутри должна лежать одна переменная типа int).
Реализовать класс стека [5, разд. 10.1].
Реализовать класс очереди [5, разд. 10.1].
Реализовать класс очереди с приоритетами на базе пирамиды [5, разд. 6.5].
Достаточна разработка консольного приложения. Разработка Windows-приложения будет большим преимуществом выполнения работы, если студент достаточно подготовлен для создания Windows-приложений, иллюстрирующих работу системы.
Требования к отчетности по лабораторной работе
В качестве отчета по лабораторной работе студент предоставляет в электронном виде программу на C++, содержащую реализацию класса и пример его использования.
Предлагаемые этапы выполнения работы
Изучение рассматриваемого контейнера.
Проектирование класса контейнера – определение его public методов.
Реализация демонстрационной программы, иллюстрирующей работу класса. Предпочтительно выполнять ее до реализации самого класса, чтобы использовать ее для тестирования возможностей класса и убедиться в удобстве интерфейса класса до его реализации.
Реализация класса-контейнера.
Отладка программы.
Теоретический материал, необходимый для выполнения лабораторной работы Основные типы контейнеров Списки
Для того, чтобы устранить проблемы работы с массивами (долгая вставка элемента в середину, потребность в большом непрерывном блоке памяти), необходимо снять требование непрерывного размещения данных в памяти. Для этого элементы контейнера должны хранить информацию о расположении других элементов. Простейший пример такого контейнера – список [5, разд. 10.2].
Список может быть однонаправленным (в этом случае хранится адрес первого элемента, а каждый элемент помнит адрес следующего) и двунаправленным (хранятся адреса первого и последнего элементов, каждый элемент помнит адрес следующего и предыдущего).
Преимуществом списка является быстрая вставка элемента и быстрое его удаление. Действительно, и вставка, и удаление могут быть выполнены за время O(1). Эти операции затрагивают только добавляемый/удаляемый элемент и его непосредственных соседей, которым нужно обновить свои указатели на предыдущий/следующий элемент. Код на C++ для добавления элемента может иметь вид:
class TListItem
{
TListItem* Next;
Type Value;
};
void Include( TListItem* ptr_before , T val )
{
TListItem* ptr_new = new TListItem;
ptr_new->val = val;
ptr_new->next = ptr_before->next;
ptr_before->next = ptr_new;
}
В функции Include мы получаем указатель на элемент списка, после которого должен быть добавлен новый элемент, и значение, которое должно храниться в новом элементе. Мы создаем этот новый элемент с помощью new и сохраняем в нем требуемое значение. Следующим за ним элементом будет тот, который раньше был следующим за элементом ptr_before. Следующим за элементом, на который указывает ptr_before, будет новый элемент.
Работа функции Include иллюстрируется на рис. 5.
Рис. 5. Добавление элемента в список.
Аналогично может быть реализовано и удаление.
void Delete( TListItem* ptr_before )
{
TListItem* ptr_for_delete = ptr_before->next;
ptr_before->next = ptr_for_delete->next;
delete ptr_for_delete;
}
В функцию Delete передается указатель на элемент, следующий за которым необходимо удалить. Прежде всего мы определяем подлежащий удалению элемент (ptr_for_delete). Следующим за ptr_before теперь будет тот элемент, который следовал за ptr_for_delete. После того, как элемент таким образом исключен из списка, остается только освободить память.
Работа функции Delete иллюстрируется на рис. 6.
Рис. 6. Удаление элемента из списка