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