Практика 3(СД)
.pdfМинистерство науки и высшего образования Российской Федерации Федеральное государственное автономное образовательное учреждение высшего образования
ТОМСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ СИСТЕМ УПРАВЛЕНИЯ И РАДИОЭЛЕКТРОНИКИ (ТУСУР)
Кафедра комплексной информационной безопасности электронно-
вычислительных систем (КИБЭВС)
СПИСКИ Отчёт по практической работе №3
по дисциплине «Структуры данных»
Студент гр. 714-1
_______ И.С. Максимов
__.__.2025
Доцент кафедры КИБЭВС
_______ Е.Е. Лунёва
__.__.2025
Томск 2025
|
Оглавление |
|
Введение................................................................................................................... |
3 |
|
1. |
Ход работы .................................................................................................... |
4 |
1.1. |
Инициализация пустого списка ............................................................... |
4 |
1.2. Добавление элементов списка в конец.................................................... |
5 |
|
1.3. Удаление заданного элемента из списка................................................. |
5 |
|
1.4. |
Очистка списка .......................................................................................... |
6 |
1.5. |
Поиск элемента .......................................................................................... |
7 |
1.6. |
Сортировка списка .................................................................................... |
8 |
1.7. Поиск элемента по индексу.................................................................... |
10 |
|
1.8. |
Слияние списка........................................................................................ |
10 |
Заключение ............................................................................................................ |
13 |
|
2
Введение
Реализовать динамический список при помощи двух классов. Класс Node -
отвечает за узел элемента списка, класс List - за работу со списком.
Реализовать интерфейсную часть - методы:
-инициализация пустого списка;
-добавление элементов списка в конец;
-удаление заданного элемента из списка;
-очистка списка;
-поиск элемента.
Вариант 1. Реализуемый список должен быть односвязным. Дополнительно реализовать методы: поиск элемента по индексу, решить задачу слияния двух списков. Второй список добавляется после элемента с указанным индексом в первый список. Третий список для слияния не использовать.
3
1.Ход работы
1.1.Инициализация пустого списка
Созданы два класса: Node, отвечающий за узел списка, и List,
отвечающий за работу со списком. Далее созданы объекты класса Node: data –
хранит данные узла, Node next – содержит ссылку на следующий узел.
На рисунке 1.1 представлен фрагмент кода, объявляющего узел списка.
Рисунок 1.1 – Объявление узла списка
Затем были созданы объекты класса List: head – первый элемент списка, tail – последний элемент списка и count – счетчик количества элементов в списке.
На рисунке 1.2 представлен фрагмент кода, объявляющего список.
Рисунок 1.2 - Объявление списка
4
1.2.Добавление элементов списка в конец
Создаётся новый узел newNode с переданным значением element.
Проверяется, пуст ли список (переменная head). Если список пуст, то head и tail устанавливаются равными новому узлу newNode, что делает его первым и единственным элементом списка. tail.Next устанавливается равным head,
замыкая список в кольцо. Если список не пуст, то tail.Next устанавливается равным новому узлу newNode, затем tail переназначается на newNode, и tail.Next снова устанавливается равным head для сохранения циклической структуры. Увеличивается счётчик элементов count. Метод возвращает true в
качестве результата успешного выполнения операции.
На рисунке 1.3 представлен фрагмент кода.
Рисунок 1.3 - Добавление элементов списка в конец
1.3.Удаление заданного элемента из списка
Проверяется, пуст ли список. Если список пуст, метод возвращает false.
Создаются две переменные: current (начинает с головы списка) и previous (изначально равен хвосту, так как в циклическом списке элемент перед головой — это хвост). В цикле do-while перебираются элементы списка. Для
5
каждого элемента проверяется, совпадает ли его значение с искомым. Если элемент найден, обрабатываются четыре случая: удаление единственного элемента, удаление головы, удаление хвоста или удаление из середины.
Соответственно переназначаются ссылки head, tail, previous.Next или tail.Next.
Уменьшается счетчик count. Метод возвращает true при успешном удалении.
Если элемент не найден после полного обхода, возвращается false.
На рисунке 1.4 представлен метод фрагментом из кода.
Рисунок 1.4 - Удаление элемента из списка
1.4.Очистка списка
Устанавливает head в null, что разрывает ссылку на первый элемент списка. Устанавливает tail в null, что разрывает ссылку на последний элемент.
Устанавливает count в 0, обнуляя счетчик элементов. Метод возвращает true
при успешной очистке списка. На рисунке 1.5 представлен метод фрагментом из кода.
6
Рисунок 1.5 - Чистка списка
Рисунок 1.6 – Блок-схема метода чистки списка
1.5.Поиск элемента
Проверяется, пуст ли список. Если пуст, возвращается -1. Создается переменная current, которая начинается с головы списка, и переменная index
со значением 0. В цикле do-while перебираются элементы списка. Для каждого элемента проверяется, совпадает ли его значение с искомым. Если элемент
7
найден, возвращается его индекс. Если после полного обхода элемент не найден, возвращается.
На рисунке 1.7 представлен метод фрагментом из кода.
Рисунок 1.7 - Поиск заданного элемента
1.6.Сортировка списка
Проверяется, пуст ли список или состоит из одного элемента. Если да,
метод завершается. Используется алгоритм пузырьковой сортировки. Во внешнем цикле do-while выполняется до тех пор, пока на очередном проходе были обмены. Во внутреннем цикле do-while перебираются соседние элементы списка. Если текущий элемент больше следующего, их значения меняются местами. Флаг swapped устанавливается в true, indicating что нужен еще один проход. Процесс продолжается до полной сортировки списка. На рисунке 1.8 представлен метод фрагментом из кода.
8
Рисунок 1.8 - Сортировка списка
9
1.7.Поиск элемента по индексу
Создаётся индексная переменная index для проверки позиции. Если индекс меньше нуля, метод сразу возвращает null, так как индекс вне допустимого диапазона. Инициализируется указатель current, который начинает с головы списка head — это первый элемент списка. В цикле while
последовательно проходим по каждому узлу списка, переходя к следующему узлу через current.Next. На каждой итерации увеличивается счётчик текущего индекса currentIndex. Когда счётчик currentIndex совпадает с заданным индексом, возвращается значение текущего элемента current.Data. Если обход списка закончился (current стал равен null), а заданный индекс не найден,
возвращается null. Таким образом реализован постепенный последовательный поиск элемента по его позиции в односвязном списке — так как односвязный список не имеет прямого доступа по индексу, приходится проходить от начала к нужному элементу.
Рисунок 1.9 – Метод поиска элемента по индексу
1.8.Слияние списка
Создается новый пустой список result для хранения результата.
Проверяется, не пуст ли каждый из исходных списков. Если один из списков
10
