Advertisement
fahadkalil

lde_alunos_19092019_fim_aula

Sep 19th, 2019
277
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 4.86 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.         if self.is_empty():
  31.             self.__inserir(novo)
  32.         else:
  33.             atual_primeiro = self.header.proximo #para saber quem eh o primeiro
  34.             novo.proximo = atual_primeiro   # atual <- novo
  35.             atual_primeiro.anterior = novo  # atual -> novo
  36.             self.header.proximo = novo      # header -> novo
  37.             novo.anterior = self.header     # header <- novo      
  38.  
  39.         self.tam += 1
  40.  
  41.     def inserirFim(self, novo):
  42.         if self.is_empty():
  43.             self.__inserir(novo)
  44.         else:
  45.             atual_ultimo = self.trailer.anterior
  46.             novo.anterior = atual_ultimo
  47.             novo.proximo = self.trailer
  48.             atual_ultimo.proximo = novo
  49.             self.trailer.anterior = novo
  50.  
  51.         self.tam += 1
  52.  
  53.     def __remover(self): # chamado quando temos apenas 1 elemento na LDE
  54.         removido = self.header.proximo
  55.         removido.proximo = None
  56.         removido.anterior = None
  57.         self.header.proximo = None
  58.         self.trailer.anterior = None
  59.         return removido
  60.    
  61.     def removerInicio(self):
  62.         if self.is_empty():
  63.             print('Lista Vazia!')
  64.             return
  65.  
  66.         if self.tam == 1:
  67.             removido = self.__remover()
  68.         else:
  69.             # lista possui + de 1 item            
  70.             removido = self.header.proximo
  71.             novo_head = removido.proximo
  72.             self.header.proximo = novo_head
  73.             removido.proximo = None
  74.             removido.anterior = None
  75.            
  76.         self.tam -= 1            
  77.         return removido
  78.        
  79.     def removerFim(self):
  80.         if self.is_empty():
  81.             print('Lista Vazia!')
  82.             return
  83.  
  84.         if self.tam == 1:
  85.             removido = self.__remover()
  86.         else:
  87.             # descobrir quem eh o ultimo
  88.             removido = self.trailer.anterior
  89.             novo_ultimo = removido.anterior
  90.             novo_ultimo.proximo = self.trailer
  91.             self.trailer.anterior = novo_ultimo
  92.             removido.proximo = None
  93.             removido.anterior = None
  94.            
  95.         self.tam -= 1
  96.         return removido
  97.  
  98.     def imprimir(self, reverso=False):
  99.         if self.is_empty():
  100.             print('Lista Vazia')
  101.             return
  102.  
  103.         if not reverso: # mesmo que if (reverso == True)
  104.             item = self.header.proximo # devolve o 1o da lista
  105.             while (item.proximo is not None):
  106.                 print(item)
  107.                 item = item.proximo
  108.         else:
  109.             item = self.trailer.anterior # devolve o ultimo da lista
  110.             while (item.anterior is not None):
  111.                 print(item)
  112.                 item = item.anterior
  113.    
  114.     def removerAntes(self, alvo):
  115.         # header <-> [] <-> [] <-> trailer
  116.        
  117.         nodo_atual = self.buscar(alvo)
  118.         nodo_anterior = nodo_atual.anterior
  119.        
  120.         if (nodo_anterior != self.header):            
  121.             aux = nodo_anterior.anterior
  122.             aux.proximo = nodo_atual
  123.             nodo_atual.anterior = aux
  124.            
  125.             nodo_anterior.anterior = None
  126.             nodo_anterior.proximo = None
  127.            
  128.         self.tam -= 1
  129.        
  130.     def removerApos(self, alvo):
  131.         pass
  132.  
  133.     def get(self, indice):
  134.         pass
  135.  
  136.     def buscar(self, alvo): # retorna a 1a ocorrencia
  137.         pass
  138.  
  139.     def substituir(self, alvo, valor):
  140.         pass
  141.  
  142.     def buscarTodos(self, alvo): # retorna uma list com resultados
  143.         pass
  144.  
  145.     def primeiro(self):
  146.         if self.is_empty():
  147.             print('Lista Vazia')
  148.             return
  149.         else:
  150.             return self.header.proximo
  151.  
  152.     def ultimo(self):
  153.         pass
  154.  
  155.     def __len__(self):
  156.         return self.tam
  157.  
  158. ## TESTES ##
  159.  
  160. lista = LDE()
  161. lista.inserirInicio(Dnodo('abc'))
  162. lista.inserirInicio(Dnodo('001'))
  163. lista.inserirInicio(Dnodo('xyz'))
  164. lista.inserirFim(Dnodo('zzz'))
  165. lista.removerInicio()
  166. lista.removerFim()
  167.  
  168. lista.imprimir()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement