Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Struktury_dannykh3.docx
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
45.9 Кб
Скачать

-3- -4-

Введение

В данных методических указаниях приведены варианты лабораторных работ по дисциплине “Структуры и алгоритмы обработки данных”, а также приведены требования к выполнению этих работ, их оформлению и защите.

Программы должны быть написаны на языке СИ++ под DОS.

Лабораторные работы 1 и 2 должны быть снабжены меню, включающим следующие пункты:

  1. Ввод информации.

  2. Вывод информации на экран.

  3. Поиск информации.

  4. Добавление информации.

  5. Удаление информации.

  6. Сохранение информации в файле.

  7. Считывание информации из файла.

  8. Индивидуальное задание (только для первой лабораторной работы).

Под информацией в 1 и 2 лабораторных работах будем понимать только ключи.

Поскольку ключи обычно не изменяются, то в меню отсутствует пункт “коррекция информации”.

Поскольку ключи всегда уникальны, то в программе должна быть предусмотрена проверка на повторный ключ.

После выполнения каждого пункта меню должен быть выход на исходное меню.

Отчеты по лабораторной работе – распечатка текста программы.

Защита лабораторной работы состоит в демонстрации результатов работы программы и в беседе по распечатке текста программы.

I.Лабораторная работа 1. Связанный список.

Цель работы – изучение способов программирования с использованием динамического распределения памяти.

Варианты заданий:

А) Список может быть:

  1. однонаправленным,

  2. двунаправленным.

Б) Поиск информации может быть:

  1. по ключу,

  2. по номеру в списке.

В) Добавление нового элемента в список может быть:

  1. в конец списка,

  2. в начало списка,

  3. после первого ключа в списке,

  4. перед последним ключом в списке,

  5. после максимального ключа,

  6. перед максимальным ключом,

  7. после минимального ключа,

  8. перед минимальным ключом.

Г) Удаление информации может быть:

  1. по значению ключа,

  2. по номеру в списке,

  3. удалить первый ключ в списке,

  4. удалить второй ключ в списке,

  5. удалить последний ключ в списке,

  6. удалить элемент списка с максимальным ключом,

  7. удалить элемент списка с минимальным ключом,

  8. удалить элемент перед элементом списка с максимальным ключом,

  9. удалить элемент после элемента списка с максимальным ключом,

  10. удалить элемент перед элементом списка с минимальным ключом,

  11. удалить элемент после элемента списка с минимальным ключом.

При сохранении списка в файле, сохраняются только ключи, без адресных ссылок.

При считывании информации из файла происходит вновь динамическое распределение памяти для каждого ключа.

Д) Индивидуальные задания.

  1. Поменять местами ключи в первом и последнем элементе.

  2. Сделать последний элемент первым.

  3. Сделать первый элемент последним.

  4. Сделать второй элемент первым.

  5. Найти элемент с минимальным ключом и напечатать его номер.

  6. Найти элемент с максимальным ключом и напечатать его номер.

  7. Сделать первым элемент списка с заданным ключом.

  8. Сделать первым элемент списка с максимальным ключом.

  9. Сделать последним элемент списка с максимальным ключом.

  10. Сделать первым элемент списка с минимальным ключом.

  11. Сделать последним элемент списка с минимальным ключом.

  12. Сосчитать количество элементов в списке.

  13. Найти сумму ключей в списке.

  14. Соединить последний элемент с первым и разорвать кольцо перед элементом с максимальным ключом.

  15. Соединить последний элемент с первым и разорвать кольцо перед элементом с минимальным ключом.

  16. Соединить последний элемент с первым и разорвать кольцо перед элементом с заданным ключом.

  17. Соединить последний элемент с первым и разорвать кольцо перед элементом с первым ключом больше заданного.

  18. Соединить последний элемент с первым и разорвать кольцо перед элементом с первым ключом меньше заданного.

  19. Соединить последний элемент с первым и разорвать кольцо перед первым элементом с четным ключом.

  20. Соединить последний элемент с первым и разорвать кольцо перед первым элементом с нечетным ключом.

  21. Соединить последний элемент с первым и разорвать кольцо перед последним элементом с четным ключом.

  22. Соединить последний элемент с первым и разорвать кольцо перед последним элементом с нечетным ключом.

  23. Соединить последний элемент с первым и разорвать кольцо после элемента с заданным ключом.

  24. Соединить последний элемент с первым и разорвать кольцо после элемента с максимальным ключом.

  25. Соединить последний элемент с первым и разорвать кольцо после элемента с минимальным ключом.

II. Лабораторная работа 2. Хеш-таблица.

В этой работе используется последовательный список. Ключи в список записываются не подряд, а по адресу, который вычисляется в соответствии с функцией хеширования.

Для простоты будем использовать функцию: адрес = ключ по модулю 10. (Это не совсем правильно, так как модуль, по которому вычисляется адрес, должен быть числом простым).

Итак, ключ 10 должен располагаться в списке по адресу 0, ключ 11 – по адресу 1,… ключ 20 – по адресу 0.

Ситуация, когда для разных ключей вычислен один и тот же адрес, называется коллизией. Ключи, для которых вычислен один и тот адрес называются синонимами.

Варианты заданий:

  1. способ разрешения коллизии – линейное опробование.

  2. способ разрешения коллизии – срастающиеся цепочки, без цепочки свободных ячеек.

  3. способ разрешения коллизии – срастающиеся цепочки, с цепочкой свободных ячеек.

  4. способ разрешения коллизии – раздельные цепочки, без цепочки свободных ячеек и без области переполнения.

  5. способ разрешения коллизии – раздельные цепочки, c цепочкой свободных ячеек и без области переполнения.

  6. способ разрешения коллизии – раздельные цепочки, без цепочки свободных ячеек и с областью переполнения.

  7. способ разрешения коллизии – раздельные цепочки, с цепочкой свободных ячеек и с областью переполнения.

Поясним, как должны выглядеть результаты лабораторной работы.

Результаты выполнения работы по первому варианту.

Пусть необходимо записать ключи 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 становится пустой.

Недостаток этого метода не только в том, что в цепочке находятся не обязательно синонимы, но и в том, что свободное место в таблице приходится искать перебором.

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