class Lista

Clase gestora de Lista doblemente enlazada.

Attributes

cabeza[RW]
cola[RW]
total[RW]

Public Class Methods

new(p) click to toggle source

Instancia de la clase Lista a partir de una Pregunta.

# File lib/examen/lista.rb, line 13
def initialize(p)
  raise TypeError, "Esperada pregunta como parámetro de entrada" unless p.is_a? (Pregunta)
  @cabeza = Nodo.new(p, nil, nil)
  @cola = @cabeza
  @total = 1
end

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
to_s() click to toggle source

Definición del Metotodo to_s, para la clase Lista.

# File lib/examen/lista.rb, line 68
def to_s
  aux = @cabeza
  s = ''
  i = 1
  while (aux != nil) do
    s += "#{i}.-) #{aux.value}\n"      
    aux = aux.next
    i += 1
  end
  s
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