Advertisement
general_ghest

Cursach 3 sem 1.0 + comments rus

Nov 14th, 2019
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 5.59 KB | None | 0 0
  1. # Определяем: базовый класс для узла, где он хранится
  2. #             данные того же узла
  3. #             индекс следующего узла
  4. #             индекс предыдущего узла
  5. class Node:
  6.     def __init__(self, data):
  7.         self.data = data
  8.         self.next = None
  9.         self.prev = None
  10.  
  11. # Класс двусвязного списка создан
  12. class DoublyLinkedList:
  13.     # Конструктор
  14.     def __init__(self):
  15.         self.first = None
  16.         self.last = None
  17.  
  18.     # Введите индекс узла, который вы хотите получить
  19.     def get_node(self, index):
  20.         # текущий узел является первым в списке
  21.         current = self.first
  22.         # Список прокручивается до указанного индекса
  23.         for i in range(index):
  24.             # Если текущего узла нет, то это потому, что список пуст
  25.             if current is None:
  26.                 # не возвращается, так как нет узлов
  27.                 return None
  28.             # Если текущего узла нет, получается следующее
  29.             # продолжить прокрутку списка, пока не достигнете запрошенного индекса
  30.             current = current.next
  31.             return current
  32.  
  33.     # введите узел после ссылочного узла
  34.     # введен индекс ссылочного узла
  35.     def insert_after(self, ref_node, new_node):
  36.         new_node.prev = ref_node
  37.         if ref_node.next is None:
  38.             self.last = new_node
  39.         else:
  40.             new_node.next = ref_node.next
  41.             new_node.next.prev = new_node
  42.         ref_node.next = new_node
  43.  
  44.     def insert_before(self, ref_node, new_node):
  45.         new_node.next = ref_node
  46.         if ref_node.prev is None:
  47.             self.first = new_node
  48.         else:
  49.             new_node.prev = ref_node.prev
  50.             new_node.prev.next = new_node
  51.         ref_node.prev = new_node
  52.  
  53.     def insert_at_beg(self, new_node):
  54.         if self.first is None:
  55.             self.first = new_node
  56.             self.last = new_node
  57.         else:
  58.             self.insert_before(self.first, new_node)
  59.  
  60.     def insert_at_end(self, new_node):
  61.         if self.last is None:
  62.             self.last = new_node
  63.             self.first = new_node
  64.         else:
  65.             self.insert_after(self.last, new_node)
  66.  
  67.     def remove(self, node):
  68.         if node.prev is None:
  69.             self.first = node.next
  70.         else:
  71.             node.prev.next = node.next
  72.  
  73.         if node.next is None:
  74.             self.last = node.prev
  75.         else:
  76.             node.next.prev = node.prev
  77.  
  78.     def items(self):
  79.         x = self.first
  80.         while x:
  81.             yield x
  82.             x = x.next
  83.  
  84.     def values(self):
  85.         x = self.first
  86.         while x:
  87.             yield x.data
  88.             x = x.next
  89.    
  90.     def display(self):
  91.         return ', '.join([str(x) for x in self.values()])
  92.  
  93.     #selection sort on linked list
  94.     def sort(self):
  95.         if self.first and node.next:
  96.             i = self.first
  97.             while i.next:
  98.                 selected = i
  99.                 j = i.next
  100.                 while j:
  101.                     if j.values < selected.values:
  102.                         selected = j
  103.                     j = j.next
  104.                 if not selected==i:
  105.                     i.values, selected.values = selected.values, i.values
  106.                 i = i.next
  107.        
  108.            
  109. a_dllist = DoublyLinkedList()
  110.  
  111. print('Меню')
  112. print('вставить ____ после индекса')
  113. print('вставить ____ перед индексом')
  114. print('вставить ____ в начало')
  115. print('вставить ____ в конец')
  116. print('удалить ____ (удалить данные по индексу)')
  117. print('сортировать')
  118. print('выйти')
  119.  
  120. while True:
  121.     print('The list: ', a_dllist.display())
  122.     a_dllist.display()
  123.     print()
  124.     do = input('Что Вы хотите сделать? ').split()
  125.  
  126.     operation = do[0].strip().lower()
  127.  
  128.     if operation == 'вставить':
  129.         data = int(do[1])
  130.         position = do[3].strip().lower()
  131.         new_node = Node(data)
  132.         suboperation = do[2].strip().lower()
  133.         if suboperation == 'в':
  134.             if position == 'начало':
  135.                 a_dllist.insert_at_beg(new_node)
  136.             elif position == 'конец':
  137.                 a_dllist.insert_at_end(new_node)
  138.         else:
  139.             index = int(position)
  140.             ref_node = a_dllist.get_node(index)
  141.             if ref_node is None:
  142.                 print('Такого индекса нет')
  143.                 continue
  144.             if suboperation == 'после':
  145.                 a_dllist.insert_after(ref_node, new_node)
  146.             elif suboperation == 'перед':
  147.                 a_dllist.insert_before(ref_node, new_node)
  148.  
  149.     elif operation == 'удалить':
  150.         index = int(do[1])
  151.         node = a_dllist.get_node(index)
  152.         if node is None:
  153.             print('Такого индекса нет')
  154.             continue
  155.         a_dllist.remove(node)
  156.        
  157.     elif operation =='сортировать':
  158.         print('Переходим к сортировке')
  159.         a_dllist.sort()
  160.  
  161.     elif operation == 'выйти':
  162.         print ('Всего доброго!')
  163.         break
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement