Lista Ligada - Versão Recursiva

Publicado por Thiago Baldim (última atualização em 09/08/2016)

[ Hits: 2.332 ]

Homepage: http://ubuntu4free.wordpress.com

Download List.py




Bom galera, faz uns anos que não entrava no Viva o Linux. Parei de trabalhar com servidores Linux e hoje sou desenvolvedor Python.

E me deparei com um código em Python que fiz a muitos anos. Para ser mais preciso, seis anos...

E resolvi criar um novo arquivo script de listas ligadas, usando Python 2.7. Usando técnicas de programação funcional para listas ligadas, que acabei aprendendo. Basicamente, isso mostra uma evolução que tive.

Fiquem a vontade para comentar ;)

  



Esconder código-fonte

'''
Created on 14/07/2016

@author: thiago
'''

class Empty:
    def __init__(self):
        self.head = None
        self.tail = None
    def isEmpty(self):
        return True
    #Metodo aplicado a funcoes como len
    def __len__(self):
        return 0
    #Metodo aplicado a representacao como string
    def __str__(self):
        return 'Empty'
    #Metodo aplicado a representacao como objeto
    def __repr__(self):
        return 'Empty List'
    
class NonEmpty(Empty):
    def __init__(self, obj):
        self.obj = obj
    def isEmpty(self):
        return False
    def __str__(self):
        return str(self.obj)
    def __repr__(self):
        return self.obj

class List(Empty):
    def __init__(self, obj):
        self.len = len(obj)
        self.head = NonEmpty(obj[0])
        self.tail = List(obj[1:]) if obj[1:] else Empty()
    
    def isEmpty(self):
        return False
    
    def insert(self, obj):
        self.len += len(obj)
        if not self.tail.isEmpty():
            self.tail.insert(obj)
        else:
            self.tail = List(obj)
        
    def __len__(self):
        return self.len
    
    def __str__(self):
        return str(self.head) + ' -> ' + str(self.tail)
    
    def __repr__(self):
        return self.head + ' -> tail'
    #metodo aplicado para List[int]
    def __getitem__(self, index):
        if index > len(self):
            raise IndexError
        return self if index == 0 else self.tail[index-1]
    #metodo aplicado para del List[Int]
    def __delitem__(self, index):
        if index > len(self):
            raise IndexError
        self.len -= 1
        if index == 0:
            self.head = self.tail.head
            self.tail = self.tail.tail
        else:
            self.tail.__delitem__(index - 1)
            if self.tail.head == None:
                self.tail = Empty()
    #metodo aplicado para soma de duas listas        
    def __add__(self, obj):
        self[len(self) - 1].tail = obj
        return self
        

#Exemplos de teste

lista1 = List([1,2,3,4])#A classe deve receber algo do tipo Seq
lista2 = List([99,34,11])

print lista1 #1 -> 2 -> 3 -> 4 -> Empty

print lista1[2] #3 -> 4 -> Empty

print lista1[2].head #3

print len(lista1) #4

del lista1[3]

print lista1 #1 -> 2 -> 3 -> Empty

print len(lista1) #3 

print lista2 #99 -> 34 -> 11 -> Empty

print lista1 + lista2 #1 -> 2 -> 3 -> 99 -> 34 -> 11 -> Empty


Scripts recomendados

"Executar" - programa útil que executa comandos com histórico. PyGtk

Algoritmo de Euclides estendido em Python3

Python Challenge (2)

calculadora em python(final)

numero magico 1089


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts