Class: Lista

Inherits:
Object
  • Object
show all
Includes:
Enumerable
Defined in:
lib/alimento/lista.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initializeLista

Note:

Constructor de la clase lista

Returns a new instance of Lista



9
10
11
12
13
# File 'lib/alimento/lista.rb', line 9

def initialize
    @cabeza = nil
    @cola = nil
    @size = 0
end

Instance Attribute Details

#cabezaObject

Returns the value of attribute cabeza



5
6
7
# File 'lib/alimento/lista.rb', line 5

def cabeza
  @cabeza
end

#colaObject

Returns the value of attribute cola



5
6
7
# File 'lib/alimento/lista.rb', line 5

def cola
  @cola
end

#sizeObject

Returns the value of attribute size



5
6
7
# File 'lib/alimento/lista.rb', line 5

def size
  @size
end

Instance Method Details

#eachObject

Note:

Método sobrecargado para el correcto funcionamiento del módulo enumerable



181
182
183
184
185
186
187
# File 'lib/alimento/lista.rb', line 181

def each
    aux = @cabeza
    while aux != nil
        yield aux.valor
        aux = aux.siguiente
    end 
end

#extrae_cabezaObject

Note:

Método para la extracción del primer elemento de la lista.

Returns Se devuelve y elimina el nodo situado en la primera posición de la lista.

Returns:

  • Se devuelve y elimina el nodo situado en la primera posición de la lista.



94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# File 'lib/alimento/lista.rb', line 94

def extrae_cabeza
    if !vacia
        if @cabeza == @cola
            aux = @cabeza
            @cabeza = nil
            @cola = nil
        else
            aux = @cabeza
            @cabeza = @cabeza.siguiente
            @cabeza[:anterior] = nil
        end 
        @size = @size - 1
        aux
    end
end

#extrae_colaObject

Note:

Método para la extracción del último elemento de la lista.

Returns Se devuelve y extrae el nodo situado en la última posición de la lista.

Returns:

  • Se devuelve y extrae el nodo situado en la última posición de la lista.



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/alimento/lista.rb', line 112

def extrae_cola
    if !vacia
        if @cola == @cabeza
            aux = @cola
            @cabeza = nil
            @cola = nil
        else
            aux = @cola
            @cola = @cola.anterior
            @cola[:siguiente] = nil
        end 
        @size = @size - 1
        aux
    end
end

#extrae_pos(indice) ⇒ Object

Note:

Método para la extracción del nodo situado en la posición determinada.

Returns Se devuelve y extrae el nodo situado en la posición deseada.

Parameters:

  • Posición

    del nodo deseado para la extracción [Number].

Returns:

  • Se devuelve y extrae el nodo situado en la posición deseada.



131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
# File 'lib/alimento/lista.rb', line 131

def extrae_pos(indice)
    if !vacia
        pos = 0
        aux = @cabeza
        if indice - 1 == 0
            aux = extrae_cabeza
        end
        if indice == size
            aux = extrae_cola
        end
        if indice - 1 > 0 &&  indice < size 
            while pos !=  indice - 1
              pos = pos + 1
              aux = aux.siguiente
            end
            #Cuando encontramos la posición tenemos que hacer los enlaces para que la lista siga funcionando después de la extracción.
            auxAnt = aux.anterior
            auxSig = aux.siguiente
            auxAnt[:siguiente] = auxSig
            auxSig[:anterior] = auxAnt
            @size = @size - 1
        end 
    end
    aux
end

#insertar_cabeza(nodo) ⇒ Object

Note:

Método para insertar un elemento por la cabeza de la lista

Parameters:

  • Recibe

    como parámetro el nodo que queremos insertar.



17
18
19
20
21
22
23
24
25
26
27
28
29
30
# File 'lib/alimento/lista.rb', line 17

def insertar_cabeza(nodo)
    if vacia
        nodo[:siguiente] = nil
        nodo[:anterior] = nil
        @cabeza = nodo
        @cola = nodo
    else
        nodo[:siguiente] = @cabeza
        @cabeza[:anterior] = nodo
        nodo[:anterior] = nil
        @cabeza = nodo
    end
    @size = @size + 1 
end

#insertar_cola(nodo) ⇒ Object

Note:

Método para insertar un elemento por la cola de la lista

Parameters:

  • Recibe

    como parámetro el nodo que queremos insertar.



34
35
36
37
38
39
40
41
42
43
44
45
46
47
# File 'lib/alimento/lista.rb', line 34

def insertar_cola(nodo)
    if vacia
        nodo[:siguiente] = nil
        nodo[:anterior] = nil
        @cabeza = nodo
        @cola = nodo
    else 
        nodo[:siguiente] = nil
        nodo[:anterior] = @cola
        @cola[:siguiente] = nodo
        @cola = nodo
    end
    @size = @size + 1
end

#insertar_mul(nodos, indice) ⇒ Object

Note:

Método para insertar varios elementos a partir de una determinada posición de la lista

Parameters:

  • Recibe

    como parámetro el array de nodos[nodo] que queremos insertar y la posición desde la que se insertarán.



85
86
87
88
89
90
# File 'lib/alimento/lista.rb', line 85

def insertar_mul(nodos, indice)
    for i in 0.. (nodos.length - 1)
        insertar_pos(nodos[i], indice) # Vamos llamando a la función insertar por posición y le pasamos el nodo y aumentando la pos. 
        indice = indice + 1;
    end 
end

#insertar_pos(nodo, indice) ⇒ Object

Note:

Método para insertar un elemento en una posición determinada de la lista.

Parameters:

  • Recibe

    como parámetro el nodo [nodo] que queremos insertar y la posición [Number] que ocupará.



51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
# File 'lib/alimento/lista.rb', line 51

def insertar_pos(nodo, indice)
    pos =  0
    aux = @cabeza
    if (indice - 1) == 0
        insertar_cabeza(nodo) # Si la posición es 0, es lo mismo que insertar por la cabeza.
        indice = 0

    end
    if indice - 1  > 0
        #Mientras no estemos en la posición deseada y tengamos siguiente.
        while(pos != (indice - 1) && (aux.siguiente != nil))
            if pos == (indice - 2) # Paramos una posición antes para poder hacer las conexiones anteriores.
                nodo[:siguiente] = aux.siguiente
                nodo[:anterior] = aux
                aux[:siguiente] = nodo
                pos = pos + 1 
            end
            if pos == (indice - 1) # Terminamos de realizar las conexiones. 
                aux = nodo.siguiente
                aux[:anterior] = nodo
            else
                pos = pos + 1
                aux = aux.siguiente
            end
        end
        @size = @size + 1
    else
        error = "La posicion se encuentra fuera de rango"
        error
    end
end

#to_sObject

Note:

Función para mostrar el contenido de la lista.

Returns Lista formateada en una cadena para su visualización.

Returns:

  • Lista formateada en una cadena para su visualización.



159
160
161
162
163
164
165
166
167
168
# File 'lib/alimento/lista.rb', line 159

def to_s
    aux = @cabeza
    s = ""
    while aux.siguiente != nil
        s += aux.valor.to_s + "\n"
        aux =  aux.siguiente
    end
    s += aux.valor.to_s
    
end

#vaciaObject

Note:

Método para comprobar si la lista se encuentra vacía.

Returns Verdadero en el caso de que la lista no contenga ningún elemento, falso en caso contrario.

Returns:

  • Verdadero en el caso de que la lista no contenga ningún elemento, falso en caso contrario.



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

def vacia
    if size==0
        true
    else 
        false
    end
end