Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/env python3
- # \author: Артюхин Матфей
- # \date_start: 2025-02-08
- # \date_end: 2025-02-12
- # Класс Node - элемент двунаправленного списка
- class Node:
- """
- \brief Класс Node представляет элемент двунаправленного списка.
- \param data [in] - данные элемента (числовые, строковые, даты и т.п.)
- \param p_next [in/out] - ссылка на следующий элемент списка
- \param p_prev [in/out] - ссылка на предыдущий элемент списка
- """
- def __init__(self, data):
- # Инициализация данных элемента
- self.data = data # данные элемента
- self.p_next = None # указатель на следующий элемент
- self.p_prev = None # указатель на предыдущий элемент
- # Класс DoublyLinkedList - реализация двунаправленного списка
- class DoublyLinkedList:
- """
- \brief Класс DoublyLinkedList реализует двунаправленный список с операциями добавления,
- удаления и печати списка.
- \param p_first [in/out] - указатель на первый элемент списка
- \param p_cur [in/out] - указатель на текущий элемент списка (для удобства добавления)
- """
- def __init__(self):
- # Инициализация указателей списка
- self.p_first = None # указатель на первый элемент списка
- self.p_cur = None # указатель на текущий элемент списка
- def add(self, item):
- """
- \brief Функция добавления элемента в список.
- \param item [in] - значение добавляемого элемента.
- \retval None
- """
- # Создаем новый элемент списка с заданным значением
- p_tmp = Node(item)
- # Если список пуст, новый элемент становится первым
- if self.p_first is None:
- self.p_first = p_tmp # устанавливаем p_first
- self.p_cur = p_tmp # устанавливаем p_cur
- # Организуем циклическую связь для одиночного элемента
- p_tmp.p_next = p_tmp # ссылка на самого себя как на следующий элемент
- p_tmp.p_prev = p_tmp # ссылка на самого себя как на предыдущий элемент
- else:
- # Добавление нового элемента после текущего элемента p_cur
- p_tmp.p_next = self.p_cur.p_next # назначаем ссылку на следующий элемент
- p_tmp.p_prev = self.p_cur # назначаем ссылку на предыдущий элемент
- # Комментарий: обновляем ссылку предыдущего элемента у p_cur.p_next
- self.p_cur.p_next.p_prev = p_tmp
- # Обновляем ссылку следующего элемента у текущего элемента
- self.p_cur.p_next = p_tmp
- # Перемещаем указатель p_cur на вновь добавленный элемент
- self.p_cur = p_tmp
- # Конец функции add
- def remove(self, item):
- """
- \brief Функция удаления первого найденного элемента из списка по значению.
- \param item [in] - значение удаляемого элемента.
- \retval None
- """
- # Если список пуст, удалять нечего
- if self.p_first is None:
- return
- p_tmp = self.p_first # начинаем поиск с первого элемента
- # Перебор элементов списка
- while True:
- # Если найден элемент с требуемым значением
- if p_tmp.data == item:
- # Если список содержит только один элемент
- if p_tmp.p_next == p_tmp:
- self.p_first = None # обнуляем указатель на первый элемент
- self.p_cur = None # обнуляем указатель на текущий элемент
- else:
- # Если удаляется первый элемент списка
- if p_tmp == self.p_first:
- self.p_first = p_tmp.p_next # переназначаем p_first
- # Обновляем связи соседних элементов
- p_tmp.p_prev.p_next = p_tmp.p_next
- p_tmp.p_next.p_prev = p_tmp.p_prev
- # Если удаляется текущий элемент, обновляем указатель p_cur
- if p_tmp == self.p_cur:
- self.p_cur = p_tmp.p_prev
- # Элемент найден и удален, выходим из функции
- return
- # Переходим к следующему элементу
- p_tmp = p_tmp.p_next
- # Если вернулись к первому элементу, значит, элемент не найден
- if p_tmp == self.p_first:
- break
- # Конец функции remove
- def print_list(self):
- """
- \brief Функция печати элементов списка на экран.
- \retval None
- """
- # Если список пуст, выводим сообщение
- if self.p_first is None:
- print("Список пуст")
- return
- # Начинаем печать с первого элемента
- print("Элементы списка:", end=" ")
- p_tmp = self.p_first
- # Выводим данные первого элемента
- print(p_tmp.data, end=" ")
- p_tmp = p_tmp.p_next
- # Печатаем остальные элементы до полного обхода списка
- while p_tmp != self.p_first:
- print(p_tmp.data, end=" ")
- p_tmp = p_tmp.p_next
- print() # переход на новую строку после печати списка
- # Конец функции print_list
- def main():
- """
- \brief Основная функция программы, реализующая меню для работы со списком.
- \retval None
- """
- # Инициализируем двунаправленный список
- pList = DoublyLinkedList()
- while True:
- # Вывод меню для пользователя
- print("\nПожалуйста, введите номер команды:")
- print("0 - Выход")
- print("1 - Добавить элемент")
- print("2 - Удалить элемент")
- print("3 - Напечатать список")
- # Ввод команды от пользователя
- try:
- menuPos = int(input("Введите команду: "))
- except ValueError:
- # Если ввод некорректен, выводим сообщение и повторяем цикл
- print("Некорректный ввод. Попробуйте снова.")
- continue
- # Обработка выбора команды
- if menuPos == 0:
- # Выход из программы
- print("... Завершение работы ...")
- break
- elif menuPos == 1:
- # Добавление элемента в список
- data = input("-- Введите значение элемента (добавление): ")
- # Попытка преобразования введенных данных в целое число
- try:
- data = int(data)
- except ValueError:
- # Если преобразование не удалось, оставляем строковое значение
- pass
- pList.add(data)
- elif menuPos == 2:
- # Удаление элемента из списка
- data = input("-- Введите значение элемента (удаление): ")
- try:
- data = int(data)
- except ValueError:
- pass
- pList.remove(data)
- elif menuPos == 3:
- # Печать списка
- pList.print_list()
- else:
- # Обработка неверного выбора команды
- print("!!! Неверный номер команды !!!")
- # Конец основного цикла меню
- # Точка входа в программу
- if __name__ == "__main__":
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement