Работа №3

Вариант 1: Работа с циклическим списком

Необходимо написать программу, которая реализует хранение и простейший набор функций для обработки данных о некоторых объектах нашего бренного мира, выбираемых по вариантам (будут приведены ниже).

Каждый элемент должен представлять собой структуру данных с необходимым набором полей, а все элементы должны представлять собой циклический список (односвязный или двусвязный – решайте сами). В программе должно быть меню, позволяющее выполнить следующие действия:

1. Добавить элемент

2. Удалить элемент

3. Вывести элементы на экран

4. Выйти

При добавлении элемента необходимо спросить у пользователя значения всех необходимых полей структуры, заполнить ими структуру, и добавить её в список (в любое место какое нравится).

При удалении элемента необходимо спросить у пользователя, по значению какого поля структуры необходимо выполнить удаление и, если таких элементов несколько, удалить их все. Номер варианта выбирается следующим образом: берёте свой номер по журналу, находите остаток от его деления на 5 и прибавляете 1.

Структуры данных для хранения:

Вариант 1: Фамилия студента, имя студента, коэффициент IQ

Вариант 2: Фамилия автора, название книги, год выпуска

Вариант 3: Название страны, площадь, население

Вариант 4: Марка автомобиля, масса, стоимость

Вариант 5: Название небесного тела, масса, первая космическая скорость.


Вариант 2: Работа с двоичным деревом поиска

В рамках работы необходимо построить двоичное дерево поиска,

вывести его как-то красиво на экран (сами придумайте как, но без

фанатизма) и реализовать поиск значений, которые есть в его узлах.

Значениями в рамках работы следует сделать обычные целые числа.

Двоичное дерево поиска – двоичное дерево, для которого

выполняются следующие дополнительные условия (свойства дерева поиска):

1. оба поддерева — левое и правое — являются двоичными деревьями

поиска;

2. у всех узлов левого поддерева произвольного узла X значения

ключей данных меньше либо равны, нежели значение ключа данных самого

узла X;

3. у всех узлов правого поддерева произвольного узла X значения

ключей данных больше, нежели значение ключа данных самого узла X.

Пример двоичного дерева:

Двоичное дерево

Количество вершин в дереве следует задать с помощью define-константы, на этапе тестирования можно его установить, например, в значение 7. Целые числа в вершинах дерева можно или считать из файла, имя которого потребовать задать в аргументах командной строки, или сгенерировать случайными.

Дерево должно быть реализовано в программе с помощью двусвязного списка, каждый узел которого будет содержать 3 поля: указатель на левое поддерево, информационное поле (в нём будет храниться выводимое целое число), указатель на правое поддерево.

После построения дерева и вывода его на экран пользователю необходимо предоставить возможность выполнять поиск элементов в дереве по значению их информационной части (целого числа). Задача поиска – сообщить, присутствует ли введённое значение в дереве или нет.

Неподготовленным умам задача может показаться сложной, но в действительности ничего сложного в её реализации нет. По сути дела, для выполнения этой работы вам необходимо будет сделать следующее:

1. Сгенерировать (или считать из файла) заданное константой количество случайных чисел. Если это количество 7, то, допустим, они у вас следующие: 6, 2, 8, 4, 9, 5, 1

2. Объявить структуру данных для узла дерева

3. Построить из сгенерированных чисел двоичное дерево поиска. Это делается весьма просто: для каждого нового числа нужно начиная с корня дерева спускаться вниз до тех пор, пока не обнаружите отсутствие узла. Как только обнаружили – вставляете в это место дерева новый узел с указанным числом в информационной части. Для приведённых выше чисел это дерево будет следующим:

Результат

Получилось оно именно таким следующим образом:

а. Первую вершину делаем корнем, без вариантов

б. Для второй вершины (со значением 2) смотрим, начиная от корневой вершины, больше или меньше её значение, чем значение в вершине. 2 меньше 6, поэтому добавляем вершину в левое поддерево. 

в. Следующее число – 8. Опять смотрим, начиная с корня. Понимаем, что 8 больше чем 6, поэтому добавляем её вправо от корня.

г. Следующее число – 4. Опять смотрим, начиная с корня. 4 меньше чем 6, поэтому переходим к правому поддереву корня, но там у нас уже есть вершина со значением 2. Сравниваем число в добавляемой вершиной со значением в вершине 2, понимаем, что 4 больше 2, значит добавляем вершину со значением 4 справа от 2.

д. И так далее.


4. Вывести на экран построенное дерево (если вам кажется, что выводить на экран готовое дерево слишком сложно, вывод на экран можно делать в процессе построения, так будет немного проще)

5. Предложить пользователю ввести число, после чего сообщить, есть ли такое число в дереве.