Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- class Node:
- def __init__(self):
- self.previous = None
- self.next = None
- self.name = None
- self.points = None
- def __init__(self, name, points):
- self.name = name
- self.points = points
- def print_data(self):
- print('Name: ' + self.name)
- print('Points: ' + str(self.points))
- print()
- class BidirectionalList:
- def __init__(self):
- self.head = None
- self.size = 0
- def add_node_at_end(self, name, points):
- if self.head is None:
- self.head = Node(name, points)
- self.head.next = self.head
- self.head.previous = self.head
- else:
- temp = self.head
- while temp.next != self.head:
- temp = temp.next
- temp.next = Node(name, points)
- temp.next.next = self.head
- temp.next.previous = temp
- self.head.previous = temp.next
- self.size += 1
- def add_node_at_begin(self, name, points):
- if self.head is None:
- self.head = Node(name, points)
- self.head.next = self.head
- self.head.previous = self.head
- else:
- temp = Node(name, points)
- self.head.previous.next = temp
- temp.next = self.head
- temp.previous = self.head.previous
- temp.next.previous = temp
- self.head = temp
- self.size += 1
- def add_node_at_position(self, name, points, position):
- try:
- if position > self.size or position < 0:
- raise ValueError('Position have to be greater than 0 and lesser than list size!')
- else:
- temp = self.head
- for i in range(position):
- temp = temp.next
- temp2 = Node(name, points)
- temp.previous.next = temp2
- temp2.next = temp
- temp.previous = temp2
- self.size += 1
- except ValueError as ve:
- print('Exception: ' + repr(ve))
- def delete_node_at_end(self):
- if self.head is None:
- print('Nothing to delete')
- else:
- self.head.previous.previous.next = self.head
- self.head.previous = self.head.previous.previous
- self.size -= 1
- def delete_node_at_begin(self):
- if self.head is None:
- print('Nothing to delete')
- else:
- self.head.previous.next = self.head.next
- self.head.next.previous = self.head.previous
- self.head = self.head.next
- self.size -= 1
- def print_list_downwards(self):
- temp = self.head
- temp.print_data()
- temp = temp.next
- while temp != self.head:
- temp.print_data()
- temp = temp.next
- def print_list_upwards(self):
- temp = self.head.previous
- temp.print_data()
- temp = temp.previous
- while temp != self.head.previous:
- temp.print_data()
- temp = temp.previous
- def find_max(self):
- if self.head is None:
- print('List empty!')
- else:
- temp = self.head
- max_node = temp
- for i in range(self.size - 1):
- temp = temp.next
- if temp.points > max_node.points:
- max_node = temp
- print('Node with max points value:')
- max_node.print_data()
- def main():
- blist = BidirectionalList()
- blist.add_node_at_end('A', 19)
- blist.add_node_at_end('B', 23)
- blist.add_node_at_end('C', 29)
- blist.add_node_at_begin('D', 31)
- blist.add_node_at_begin('E', 37)
- blist.print_list_upwards()
- print('deleting begin...')
- blist.delete_node_at_begin()
- blist.print_list_downwards()
- print('deleting end...')
- blist.delete_node_at_end()
- blist.print_list_downwards()
- print('adding at the end...')
- blist.add_node_at_end('new_end', 44)
- blist.print_list_downwards()
- print('adding at the begin...')
- blist.add_node_at_begin('new_begin', 55)
- blist.print_list_downwards()
- # print('... and upwards...')
- # blist.print_list_upwards()
- print('... adding node at position...')
- blist.add_node_at_position('new_position', 77, 3)
- blist.print_list_downwards()
- print('finding max...')
- blist.find_max()
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement