Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Labs-Programming.doc
Скачиваний:
23
Добавлен:
06.09.2019
Размер:
574.98 Кб
Скачать

Лабораторная работа №2. Понятие контейнера данных. Основные типы контейнеров Задачи работы

Задачами данной лабораторной работы являются:

  1. Закрепление полученных знаний о контейнерах.

  2. Развитие навыков программирования на языке C++.

  3. Развитие навыков программной реализации концепций алгоритмов и программных объектов.

Задание на лабораторную работу

Разработать класс контейнера и демонстрационную программу, иллюстрирующую его использование:

  1. Реализовать класс списка с операциями добавления элемента, удаления элемента, доступа к первому элементу, доступа к следующему за данным [5, разд. 10.2].

  2. Реализовать класс бинарного дерева с операциями поиска, добавления и удаления элемента [5, гл. 12].

  3. Реализовать класс ассоциативного массива. [5, гл. 12]

  4. Разработать класс АВЛ-дерева [5, гл.13] (задача 13-3).

  5. Разработать класс красно-черного дерева [5, гл. 13].

  6. Реализовать класс массива элементов, значение которых может быть 0 или 1, с выделением 1 бита на каждый элемент (т.е. если мы храним 32 элемента – внутри должна лежать одна переменная типа int).

  7. Реализовать класс стека [5, разд. 10.1].

  8. Реализовать класс очереди [5, разд. 10.1].

  9. Реализовать класс очереди с приоритетами на базе пирамиды [5, разд. 6.5].

Достаточна разработка консольного приложения. Разработка Windows-приложения будет большим преимуществом выполнения работы, если студент достаточно подготовлен для создания Windows-приложений, иллюстрирующих работу системы.

Требования к отчетности по лабораторной работе

В качестве отчета по лабораторной работе студент предоставляет в электронном виде программу на C++, содержащую реализацию класса и пример его использования.

Предлагаемые этапы выполнения работы

  1. Изучение рассматриваемого контейнера.

  2. Проектирование класса контейнера – определение его public методов.

  3. Реализация демонстрационной программы, иллюстрирующей работу класса. Предпочтительно выполнять ее до реализации самого класса, чтобы использовать ее для тестирования возможностей класса и убедиться в удобстве интерфейса класса до его реализации.

  4. Реализация класса-контейнера.

  5. Отладка программы.

Теоретический материал, необходимый для выполнения лабораторной работы Основные типы контейнеров Списки

Для того, чтобы устранить проблемы работы с массивами (долгая вставка элемента в середину, потребность в большом непрерывном блоке памяти), необходимо снять требование непрерывного размещения данных в памяти. Для этого элементы контейнера должны хранить информацию о расположении других элементов. Простейший пример такого контейнера – список [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. Удаление элемента из списка

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]