# Clase auxiliar que representa un nodo en Lista # [Parámetros] # * valor : Elemento a guardar # * siguiente : Elemento siguiente de la Lista # * anterior : Elemento anterior de la Lista Nodo = Struct.new(:valor,:siguiente,:anterior) class Lista include Enumerable #Constructor. No recibe parámetros. La creación de una lista es siempre vacia. def initialize(&block) @cabecera = nil @cola = nil if block_given? instance_eval &block end end #Comprobando si la lista tiene al menos un elemento o no. def vacia if @cabecera == nil return true end return false end #Insertando un elemento o un array de elementos en la cabeza de la lista. def insertar(elemento) if !elemento.is_a?Array if vacia @cabecera = Nodo.new(elemento,nil,nil) @cola = @cabecera elsif aux = Nodo.new(elemento,@cabecera,nil) @cabecera.anterior = aux @cabecera = aux end else elemento.each{|e| if vacia @cabecera = Nodo.new(e,nil,nil) @cola = @cabecera elsif aux = Nodo.new(e,@cabecera,nil) @cabecera.anterior = aux @cabecera = aux end } end end #Extrayendo el primer elemento de la lista(cabecera). def extraer aux = nil if !vacia aux = @cabecera @cabecera = @cabecera.siguiente end return aux.valor end #Calculo del tamaño de la lista. def size tam_lista = 0 aux = @cabecera while aux != nil tam_lista = tam_lista + 1 aux = aux.siguiente end tam_lista end #Representacion en string de la lista usando los metodos to_s de los elementos que contiene. Empieza desde la cabecera. def to_s aux = @cabecera cadena = "" while aux != nil cadena = cadena + "#{aux.valor.to_s}->" aux = aux.siguiente end cadena = cadena + "nil" end #Representacion en string de la lista usando los metodos to_s de los elementos que contiene. Empieza desde la cola. def to_s_inv aux = @cola cadena = "" while aux != nil cadena = cadena + "#{aux.valor.to_s}->" aux = aux.anterior end cadena = cadena + "nil" end #Método que recorre la lista desde la cabecera. Recibe un bloque como argumento. Es necesario para incluir el modulo Enumerable. def each aux = @cabecera while (aux != nil) do yield aux.valor aux = aux.siguiente end end def elemento(e) insertar(e) end end