#Kapil Ashok Melwani #alu0100883473 #Lenguajes y Paradigmas de la Programacion #Universidad de La Laguna #Estructura para nodos la cual contiene # ==== Atributos # # * +:value+ - Valor del nodo # * +:next+ - Nodo siguiente # * +:prev+ - Nodo previo Node = Struct.new(:value, :next, :prev) # ==== Clase Lista la cual contiene una Lista Doblemente Enlazada # ==== Funciones # # * +initialize()+ - Inicializamos el @top y el @fin de la lista # * +each()+ - Para recorrer cada nodo de la lista # * +insert_beggining()+ - Insertamos un nodo en el inicio de la lista # * +insert_end()+ - Insertamos un nodo en el fin de la lista # * +extract_beggining()+ - Extraemos un nodo del inicio de la lista # * +extract_end()+ - Extraemos un nodo del fin de la lista # * +many_insertions_in_beggining()+ - Insertamos vector de nodos en el inicio de la lista # * +many_insertions_in_end()+ - Insertamos vector de nodos en el fin de la lista class Lista include Enumerable attr_accessor :top, :fin #Getter de top y fin con permisos de lectura y escritura #Funcion que actua como constructor de la clase inicializando @top y @fin a nil ya que la lista esta vacia # ==== Atributos # # * +@top+ - Inicio de la lista # * +@fin+ - Fin de la lista def initialize() @top = nil @fin = nil end #Funcion que sirve para recorrer los elementos de la lista # ==== Atributos # # * +@aux+ - Estara inicializado al @top de la lista def each aux = @top while aux!=nil yield aux.value aux = aux.next end end #Funcion que sirve para realizar inserciones de nodos en el inicio de la lista #Si la lista esta vacia, top y fin seran iguales #Si la lista no esta vacia arrastramos los elementos hacia la derechae insertamos # ==== Atributos # # * +valor+ - Valor del nodo a insertar # * +element+ - Nodo a insertar # * +helper+ - Elemento auxiliar para insertar elementos en el inicio def insert_beggining (valor) element = Node.new(valor, nil, nil) if(@top == nil) @top = element @fin = element @top.next = nil @top.prev = nil elsif helper = @top @top = element @top.next = helper helper.prev = @top end end #Funcion que sirve para realizar inserciones de nodos en el final de la lista #Si la lista esta vacia, top y fin seran iguales #Si la lista no esta vacia arrastramos los elementos hacia la izquierda e insertamos # ==== Atributos # # * +valor+ - Valor del nodo a insertar # * +element+ - Nodo a insertar # * +helper+ - Elemento auxiliar para insertar elementos en el inicio def insert_end (valor) element = Node.new(valor, nil, nil) if(@top==nil) @top = element @fin = element @top.next = nil @top.prev = nil @fin.next = nil @fin.prev = nil elsif helper = @fin @fin = element @fin.prev = helper helper.next = @fin @fin.next = nil end end #Funcion que sirve para realizar extracciones de elementos del inicio de la lista #Si la lista esta vacia, no se podra sacar nada #Si la lista no esta vacia sacamos el elemento y arrastramos hacia la derecha # ==== Atributos # # * +helper+ - Elemento auxiliar para insertar elementos en el inicio def extract_beggining() if(@top == nil) return nil elsif helper = @top @top = @top.next return helper.value end end #Funcion que sirve para realizar extracciones de elementos del final de la lista #Si la lista esta vacia, no se podra sacar nada #Si la lista no esta vacia sacamos el elemento y arrastramos hacia la izquierda # ==== Atributos # # * +helper+ - Elemento auxiliar para insertar elementos en el inicio def extract_end() if(@top == nil) return nil elsif helper = @fin @fin = @fin.prev return helper.value end end #Funcion que sirve para realizar una insercion de un vector de elements en la lista #Para ello, recorremos los elementos del vector y llamamos a la funcion de insercion en el inicio #de forma recursiva # ==== Atributos # # * +elements+ - Vector de elementos a insertar en la lista def many_insertions_in_beggining (elements) i=0 while i <= (elements.length-1) do self.insert_beggining(elements[i]) i += 1 end end #Funcion que sirve para realizar una insercion de un vector de elements en la lista #Para ello, recorremos los elementos del vector y llamamos a la funcion de insercion en el final #de forma recursiva # ==== Atributos # # * +elements+ - Vector de elementos a insertar en la lista def many_insertions_in_end (elements) i=0 while i <= (elements.length-1) do self.insert_end(elements[i]) i += 1 end end end