# Clase lista doblemente enlazada # @author alu0100880625 # @attr_reader [Node] head struct que almacena el nodo anterior (:prev), el dato del actual (:value) y el nodo siguiente (:next) al inicio # @attr_reader [Node] tail struct que almacena el nodo anterior (:prev), el dato del actual (:value) y el nodo siguiente (:next) al final class Dll include Enumerable Node=Struct.new(:prev,:data,:next) attr_reader :head, :tail # Método que instancia un objeto de la clase (una lista vacia con head y tail inicializados a nil) def initialize(&block) @head=nil @tail=nil if(block_given?) @nombre_lista="" instance_eval(&block) end end # Método que crea un nodo que contenga el dato y lo inserta en la lista por el inicio # @param [Data] data dato que se desea insertar def insert_front(data) if(@head==nil) aux=Node.new(nil,data,nil) @head=aux @tail=aux else aux=Node.new(nil,data,@head) @head[:prev]=aux @head=aux end end # Método que crea un nodo que contenga el dato y lo inserta en la lista por el final # @param [Data] data dato que se desea insertar def insert_back(data) if(@tail==nil) aux=Node.new(nil,data,nil) @tail=aux @head=aux else aux=Node.new(@tail,data,nil) @tail[:next]=aux @tail=aux end end # Método que extrae un dato de la lista por el inicio # @return [Data] dato extraido def extract_front aux=@head[:data] @head=@head[:next] if(@head==nil) @tail=nil else @head[:prev]=nil end aux end # Método que extrae un dato de la lista por el final # @return [Data] dato extraido def extract_back aux=@tail[:data] @tail=@tail[:prev] if(@ŧail==nil) @head=nil else @tail[:prev]=nil end aux end # Método necesario para el módulo Enumerable def each aux=@head while(aux!=nil) yield aux[:data] aux=aux[:next] end end def nombre(options) @nombre_lista = "#{options[:nombre]}" end def elemento(ele) insert_back(ele) end def to_s aux=@head str="" aux2=self.instance_variables baux=false aux2.each do |x| if(x==:@nombre_lista) baux=true end end if(baux==true) str+="-#{@nombre_lista}\n" while(aux!=nil) str+=aux[:data].to_s aux=aux[:next] end str end end end