Advertisement
Solingen

SAKOD_lab1.py

Feb 12th, 2025
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 9.51 KB | None | 0 0
  1. #!/usr/bin/env python3
  2. # \author: Артюхин Матфей
  3. # \date_start: 2025-02-08
  4. # \date_end: 2025-02-12
  5.  
  6. # Класс Node - элемент двунаправленного списка
  7. class Node:
  8.     """
  9.    \brief Класс Node представляет элемент двунаправленного списка.
  10.    
  11.    \param data [in]       - данные элемента (числовые, строковые, даты и т.п.)
  12.    \param p_next [in/out] - ссылка на следующий элемент списка
  13.    \param p_prev [in/out] - ссылка на предыдущий элемент списка
  14.    """
  15.     def __init__(self, data):
  16.         # Инициализация данных элемента
  17.         self.data = data  # данные элемента
  18.         self.p_next = None  # указатель на следующий элемент
  19.         self.p_prev = None  # указатель на предыдущий элемент
  20.  
  21. # Класс DoublyLinkedList - реализация двунаправленного списка
  22. class DoublyLinkedList:
  23.     """
  24.    \brief Класс DoublyLinkedList реализует двунаправленный список с операциями добавления,
  25.           удаления и печати списка.
  26.    
  27.    \param p_first [in/out] - указатель на первый элемент списка
  28.    \param p_cur [in/out]   - указатель на текущий элемент списка (для удобства добавления)
  29.    """
  30.     def __init__(self):
  31.         # Инициализация указателей списка
  32.         self.p_first = None  # указатель на первый элемент списка
  33.         self.p_cur = None    # указатель на текущий элемент списка
  34.  
  35.     def add(self, item):
  36.         """
  37.        \brief Функция добавления элемента в список.
  38.        
  39.        \param item [in] - значение добавляемого элемента.
  40.        \retval None
  41.        """
  42.         # Создаем новый элемент списка с заданным значением
  43.         p_tmp = Node(item)
  44.         # Если список пуст, новый элемент становится первым
  45.         if self.p_first is None:
  46.             self.p_first = p_tmp  # устанавливаем p_first
  47.             self.p_cur = p_tmp    # устанавливаем p_cur
  48.             # Организуем циклическую связь для одиночного элемента
  49.             p_tmp.p_next = p_tmp  # ссылка на самого себя как на следующий элемент
  50.             p_tmp.p_prev = p_tmp  # ссылка на самого себя как на предыдущий элемент
  51.         else:
  52.             # Добавление нового элемента после текущего элемента p_cur
  53.             p_tmp.p_next = self.p_cur.p_next  # назначаем ссылку на следующий элемент
  54.             p_tmp.p_prev = self.p_cur         # назначаем ссылку на предыдущий элемент
  55.             # Комментарий: обновляем ссылку предыдущего элемента у p_cur.p_next
  56.             self.p_cur.p_next.p_prev = p_tmp
  57.             # Обновляем ссылку следующего элемента у текущего элемента
  58.             self.p_cur.p_next = p_tmp
  59.             # Перемещаем указатель p_cur на вновь добавленный элемент
  60.             self.p_cur = p_tmp
  61.         # Конец функции add
  62.  
  63.     def remove(self, item):
  64.         """
  65.        \brief Функция удаления первого найденного элемента из списка по значению.
  66.        
  67.        \param item [in] - значение удаляемого элемента.
  68.        \retval None
  69.        """
  70.         # Если список пуст, удалять нечего
  71.         if self.p_first is None:
  72.             return
  73.  
  74.         p_tmp = self.p_first  # начинаем поиск с первого элемента
  75.         # Перебор элементов списка
  76.         while True:
  77.             # Если найден элемент с требуемым значением
  78.             if p_tmp.data == item:
  79.                 # Если список содержит только один элемент
  80.                 if p_tmp.p_next == p_tmp:
  81.                     self.p_first = None  # обнуляем указатель на первый элемент
  82.                     self.p_cur = None    # обнуляем указатель на текущий элемент
  83.                 else:
  84.                     # Если удаляется первый элемент списка
  85.                     if p_tmp == self.p_first:
  86.                         self.p_first = p_tmp.p_next  # переназначаем p_first
  87.                     # Обновляем связи соседних элементов
  88.                     p_tmp.p_prev.p_next = p_tmp.p_next
  89.                     p_tmp.p_next.p_prev = p_tmp.p_prev
  90.                     # Если удаляется текущий элемент, обновляем указатель p_cur
  91.                     if p_tmp == self.p_cur:
  92.                         self.p_cur = p_tmp.p_prev
  93.                 # Элемент найден и удален, выходим из функции
  94.                 return
  95.             # Переходим к следующему элементу
  96.             p_tmp = p_tmp.p_next
  97.             # Если вернулись к первому элементу, значит, элемент не найден
  98.             if p_tmp == self.p_first:
  99.                 break
  100.         # Конец функции remove
  101.  
  102.     def print_list(self):
  103.         """
  104.        \brief Функция печати элементов списка на экран.
  105.        
  106.        \retval None
  107.        """
  108.         # Если список пуст, выводим сообщение
  109.         if self.p_first is None:
  110.             print("Список пуст")
  111.             return
  112.  
  113.         # Начинаем печать с первого элемента
  114.         print("Элементы списка:", end=" ")
  115.         p_tmp = self.p_first
  116.         # Выводим данные первого элемента
  117.         print(p_tmp.data, end=" ")
  118.         p_tmp = p_tmp.p_next
  119.         # Печатаем остальные элементы до полного обхода списка
  120.         while p_tmp != self.p_first:
  121.             print(p_tmp.data, end=" ")
  122.             p_tmp = p_tmp.p_next
  123.         print()  # переход на новую строку после печати списка
  124.         # Конец функции print_list
  125.  
  126. def main():
  127.     """
  128.    \brief Основная функция программы, реализующая меню для работы со списком.
  129.    
  130.    \retval None
  131.    """
  132.     # Инициализируем двунаправленный список
  133.     pList = DoublyLinkedList()
  134.  
  135.     while True:
  136.         # Вывод меню для пользователя
  137.         print("\nПожалуйста, введите номер команды:")
  138.         print("0 - Выход")
  139.         print("1 - Добавить элемент")
  140.         print("2 - Удалить элемент")
  141.         print("3 - Напечатать список")
  142.         # Ввод команды от пользователя
  143.         try:
  144.             menuPos = int(input("Введите команду: "))
  145.         except ValueError:
  146.             # Если ввод некорректен, выводим сообщение и повторяем цикл
  147.             print("Некорректный ввод. Попробуйте снова.")
  148.             continue
  149.  
  150.         # Обработка выбора команды
  151.         if menuPos == 0:
  152.             # Выход из программы
  153.             print("... Завершение работы ...")
  154.             break
  155.         elif menuPos == 1:
  156.             # Добавление элемента в список
  157.             data = input("-- Введите значение элемента (добавление): ")
  158.             # Попытка преобразования введенных данных в целое число
  159.             try:
  160.                 data = int(data)
  161.             except ValueError:
  162.                 # Если преобразование не удалось, оставляем строковое значение
  163.                 pass
  164.             pList.add(data)
  165.         elif menuPos == 2:
  166.             # Удаление элемента из списка
  167.             data = input("-- Введите значение элемента (удаление): ")
  168.             try:
  169.                 data = int(data)
  170.             except ValueError:
  171.                 pass
  172.             pList.remove(data)
  173.         elif menuPos == 3:
  174.             # Печать списка
  175.             pList.print_list()
  176.         else:
  177.             # Обработка неверного выбора команды
  178.             print("!!! Неверный номер команды !!!")
  179.     # Конец основного цикла меню
  180.  
  181. # Точка входа в программу
  182. if __name__ == "__main__":
  183.     main()
  184.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement