fahadkalil

lde_01102020_fimaula

Oct 1st, 2020 (edited)
1,584
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.35 KB | None | 0 0
  1. # Lista Duplamente Encadeada com uso de Sentinelas
  2.  
  3. class Dnodo:
  4.     def __init__(self, dado = None):
  5.         self.dado = dado
  6.         self.anterior = None
  7.         self.proximo = None
  8.  
  9.     def __str__(self):
  10.         return str(self.dado)
  11.  
  12. class LDE:
  13.     def __init__(self):
  14.         self.header = Dnodo()   # <<< Sentinela Cabeça
  15.         self.trailer = Dnodo()  # <<< Sentinela Cauda
  16.         self.tam = 0            # qtde de itens na lista
  17.  
  18.     def is_empty(self):
  19.         if self.header.proximo is None and self.trailer.anterior is None:
  20.             return True
  21.         return False
  22.  
  23.     def __inserir(self, novo):
  24.         self.header.proximo = novo    # header -> novo
  25.         novo.anterior = self.header   # header <- novo
  26.         novo.proximo = self.trailer   # novo -> trailer
  27.         self.trailer.anterior = novo  # novo <- trailer
  28.      
  29.     def inserirInicio(self, novo):
  30.         self.tam += 1
  31.         if self.is_empty():
  32.             self.__inserir(novo)
  33.         else:
  34.             primeiro = self.header.proximo # variavel auxiliar
  35.             self.header.proximo = novo     # header -> novo
  36.             novo.anterior = self.header    # novo -> header
  37.             novo.proximo = primeiro        # novo -> primeiro
  38.             primeiro.anterior = novo       # primeiro <- novo
  39.            
  40.     def inserirFim(self, novo):
  41.         self.tam += 1
  42.         if self.is_empty():
  43.             self.__inserir(novo)
  44.         else:
  45.             ultimo = self.trailer.anterior
  46.             ultimo.proximo = novo          # ->
  47.             novo.anterior = ultimo         # <-
  48.             novo.proximo = self.trailer    # ->
  49.             self.trailer.anterior = novo   # <-
  50.                        
  51.    
  52.     def removerInicio(self):
  53.         if self.is_empty():
  54.             print('Lista Vazia!')
  55.             return
  56.         else:
  57.             # lista possui + de 1 item            
  58.             removido = self.header.proximo
  59.             if removido.proximo == self.trailer: # se existir apenas 1 item na lista
  60.                 self.header.proximo = None
  61.                 self.trailer.anterior = None
  62.             else:
  63.                 self.header.proximo = removido.proximo
  64.                 removido.proximo.anterior = self.header
  65.                 removido.proximo = None
  66.                 removido.anterior = None
  67.                        
  68.         self.tam -= 1            
  69.         return removido
  70.        
  71.     def removerFim(self):
  72.         if self.is_empty():
  73.             print('Lista Vazia!')
  74.             return      
  75.         else:
  76.             # lista possui + de 1 item            
  77.             removido = self.trailer.anterior
  78.             if removido.anterior == self.header: # se existir apenas 1 item na lista
  79.                 self.header.proximo = None
  80.                 self.trailer.anterior = None
  81.             else:
  82.                 self.trailer.anterior = removido.anterior
  83.                 removido.anterior.proximo = self.trailer
  84.                 removido.proximo = None
  85.                 removido.anterior = None
  86.  
  87.         self.tam -= 1
  88.         return removido
  89.  
  90.     def imprimir(self, reverso=False):
  91.         if self.is_empty():
  92.             print('Lista Vazia')
  93.             return
  94.  
  95.         if not reverso:
  96.             item = self.header.proximo # devolve o 1o da lista
  97.             while item.proximo is not None:
  98.                 print(item)
  99.                 item = item.proximo
  100.         else:
  101.             item = self.trailer.anterior # devolve o ultimo da lista
  102.             while item.anterior is not None:
  103.                 print(item)
  104.                 item = item.anterior
  105.    
  106.     def buscar(self, alvo): # retorna a 1a ocorrencia | alvo eh o valor que o usuario busca
  107.         if self.is_empty():
  108.             print('Lista Vazia')
  109.             return
  110.        
  111.         item = self.header.proximo # devolve o 1o da lista
  112.         while item.proximo is not None:
  113.             if item.dado == alvo:
  114.                 return item
  115.            
  116.             item = item.proximo        
  117.  
  118.     def get(self, posicao):
  119.         if self.is_empty():
  120.             print('Lista Vazia')
  121.             return
  122.  
  123.         if posicao < 0 or posicao >= self.tam:            
  124.             raise IndexError('Posicao Inexistente')
  125.  
  126.         if posicao <= (self.tam // 2):
  127.             pos_atual = 0
  128.            
  129.             item = self.header.proximo # devolve o 1o da lista
  130.             while item.proximo is not None:
  131.                 if pos_atual == posicao:
  132.                     return item
  133.                
  134.                 item = item.proximo
  135.                 pos_atual += 1
  136.         else:
  137.             pos_atual = self.tam - 1
  138.  
  139.             item = self.trailer.anterior # devolve o ultimo da lista
  140.             while item.anterior is not None:
  141.                 if pos_atual == posicao:
  142.                     return item
  143.                
  144.                 item = item.anterior
  145.                 pos_atual -= 1
  146.  
  147.     def removerAntes(self, alvo):
  148.         # header <-> [] <-> [] <-> trailer
  149.        
  150.         nodo_atual = self.buscar(alvo)
  151.         nodo_anterior = nodo_atual.anterior
  152.        
  153.         if (nodo_anterior != self.header):            
  154.             aux = nodo_anterior.anterior
  155.             aux.proximo = nodo_atual
  156.             nodo_atual.anterior = aux
  157.            
  158.             nodo_anterior.anterior = None
  159.             nodo_anterior.proximo = None
  160.            
  161.         self.tam -= 1
  162.        
  163.     def removerApos(self, alvo):
  164.         pass    
  165.  
  166.     def substituir(self, alvo, valor):
  167.         pass
  168.  
  169.     def buscarTodos(self, alvo): # retorna uma list com resultados
  170.         lista_todos = []
  171.         ##
  172.         ## sua logica aqui
  173.         ##
  174.         return lista_todos
  175.  
  176.     def primeiro(self):
  177.         if self.is_empty():
  178.             print('Lista Vazia')
  179.             return
  180.         else:
  181.             return self.header.proximo
  182.  
  183.     def ultimo(self):
  184.         if self.is_empty():
  185.             print('Lista Vazia')
  186.             return
  187.         else:
  188.             return self.trailer.anterior
  189.  
  190.     def __len__(self):
  191.         return self.tam
  192.  
  193. ## TESTES ##
  194.  
  195. lista = LDE()
  196. lista.inserirInicio(Dnodo('abc'))
  197. lista.inserirInicio(Dnodo(9999))
  198. lista.inserirInicio(Dnodo('xyz'))
  199. lista.inserirFim(Dnodo(9999))
  200. lista.removerInicio()
  201. lista.imprimir()
  202.  
  203. achou = lista.buscar(9999)
  204. if not achou:
  205.     print("Nao encontrado")
  206. else:
  207.     print("Encontrou: {}".format(achou))
  208.  
  209.  
  210.  
Add Comment
Please, Sign In to add comment