Динамические структуры данных: однонаправленные и двунаправленные списки
Лабораторная работа 29. Динамические структуры данных: однонаправленные и двунаправленные списки
Цель работы: изучить понятия, классификацию и объявления списков, особенности доступа к данным и работу с памятью при использовании однонаправленных и двунаправленных списков, научиться решать задачи с использованием списков на языке C++.
При выполнении лабораторной работы для каждого задания требуется написать программу на языке С++, в которой выполнено формирование однонаправленного или двунаправленного списка в соответствии с постановкой задачи, ввод данных элементов списка с учетом типа информационного поля, их обработка и вывод на экран в указанном формате. Для хранения данных списков следует использовать ресурсы динамической памяти. Ввод данных осуществляется с клавиатуры с учетом требований к входным данным, содержащихся в постановке задачи. Ограничениями на входные данные являются максимальный размер строковых данных, диапазоны числовых типов полей структуры и допустимый размер области динамической памяти в языке С++.
Теоретические сведения.
Ознакомьтесь с материалом лекции 29.
Задания к лабораторной работе.
Выполните приведенные ниже задания.
- Сформируйте однонаправленный список с вещественным информационным полем. Добавьте в список заданный элемент после первого элемента с аналогичным информационным полем. Выполните печать списка до и после изменений. Найти среднее арифметическое элементов списка.
- Сформируйте однонаправленный список с информационным полем типа char*. Добавьте в этот список элементы с нечетными номерами. Решите задачу, выполняя следующие требования:
- Сформировать однонаправленный список, тип информационного поля указан в варианте.
- Распечатать полученный список.
- Выполнить обработку списка в соответствии с заданием.
- Распечатать полученный список.
- Удалить список из памяти.
- Для решения задачи сформируйте двунаправленный список с символьным информационным полем. Дана последовательность латинских букв, оканчивающаяся точкой. Среди букв есть специальный символ Ch, появление которого означает отмену предыдущего символа. Учитывая вхождение этого символа, преобразуйте последовательность.
- Для решения задачи сформируйте двунаправленный список. Даны действительные числа a1, a2, ..., a2n (n>= 2, заранее неизвестно и вводится с клавиатуры). Вычислите: max(min(a1, a2n), min(a3, a2n-2), ... , min (a2n-1, a2)).
Указания к выполнению работы.
Каждое задание необходимо решить в соответствии с изученными методами формирования, вывода и обработки данных однонаправленных или двунаправленных списков в языке С++. Обработку списков следует выполнить на основе базовых алгоритмов: поиск по списку, вставка элемента в список, удаление элемента из списка, удаление всего списка. При объявлении списков выполните комментирование используемых полей. Программу для решения каждого задания необходимо разработать методом процедурной абстракции, оформив комментарии к коду.
Следует реализовать каждое задание в соответствии с приведенными этапами:
- изучить словесную постановку задачи, выделив при этом все виды данных;
- сформулировать математическую постановку задачи;
- выбрать метод решения задачи, если это необходимо;
- разработать графическую схему алгоритма;
- записать разработанный алгоритм на языке С++;
- разработать контрольный тест к программе;
- отладить программу;
- представить отчет по работе.
Требования к отчету.
Отчет по лабораторной работе должен соответствовать следующей структуре.
- Титульный лист.
- Словесная постановка задачи. В этом подразделе проводится полное описание задачи. Описывается суть задачи, анализ входящих в нее физических величин, область их допустимых значений, единицы их измерения, возможные ограничения, анализ условий при которых задача имеет решение (не имеет решения), анализ ожидаемых результатов.
- Математическая модель. В этом подразделе вводятся математические описания физических величин и математическое описание их взаимодействий. Цель подраздела – представить решаемую задачу в математической формулировке.
- Алгоритм решения задачи. В подразделе описывается разработка структуры алгоритма, обосновывается абстракция данных, задача разбивается на подзадачи. Схема алгоритма выполняется по ЕСПД (ГОСТ 19.003-80 и ГОСТ 19.002-80).
- Листинг программы. Подраздел должен содержать текст программы на языке программирования С++, реализованный в среде MS Visual Studio 2010.
- Контрольный тест. Подраздел содержит наборы исходных данных и полученные в ходе выполнения программы результаты.
- Выводы по лабораторной работе.
- Ответы на контрольные вопросы.
Контрольные вопросы
- Любой ли список является связным? Обоснуйте ответ.
- В чем отличие первого элемента однонаправленного (двунаправленного) списка от остальных элементов этого же списка?
- В чем отличие последнего элемента однонаправленного (двунаправленного) списка от остальных элементов этого же списка?
- Почему при работе с однонаправленным списком необходимо позиционирование на первый элемент списка?
- Почему при работе с двунаправленным списком не обязательно позиционирование на первый элемент списка?
- В чем принципиальные отличия выполнения добавления (удаления) элемента на первую и любую другую позиции в однонаправленном списке?
- В чем принципиальные отличия выполнения основных операций в однонаправленных и двунаправленных списках?
- С какой целью в программах выполняется проверка на пустоту однонаправленного (двунаправленного) списка?
- С какой целью в программах выполняется удаление однонаправленного (двунаправленного) списка по окончании работы с ним? Как изменится работа программы, если операцию удаления списка не выполнять?