Advertisement
general_ghest

Cursach 3 sem 1.2 rus

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