Class: Lista

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/lista.rb,
lib/nutrientesEugenio/version.rb

Overview

Representación de una lista doblemente enlazada de nodos

Author:

  • Eugenio Jose Gonzalez Luis

Since:

  • 1.0.0

Direct Known Subclasses

Menu

Constant Summary collapse

VERSION =

Version de la clase Lista

Since:

  • 1.0.0

"0.1.0"

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#headObject (readonly)

Since:

  • 1.0.0



25
26
27
# File 'lib/lista.rb', line 25

def head
  @head
end

#NodeObject (readonly)

head Nodo en la cabeza de la lista

Returns:

  • (Object)

    the current value of Node



23
24
25
# File 'lib/lista.rb', line 23

def Node
  @Node
end

#tailObject (readonly)

Since:

  • 1.0.0



25
26
27
# File 'lib/lista.rb', line 25

def tail
  @tail
end

Instance Method Details

#eachNode

Método para la enumeración de los nodos de la lista

Returns:

  • (Node)

    devuelve los nodos que conforman la lista

Since:

  • 1.0.0



46
47
48
49
50
51
52
# File 'lib/lista.rb', line 46

def each
    x = @head
    while(x != nil)
        yield x.value
        x = x.next
    end
end

#ordenarvector

Ordena los alimentos en base a sus calorias

Returns:

  • (vector)

    devuelve un vector ordenado por calorias

Since:

  • 1.0.0



120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
# File 'lib/lista.rb', line 120

def ordenar
    rvector = []
    j = 0
    each do
        |i| rvector[j] = i
        j +=1
    end
    begin
    intercambio = false
    (rvector.count-1).times do |i|
            if rvector[i].sal > rvector[i+1].sal  # Si se cumple la condición, entonces intercambiamos.
                    rvector.swap(i,i+1)
                    intercambio = true
            end # if
            next
    end # times
    end while intercambio == true 
    rlist = Lista.new()
    rlist.push(rvector)
    rlist
end

#ordenar_porvector

Ordena los alimentos en base a un bloque

Returns:

  • (vector)

    devuelve un vector ordenado por el bloque dado

Since:

  • 1.0.0



145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
# File 'lib/lista.rb', line 145

def ordenar_por
    rvector = []
    j = 0
    each do
        |i| rvector[j] = i
        j +=1
    end
    begin
    intercambio = false
    (rvector.count-1).times do |i|
            x = yield rvector[i]
            y = yield rvector[i+1]
            if x > y  # Si se cumple la condición, entonces intercambiamos.
                    rvector.swap(i,i+1)
                    intercambio = true
            end # if
            next
    end # times
    end while intercambio == true 
    rlist = Lista.new()
    rlist.push(rvector)
    rlist
end

#pop_headany?

Extracción del primer nodo de la lista

Returns:

  • (any, nil)

    devuelve el valor guardado en el primer nodo o nil si no hay nodos en la lista

Since:

  • 1.0.0



82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
# File 'lib/lista.rb', line 82

def pop_head()
    if(@head == nil)
        return nil
    end
    
    x = @head
    @head = @head.next
    if(@head == nil)
        @tail = nil
    else
        @head.prev = nil
        x.next = nil
    end
    x.value
end

#pop_tailany?

Extracción del último nodo de la lista

Returns:

  • (any, nil)

    devuelve el valor guardado en el último nodo o nil si no hay nodos en la lista

Since:

  • 1.0.0



101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
# File 'lib/lista.rb', line 101

def pop_tail()
    if(@tail == nil)
        return nil
    end
    
    x = @tail
    @tail = @tail.prev
    if(@tail == nil)
        @head = nil
    else
        @tail.next = nil
        x.prev = nil
    end
    x.value
end

#push(x) ⇒ Node

Inserción por la cola de la lista de varios nodos

Parameters:

  • x (Array<any>)

    valores de los nuevos nodos

Returns:

  • (Node)

    Devuelve el tail

Since:

  • 1.0.0



74
75
76
77
78
# File 'lib/lista.rb', line 74

def push(x)
    x.each{
        |i| push_tail(i)
    }
end

#push_head(x) ⇒ Node

Inserción por la cabeza de la lista

Parameters:

  • x (any)

    valor del nuevo nodo

Returns:

  • (Node)

    Devuelve el head

Since:

  • 1.0.0



31
32
33
34
35
36
37
38
39
40
41
# File 'lib/lista.rb', line 31

def push_head(x)
    if(@head == nil)
        @head = Node.new(x, nil, nil)
        @tail = @head
    else
        nuevo = Node.new(x, nil, nil)
        nuevo.next= @head
        @head.prev = nuevo
        @head = nuevo
    end
end

#push_tail(x) ⇒ Node

Inserción por la cola de la lista

Parameters:

  • x (any)

    valor del nuevo nodo

Returns:

  • (Node)

    Devuelve el tail

Since:

  • 1.0.0



58
59
60
61
62
63
64
65
66
67
68
# File 'lib/lista.rb', line 58

def push_tail(x)
    if(@tail == nil)
        @tail = Node.new(x, nil, nil)
        @head = @tail
    else
        nuevo = Node.new(x, nil, nil)
        nuevo.prev = @tail
        @tail.next = nuevo
        @tail = nuevo
    end
end

#to_sString

Convierte el objeto a una cadena de caracteres

Returns:

  • (String)

    devuelve la lista como un string

Since:

  • 1.0.0



172
173
174
175
176
# File 'lib/lista.rb', line 172

def to_s
    s = ""
    each {|i| s += "#{i.to_s}\n"}
    s
end