
- •Результаты выполнения лабораторной работы по второму варианту.
- •Результаты выполнения работы по третьему варианту.
- •Результаты выполнения работы по четвертому варианту.
- •Результаты выполнения работы по пятому варианту:
- •Результаты выполнения работы по седьмому варианту.
- •III. Лабораторная работа 3. Инвертированные списки.
- •Меню для лабораторной работы 3 будет следующим:
-3- -4-
Введение
В данных методических указаниях приведены варианты лабораторных работ по дисциплине “Структуры и алгоритмы обработки данных”, а также приведены требования к выполнению этих работ, их оформлению и защите.
Программы должны быть написаны на языке СИ++ под DОS.
Лабораторные работы 1 и 2 должны быть снабжены меню, включающим следующие пункты:
Ввод информации.
Вывод информации на экран.
Поиск информации.
Добавление информации.
Удаление информации.
Сохранение информации в файле.
Считывание информации из файла.
Индивидуальное задание (только для первой лабораторной работы).
Под информацией в 1 и 2 лабораторных работах будем понимать только ключи.
Поскольку ключи обычно не изменяются, то в меню отсутствует пункт “коррекция информации”.
Поскольку ключи всегда уникальны, то в программе должна быть предусмотрена проверка на повторный ключ.
После выполнения каждого пункта меню должен быть выход на исходное меню.
Отчеты по лабораторной работе – распечатка текста программы.
Защита лабораторной работы состоит в демонстрации результатов работы программы и в беседе по распечатке текста программы.
I.Лабораторная работа 1. Связанный список.
Цель работы – изучение способов программирования с использованием динамического распределения памяти.
Варианты заданий:
А) Список может быть:
однонаправленным,
двунаправленным.
Б) Поиск информации может быть:
по ключу,
по номеру в списке.
В) Добавление нового элемента в список может быть:
в конец списка,
в начало списка,
после первого ключа в списке,
перед последним ключом в списке,
после максимального ключа,
перед максимальным ключом,
после минимального ключа,
перед минимальным ключом.
Г) Удаление информации может быть:
по значению ключа,
по номеру в списке,
удалить первый ключ в списке,
удалить второй ключ в списке,
удалить последний ключ в списке,
удалить элемент списка с максимальным ключом,
удалить элемент списка с минимальным ключом,
удалить элемент перед элементом списка с максимальным ключом,
удалить элемент после элемента списка с максимальным ключом,
удалить элемент перед элементом списка с минимальным ключом,
удалить элемент после элемента списка с минимальным ключом.
При сохранении списка в файле, сохраняются только ключи, без адресных ссылок.
При считывании информации из файла происходит вновь динамическое распределение памяти для каждого ключа.
Д) Индивидуальные задания.
Поменять местами ключи в первом и последнем элементе.
Сделать последний элемент первым.
Сделать первый элемент последним.
Сделать второй элемент первым.
Найти элемент с минимальным ключом и напечатать его номер.
Найти элемент с максимальным ключом и напечатать его номер.
Сделать первым элемент списка с заданным ключом.
Сделать первым элемент списка с максимальным ключом.
Сделать последним элемент списка с максимальным ключом.
Сделать первым элемент списка с минимальным ключом.
Сделать последним элемент списка с минимальным ключом.
Сосчитать количество элементов в списке.
Найти сумму ключей в списке.
Соединить последний элемент с первым и разорвать кольцо перед элементом с максимальным ключом.
Соединить последний элемент с первым и разорвать кольцо перед элементом с минимальным ключом.
Соединить последний элемент с первым и разорвать кольцо перед элементом с заданным ключом.
Соединить последний элемент с первым и разорвать кольцо перед элементом с первым ключом больше заданного.
Соединить последний элемент с первым и разорвать кольцо перед элементом с первым ключом меньше заданного.
Соединить последний элемент с первым и разорвать кольцо перед первым элементом с четным ключом.
Соединить последний элемент с первым и разорвать кольцо перед первым элементом с нечетным ключом.
Соединить последний элемент с первым и разорвать кольцо перед последним элементом с четным ключом.
Соединить последний элемент с первым и разорвать кольцо перед последним элементом с нечетным ключом.
Соединить последний элемент с первым и разорвать кольцо после элемента с заданным ключом.
Соединить последний элемент с первым и разорвать кольцо после элемента с максимальным ключом.
Соединить последний элемент с первым и разорвать кольцо после элемента с минимальным ключом.
II. Лабораторная работа 2. Хеш-таблица.
В этой работе используется последовательный список. Ключи в список записываются не подряд, а по адресу, который вычисляется в соответствии с функцией хеширования.
Для простоты будем использовать функцию: адрес = ключ по модулю 10. (Это не совсем правильно, так как модуль, по которому вычисляется адрес, должен быть числом простым).
Итак, ключ 10 должен располагаться в списке по адресу 0, ключ 11 – по адресу 1,… ключ 20 – по адресу 0.
Ситуация, когда для разных ключей вычислен один и тот же адрес, называется коллизией. Ключи, для которых вычислен один и тот адрес называются синонимами.
Варианты заданий:
способ разрешения коллизии – линейное опробование.
способ разрешения коллизии – срастающиеся цепочки, без цепочки свободных ячеек.
способ разрешения коллизии – срастающиеся цепочки, с цепочкой свободных ячеек.
способ разрешения коллизии – раздельные цепочки, без цепочки свободных ячеек и без области переполнения.
способ разрешения коллизии – раздельные цепочки, c цепочкой свободных ячеек и без области переполнения.
способ разрешения коллизии – раздельные цепочки, без цепочки свободных ячеек и с областью переполнения.
способ разрешения коллизии – раздельные цепочки, с цепочкой свободных ячеек и с областью переполнения.
Поясним, как должны выглядеть результаты лабораторной работы.
Результаты выполнения работы по первому варианту.
Пусть необходимо записать ключи 11, 21, 22, 23, 26, 27.
-
Адрес
Ключ
0
1
11
2
21
3
22
4
23
5
6
26
7
27
8
9
Поиск ключа начинается с вычисленного адреса. Если в ячейке находится искомый ключ, то должно быть напечатано сообщение об этом. Если ячейка пуста, то ключа в таблице нет. Иначе, если ячейка не пуста, но в ней находится другой ключ, то начинаем двигаться по таблице вниз, а дойдя до конца, двигаемся по таблице сверху до вычисленного адреса. Если встретили пустую ячейку, то ключа нет. Если вернулись к вычисленному адресу, то также ключа нет. При прохождении по таблице проверяем, не содержится ли в данной ячейке искомый ключ.
Например, при поиске ключа 22, вычислим адрес – 2, и начнем поиск в таблице, начиная с этого адреса. В ячейке 2 записан ключ 21. Двигаемся по таблице вниз и в ячейке 3 находим ключ 22.
Пусть необходимо найти ключ 32. Начинаем просмотр таблицы с адреса 2 и, дойдя до первой пустой ячейки 5, констатируем, что данного ключа в таблице нет. После удаления ключа 11:
-
Адрес
Ключ
0
1
2
21
3
22
4
23
5
6
26
7
27
8
9
Поиск ключа 21 должен привести к результату: “ключ 21 находится по адресу 2”. Однако ячейка 1 свободна. Поэтому после удаления ключа 11, ячейка 1 должна быть помечена, как удаленная. При поиске элемента она считается занятой, при вставке – свободной.
После ввода ключа 31 должны получить следующий результат:
Адрес |
Ключ |
0 |
|
1 |
31 |
2 |
21 |
3 |
22 |
4 |
23 |
5 |
|
6 |
26 |
7 |
27 |
8 |
|
9 |
|
Результаты выполнения лабораторной работы по второму варианту.
В таблице должен быть еще один столбец, в котором будем записывать адресные ссылки на следующий элемент в цепочке.
Ключи 11,21,22,23,26,27.
-
Адрес
Ключ
Адресная ссылка
0
1
11
2
2
21
3
3
22
4
4
23
-1
5
6
26
-1
7
27
-1
8
9
В одной цепочке находятся ключи 11,21, 22, 23, хотя они и не являются синонимами. Поэтому метод называется “срастающиеся цепочки”.
Поиск ключа всегда начинается с вычисленного по Хеш-функции адреса. Если по этому адресу пусто, то должны написать сообщение о том, что ключа нет. Если ключ есть, но не тот, который мы ищем, то следует пройти по цепочке до ее конца, проверяя в каждой ячейке в цепочке ключ.
Если удаляется некоторый ключ, то в цепочке ищется ключ-замена, который должен занимать место удаляемого “по праву”, т.е адрес, вычисленный для него, равен адресу, по которому располагается удаляемый ключ. Если такого ключа-замены нет, то ключ, который хотели удалить, удаляется, и переписываются адресные ссылки. Если такой ключ-замена есть, то он ставится на место удаляемого ключа и удаляется сам по приведенному выше алгоритму.
После удаления ключа 11:
-
Адрес
Ключ
Адресная ссылка
0
1
21
-1
2
22
-1
3
23
-1
4
5
6
26
-1
7
27
-1
8
9
Если хотим добавить ключ 11, но место занято, то начинаем продвигаться по таблице вниз до конца, а дойдя до конца, начинаем двигаться с начала таблицы к вычисленному адресу в поисках первой свободной ячейки. В эту ячейку и записываем новый ключ, соединив его адресной ссылкой с предыдущим ключом в цепочке, начало которой по адресу, вычисленному для нового ключа.
После добавления ключа 11:
-
Адрес
Ключ
Адресная ссылка
0
1
21
4
2
22
-1
3
23
-1
4
11
-1
5
6
26
-1
7
27
-1
8
9
После добавления ключа 3, а потом 25:
-
Адрес
Ключ
Адресная ссылка
0
1
21
4
2
22
-1
3
23
5
4
11
-1
5
3
8
6
26
-1
7
27
-1
8
25
-1
9
После удаления ключа 23, имеем третью строку пустой. Записываем в нее ключ 3 и адресную ссылку 8. После удаления ключа 3 из 5 строки в нее помещаем ключ 25, адресную ссылку –1, а строка 8 становится пустой.
Недостаток этого метода не только в том, что в цепочке находятся не обязательно синонимы, но и в том, что свободное место в таблице приходится искать перебором.