- •Общие положения
- •I. Постановка задачи (внешние спецификации)
- •II Проектирование задачи
- •III Кодирование
- •Iy Демонстрация и защита работы
- •Y Выводы
- •Лабораторная работа №1 “Решение типовой задачи”
- •Лабораторная работа №2 ”Решение задач, заданных графически»”
- •Лабораторная работа №3
- •Лабораторная работа № 4 ”Сортировка массивов”
- •Лабораторная работа №5 ”Организация рекурсивных вычислений”
- •Лабораторная работа № 6 ”Создание и ведение баз данных”
- •Лабораторная работа №7 Абстрактные типы данных (атд): список, стек, очередь. Реализация атд на базе линейного однонаправленного списка.
Лабораторная работа №7 Абстрактные типы данных (атд): список, стек, очередь. Реализация атд на базе линейного однонаправленного списка.
Цель работы
Целью работы является получение навыков организации данных и их обработки в динамической памяти.
Требования к разрабатываемой программе:
Все операции для работы со списком, очередью и стеком должны быть реализованы в отдельно скомпилированных модулях (одноименное_название.tpu).
Для удобства работы в программе должно быть реализовано меню с выпадающим подменю. В меню пользователю должен предоставляться выбор структуры данных, в подменю – выбор операций для работы с выбранной структурой данных.
В качестве базовой динамической структуры должен рассматриваться линейный однонаправленный список.
Требования к функциональному составу - выполнение программы должно демонстрировать выполнение операций, приведенных в таблице 3.
Таблица 3
Структура данных |
Операции |
Линейный однонаправленный список |
|
Очередь на базе линейного однонаправленного списка |
|
Стек на базе линейного однонаправленного списка |
Основные операции, которые должны быть реализованы в программе:
|
Требования к отчету: Внешние спецификации (этап постановки задачи) разрабатываются для программы в целом. Внутренние спецификации программы (этап проектирования) разрабатываются для каждого модуля отдельно и для программы в целом.
Не забывайте освобождать память. Первым оператором подпрограммы, организующей работу программы вцелом, должен быть вызов процедуры Mark(p), а Release(p) – последним, где р - переменная типа Pointer. Проследить правильность выделения и высвобождения памяти можно, используя стандартные функции MaxAvail, MemAvail.
Набор тестовых заданий приведен в таблице 4.
Таблица 4
№ теста |
Операция для работы со списком |
Значения входных данных |
Просмотр содержимого списка после выполнения операции |
|||||||||||||||
|
Создать упорядоченный список, вводя элементы со значением |
9 |
|
|||||||||||||||
|
5 |
|||||||||||||||||
|
1 |
|||||||||||||||||
|
Добавить в начало списка элемент со значением |
-1 |
|
|||||||||||||||
|
Добавить в конец списка элемент со значением |
13 |
|
|||||||||||||||
|
Добавить элемент со значением х до элемента списка со значением info |
x |
info |
|
||||||||||||||
|
-3 |
-1 |
||||||||||||||||
|
0 |
1 |
||||||||||||||||
|
3 |
5 |
||||||||||||||||
|
7 |
9 |
||||||||||||||||
|
11 |
13 |
||||||||||||||||
|
Добавить элемент со значением х после элемента списка со значением info |
x |
info |
|
||||||||||||||
|
-2 |
-3 |
||||||||||||||||
|
2 |
1 |
||||||||||||||||
|
4 |
3 |
||||||||||||||||
|
14 |
13 |
||||||||||||||||
|
Найти элемент в списке со значением |
-3 |
Элемент найден |
|||||||||||||||
|
14 |
|||||||||||||||||
|
0 |
|||||||||||||||||
|
24 |
Такого элемента в списке нет |
||||||||||||||||
|
Удалить элемент списка со значением |
-3 |
|
|||||||||||||||
|
13 |
-2 -1 0 1 2 3 4 5 7 9 11 14 |
||||||||||||||||
|
Удалить голову списка |
|
-1 0 1 2 3 4 5 7 9 11 14 |
|||||||||||||||
|
Удалить последний элемент списка |
|
-1 0 1 2 3 4 5 7 9 11 |
|||||||||||||||
|
Удалить голову списка |
|
0 1 2 3 4 5 7 9 11 |
|||||||||||||||
|
Удалить последний элемент списка |
|
0 1 2 3 4 5 7 9 |
|||||||||||||||
|
|
0 1 2 3 4 5 7 |
||||||||||||||||
|
|
0 1 2 3 4 5 |
||||||||||||||||
|
|
0 1 2 3 4 |
||||||||||||||||
|
|
0 1 2 3 |
||||||||||||||||
|
|
0 1 2 |
||||||||||||||||
|
|
0 1 |
||||||||||||||||
|
|
0 |
||||||||||||||||
|
|
Операция невыполнима. Список пуст |
Варианты индивидуального задания
1 |
1. Написать процедуру(ы), необходимые для реализации операции объединения двух упорядоченных линейных списков в один список, чтобы упорядоченность не нарушалась. 2. Написать процедуру(ы), которая подсчитывает количество элементов стека, у которых равные «соседи» (следующий и предыдущий элементы). 3. Составить процедуру(ы), которая из одной очереди Queue строит две новых: Queue1 из положительных элементов и Queue2 – из остальных элементов очереди (тип элементов очереди – real). |
2 |
1. Написать процедуру(ы), которая находит среднее арифметическое всех элементов непустого списка L (тип элементов - real). 2. Написать процедуру(ы), которая находит минимальный элемент в стеке. 3. Написать процедуру(ы), которая формирует очередь Queue, включив в нее по одному разу элементы, которые входят в одну из очередей Queue1 и Queue2. |
3 |
1. Написать процедуру(ы), которая удаляет из списка все отрицательные элементы. 2. Написать процедуру(ы), необходимую для того, чтобы сделать копию стека St1. Результат – стек St2. 3. Написать процедуру(ы), которая определяет, есть ли в очереди хотя бы один элемент, который равен следующему за ним элементу. |
4 |
1. Написать процедуру(ы), которая удваивает каждое вхождение элемента Е в списке. 2. Написать процедуру(ы), которая определяет, есть ли в стеке хотя бы один элемент, который равен следующему за ним элементу. 3. Написать процедуру(ы), необходимые для определения среднего арифметического элементов очереди Queue (тип элементов - real) между первым и последним вхождением элемента Е, если элемент Е входит в очередь не менее двух раз. |
5 |
1. Написать процедуру(ы) проверки равенства двух линейных односвязных списков. 2. Написать процедуру(ы), которая формирует стек St, включив в него по одному разу элементы, которые входят хотя бы в один из стеков St1 или St2. 3. Написать процедуру(ы), которая находит в очереди минимальный элемент |
6 |
1. Написать процедуру(ы), необходимые для того, чтобы переставить в обратном порядке все элементы в списке между первым и последним вхождением элемента Е, если элемент Е входит в список не менее двух раз. 2. Написать процедуру(ы), которая определяет, есть ли в стеке St1 элементы, которые не входят в стек St2. 3. Написать процедуру(ы), которая в очереди, содержащей не менее двух элементов, определяет количество элементов, у которых одинаковые «соседи» (следующий и предыдущий элементы) |
7 |
1. Написать процедуру(ы), необходимые для реализации операции добавления в линейный односвязный список новый элемент L за каждым вхождением элемента Е, если такой элемент есть в списке. 2. Написать процедуру(ы), которая находит максимальный элемент в стеке. 3. Написать процедуру(ы), которая формирует очередь Queue, включив в него по одному разу элементы, которые входят хотя бы в одну из очередей Queue1 или Queue2. |
8 |
1. Написать процедуру(ы), которая в конец непустого списка L добавляет все его элементы, располагая их в обратном порядке (например, по списку из элементов 1, 2, 3 требуется построить список из элементов 1, 2, 3, 3, 2, 1); 2. Написать процедуру(ы), которая находит минимальный элемент в стеке. 3. Написать процедуру(ы), которая проверяет, есть ли в очереди Queue1 элементы, которые входят в очередь Queue2. |
9 |
1.Написать процедуру(ы), необходимые для реализации операции разбиения одного линейного односвязного списка List на два списка:
2. Написать процедуру(ы), которая подсчитывает количество элементов стека, у которых равные «соседи» (следующий и предыдущий элементы). 3.Написать процедуру(ы), которая определяет, есть ли в очереди Queue хотя бы один элемент, который равен следующему за ним элементу. |
10 |
01. Написать процедуру(ы), которая определяет, есть ли в списке хотя бы один элемент, который равен следующему за ним элементу. 2. Написать процедуру(ы) для определения среднего арифметического элементов стека (тип элементов - real), находящихся между первым и последним вхождением элемента Е (если элемент Е входит в очередь не менее двух раз). 3. Написать процедуру(ы), которая проверяет равенство двух очередей Queue1 и Queue2. |
11 |
11. Написать процедуру(ы), необходимые для того, чтобы переставить в обратном порядке все элементы в списке между первым и последним вхождением элемента Е, если элемент Е входит в список не менее двух раз. 2. Написать процедуру(ы), необходимые для реализации операции разбиения одного стека St на два:
3. Написать процедуру(ы), которая находит минимальный элемент в очереди. |
12 |
1. Написать процедуру(ы), которая находит максимальный элемент в списке. 2. Написать процедуру(ы), необходимые для реализации операции объединения двух стеков в один. 3. Написать процедуру(ы), которая проверяет, есть ли в очередях Queue1 и Queue2 одинаковые элементы. |
13 |
1. Написать процедуру(ы), которая проверяет, есть ли в списке L хотя бы два одинаковых элемента. 2. Написать процедуру(ы), которая переносит в конец (на вершину) непустого стека его первый элемент. 3. Написать процедуру(ы), необходимые для реализации операции объединения двух упорядоченных очередей в одну очередь, чтобы упорядоченность не нарушалась. |
14 |
1. Написать процедуру(ы), которая переворачивает список L, т.е. изменяет ссылки в этом списке так, чтобы его элементы оказались расположенными в обратном порядке; 2. Написать процедуру(ы), которая подсчитывает число вхождений элемента Е в стек St. 3. Написать процедуру(ы), которая находит среднее арифметическое всех элементов очереди (тип элементов - real). |
15 |
1. Написать процедуру(ы), которая в списке L из каждой группы подряд идущих равных элементов оставляет только один. 2. Написать процедуру(ы), которая находит среднее арифметическое всех элементов непустого стека St (тип элементов - real). 3. Написать процедуру(ы), которая подсчитывает число вхождений элемента Е в очередь Queue. |
16 |
1. Написать процедуру(ы), которая выводит в обратном порядке элементы непустого списка L; 2. Написать процедуру(ы), необходимые для реализации операции объединения двух стеков в один. 3. Написать процедуру(ы), которая находит в очереди, содержащей не менее двух элементов, все элементы, у которых одинаковые «соседи» (следующий и предыдущий элементы). |
17 |
1. Написать процедуру(ы), необходимые для того, чтобы переставить в обратном порядке все элементы в списке между первым и последним вхождением элемента Е, если элемент Е входит в список не менее двух раз. 2. Написать процедуру(ы), необходимые для реализации операции разбиения одного стека St на два:
3. Написать процедуру(ы), которая в очереди, содержащей не менее двух элементов, находит все элементы, у которых нет одинаковых «соседей» (следующий и предыдущий элементы). |
18 |
1. Написать процедуру(ы), необходимые для того, чтобы переставить в обратном порядке все элементы в списке между первым и последним вхождением элемента Е, если элемент Е входит в список не менее двух раз. 2. Написать процедуру(ы), которая определяет, есть ли в стеке St1 элементы, которые не входят в стек St2. 3. Написать процедуру(ы), которая находит минимальный элемент в очереди. |
19 |
1. Написать процедуру(ы), которая переворачивает список L, т.е. изменяет ссылки в этом списке так, чтобы его элементы оказались расположенными в обратном порядке; 2. Написать процедуру(ы), которая подсчитывает число вхождений элемента Е в стек St. 3. Написать процедуру(ы), которая находит среднее арифметическое всех элементов очереди (тип элементов - real). |