class Lista
Clase gestora de Lista
doblemente enlazada.
Attributes
cabeza[RW]
cola[RW]
total[RW]
Public Class Methods
Public Instance Methods
<<(p)
click to toggle source
Sobrecarga del operador << para insertar una pregunta al final de la lista.
# File lib/examen/lista.rb, line 39 def <<(p) raise TypeError, "Esperada pregunta para inserción" unless p.is_a? (Pregunta) if (@total == 0) @cabeza = Nodo.new(p, nil, nil) @cola = @cabeza else @cola.next = Nodo.new(p, nil, @cola) @cola = @cola.next @cola.value end @total += 1 end
each() { |value| ... }
click to toggle source
Definición del método :each para el manejo de métodos del módulo Enumerable.
# File lib/examen/lista.rb, line 81 def each aux = @cabeza while (aux != nil) do yield aux.value aux = aux.next end end
inv(&block)
click to toggle source
Devuelve la lista actual invertida.
# File lib/examen/lista.rb, line 90 def inv(&block) block = ->(x) {true} if !block_given? list = invertir(@cabeza, &block) list.pop return nil if list.total == 0 list end
pop()
click to toggle source
Extrae la cabeza de la lista actualmente. Si la lista está vacía genera una excepción (IndexError).
# File lib/examen/lista.rb, line 21 def pop raise IndexError, "Lista vacía, imposible hacer pop" unless @total > 0 head = nil if @cola == @cabeza head = @cabeza @cola = @cabeza = nil head.next = head.prev = nil else head = @cabeza @cabeza = @cabeza.next @cabeza.prev = nil head.next = nil end @total -= 1 head.value end
push_back(*preguntas)
click to toggle source
Inserta una o varias preguntas sucesivamente.
# File lib/examen/lista.rb, line 53 def push_back(*preguntas) preguntas.each do |p| if (@total == 0) @cabeza = Nodo.new(p, nil, nil) @cola = @cabeza else @cola.next = Nodo.new(p, nil, @cola) @cola = @cola.next end @total += 1 end preguntas end
Private Instance Methods
invertir(actual, &block)
click to toggle source
Método auxiliar utilizado para invertir la lista mediante recursividad.
# File lib/examen/lista.rb, line 99 def invertir(actual, &block) return Lista.new(Pregunta.new(:text => "dummy", :right => "dummy", :distractors => ["dummy"])) if (actual == nil) list = invertir(actual.next, &block) list << actual.value if block[actual.value] list end