Advertisement
fahadkalil

lde_alunos_26092019

Oct 7th, 2019
257
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.51 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): ## remover nodo apos o alvo passado
  131.         ## alvo eh um Dnodo
  132.         if alvo.proximo == self.trailer: # se o alvo for o ultimo, entao nao faz nada
  133.             return None
  134.  
  135.         remover = alvo.proximo
  136.         alvo.proximo = remover.proximo
  137.         remover.proximo.anterior = alvo
  138.  
  139.         remover.proximo = None
  140.         remover.anterior = None
  141.                
  142.  
  143.     def get(self, indice): # (indice: int) retorna nodo
  144.         if self.is_empty():
  145.             print('Lista Vazia')
  146.             return
  147.        
  148.         cont = 0
  149.         item = self.header.proximo
  150.  
  151.         while (item.proximo is not None):
  152.             if indice == cont:
  153.                 return item
  154.  
  155.             item = item.proximo
  156.             cont += 1
  157.  
  158.         return None
  159.  
  160.     def buscar(self, alvo): # (alvo: string) retorna a 1a ocorrencia do novo
  161.         if self.is_empty():
  162.             print('Lista Vazia')
  163.             return
  164.        
  165.         item = self.header.proximo
  166.  
  167.         while (item.proximo is not None):
  168.             if alvo == item.dado:
  169.                 return item
  170.  
  171.             item = item.proximo
  172.            
  173.         return None
  174.  
  175.     def substituir(self, alvo, valor): # (alvo: Dnodo) | (valor: string)
  176.         if self.is_empty():
  177.             print('Lista Vazia')
  178.             return
  179.  
  180.         alvo.dado = valor        
  181.  
  182.     def buscarTodos(self, alvo): # retorna uma list com resultados
  183.         if self.is_empty():
  184.             print('Lista Vazia')
  185.             return
  186.        
  187.         resultado = []
  188.  
  189.         item = self.header.proximo
  190.  
  191.         while (item.proximo is not None):
  192.             if alvo == item.dado:
  193.                 resultado.append(item)
  194.  
  195.             item = item.proximo
  196.                
  197.         return resultado
  198.  
  199.     def primeiro(self):
  200.         if self.is_empty():
  201.             print('Lista Vazia')
  202.             return
  203.         else:
  204.             return self.header.proximo
  205.  
  206.     def ultimo(self):
  207.         if self.is_empty():
  208.             print('Lista Vazia')
  209.             return
  210.         else:
  211.             return self.trailer.anterior
  212.  
  213.     def merge(self, outra_lista):
  214.         ## CONCATENANDO AS REFERENCIAS
  215.         '''
  216.        ultimo = self.trailer.anterior        
  217.        primeiro_outra = outra_lista.header.proximo
  218.  
  219.        ultimo.proximo = primeiro_outra
  220.        primeiro_outra.anterior = ultimo
  221.  
  222.        self.trailer.anterior = outra_lista.trailer.anterior        
  223.        outra_lista.trailer.anterior.proximo = self.trailer
  224.        '''
  225.      
  226.         ## CONCATENANDO INSERINDO OS VALORES DA SEGUNDA LISTA
  227.         item = outra_lista.header.proximo # devolve o 1o da lista
  228.         while (item.proximo is not None):
  229.              self.inserirFim(Dnodo(item.dado))
  230.              item = item.proximo
  231.                
  232.        
  233.     def __len__(self):
  234.         return self.tam
  235.  
  236. ## TESTES ##
  237. '''
  238. lista = LDE()
  239. lista.inserirInicio(Dnodo('abc'))
  240. lista.inserirInicio(Dnodo('001'))
  241. lista.inserirInicio(Dnodo('xyz'))
  242. lista.inserirFim(Dnodo('zzz'))
  243. lista.removerInicio()
  244. lista.removerFim()
  245.  
  246. lista.imprimir(True)
  247. '''
  248. '''
  249. l = LDE()
  250. l.inserirFim(Dnodo('X'))
  251. l.inserirFim(Dnodo('Y'))
  252.  
  253. l2 = LDE()
  254. l2.inserirFim(Dnodo('A'))
  255. l2.inserirFim(Dnodo('B'))
  256.  
  257. l.merge(l2)
  258.  
  259. l.imprimir()
  260. '''
  261.  
  262. lista = LDE()
  263. lista.inserirFim(Dnodo('1'))
  264. lista.inserirFim(Dnodo('2'))
  265. lista.inserirFim(Dnodo('3'))
  266.  
  267. nodo = lista.buscar('2')
  268. lista.removerApos(nodo)
  269.  
  270. lista.imprimir() ## deve retornar [1] [2]
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement