Advertisement
general_ghest

cursach RUS 3 sem + sort 4.0 fake

Nov 21st, 2019
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.74 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. #Итератор объектов
  79. def items(self):
  80. x = self.first
  81. while x:
  82. yield x
  83. x = x.next
  84.  
  85. #Итератор значений объектов
  86. def values(self):
  87. x = self.first
  88. while x:
  89. yield x.data
  90. x = x.next
  91.  
  92. #Вывод списка
  93. def display(self):
  94. return ', '.join([str(x) for x in self.values()])
  95.  
  96. def sort(self):
  97. #Current(текущий элемент) будет указывать на голову списка
  98. current = self.first
  99. while(current.next != None):
  100. #Index будет указывать на следующий элемент после текущего
  101. index = current.next;
  102. while(index):
  103. #Если текущий узел>следующий, то меняем их местами
  104. yield(index.data)
  105. temp = current.data;
  106. current.data = index.data;
  107. index.data = temp;
  108. index = index.next
  109. current = current.next
  110.  
  111. #Опредедение размера списка
  112. def size(self):
  113. temp = self.first
  114. count = 0
  115. while temp is not None:
  116. count = count + 1
  117. temp = temp.next
  118. return count
  119.  
  120. #Поиск в списке
  121. def search (self, element):
  122. current=self.head
  123. index=1
  124. while current != None:
  125. if current.data == element:
  126. return index
  127. current = current.next_node
  128. index += 1
  129. return -1
  130.  
  131. a_dllist = DoublyLinkedList()
  132.  
  133. print('Меню')
  134. print('вставить ____ после индекса')
  135. print('вставить ____ перед индексом')
  136. print('вставить ____ в начало')
  137. print('вставить ____ в конец')
  138. print('удалить ____ (удалить данные по индексу)')
  139. print('сортировать')
  140. print('найти ____')
  141. print('определить размер')
  142. print('выйти')
  143.  
  144. while True:
  145. print('The list: ', a_dllist.display())
  146. a_dllist.display()
  147. print()
  148. do = input('Что Вы хотите сделать? ').split()
  149.  
  150. operation = do[0].strip().lower()
  151.  
  152. if operation == 'вставить':
  153. data = int(do[1])
  154. position = do[3].strip().lower()
  155. new_node = Node(data)
  156. suboperation = do[2].strip().lower()
  157. if suboperation == 'в':
  158. if position == 'начало':
  159. a_dllist.insert_at_beg(new_node)
  160. elif position == 'конец':
  161. a_dllist.insert_at_end(new_node)
  162. else:
  163. index = int(position)
  164. ref_node = a_dllist.get_node(index)
  165. if ref_node is None:
  166. print('Такого индекса нет')
  167. continue
  168. if suboperation == 'после':
  169. a_dllist.insert_after(ref_node, new_node)
  170. elif suboperation == 'перед':
  171. a_dllist.insert_before(ref_node, new_node)
  172. elif operation == 'сортировать':
  173. a_dllist.sort()
  174. elif operation == 'удалить':
  175. index = int(do[1])
  176. node = a_dllist.get_node(index)
  177. if node is None:
  178. print('Такого индекса нет')
  179. continue
  180. a_dllist.remove(node)
  181. elif operation == 'найти':
  182. element = input("Введите поисковый запрос: ")
  183. search_index=a_dllist.search(element)
  184. if search_index is None:
  185. print('Такого элемента нет')
  186. elif operation == 'определить размер':
  187. a_dllist.size()
  188. elif operation == 'выйти':
  189. print ('Всего доброго!')
  190. break
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement