Sha256: 97441a9f8b81e0eac8e1b1d0a43233b56d7732cd361242162d4b267143739f0c

Contents?: true

Size: 1.81 KB

Versions: 1

Compression:

Stored size: 1.81 KB

Contents

# encoding: utf-8
# Este fichero contiene la descripción de una
# lista doblemente enlazada y sus nodos.
#
# @author Sara Revilla

module Alimento
  # Este struct describe los nodos de la lista.
  Node = Struct.new(:value, :next, :prev)

  # Esta clase representa la lista, tiene cabeza y cola.
  class List
    include Enumerable
    attr_reader :head, :tail
    
    # Inicializa las variables de instancia
    def initialize 
      @head
      @tail
    end

    # Devuelve un string con la lista formateada correctamente
    def to_s
      s = "("
      node = @head
      while !node.nil?
        s += "#{node.value}"
        if !node.next.nil?
          s += ","
        end
        node = node.next
      end
      s += ")"
      s
    end

    # Toma un valor determinado, crea un nodo para él, y lo 
    # inserta por la cola de la lista.
    def insert(value)
      node = Node.new(value, nil, nil)
      # Si la lista está vacía
      if @head.nil? and @tail.nil?
        @head = @tail = node
      else
        @tail.next = node
        node.prev = @tail
        @tail = node
      end
    end

    # Elimina el nodo que se encuentra en la cabeza y devuelve el valor
    def pop_head
      if !(@head.nil?)
        node = @head
        @head = node.next
        node.next.prev = nil
        node.next = nil
        node.value
      end
    end

    # Elimina el nodo que se encuentra en la cola y devuelve el valor
    def pop_tail
      if !(@tail.nil?)
        node = @tail
        @tail = node.prev
        node.prev.next = nil
        node.prev = nil
        node.value
      end
    end

    # Necesario para el mixin Enumerable
    # Iteración sobre los elementos de la lista, de cabeza a cola
    def each
      node = @head
      while !node.nil?
        yield node.value
        node = node.next
      end
    end  
  end

end  

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
alimento-alu0100947441-0.1.1 lib/alimento/list.rb