-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathListasHanoi.cpp
291 lines (252 loc) · 8.41 KB
/
ListasHanoi.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
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
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
#include "ListasHanoi.hpp"
using namespace std;
using namespace Hanoi;
namespace Hanoi{
//
// FUNCIONES DENTRO DE LA CLASE LISTASTORRESHANOI
//
//Constructor del elemento ListaTorresHanoi
ListaTorreshanoi::ListaTorreshanoi()
{
_n=0;
_cabeza = NULL;
_cola = NULL;
_cursor = NULL;
}
//Destructor del elemento TorresHanoi
ListaTorreshanoi::~ListaTorreshanoi()
{
liberarMemoria();
}
//Funciones de lectura/Acceso
bool ListaTorreshanoi::vacia() //Devuelve True o False dependiendo si la lista está vacia o no
{
if (longitud()==0)
return true;
else
return false;
}
int ListaTorreshanoi::longitud() { return _n; } //Devuelve el tamaño de la lista
TorresHanoi &ListaTorreshanoi::obtenerMomento() { return _cursor->Momento; } //Devuelve el elemento TorresHanoi que se encuentre en el cursor
int ListaTorreshanoi::obtenerProfundidad() { return _cursor->profundidad; } //Devuelve la profundidad necesaria desde el orgigen hasta el nodo actual
NodoLista * ListaTorreshanoi::obtenerPadre() { return _cursor->padre; } //Devuelve el puntero al nodo padre del nodo actual
NodoLista * ListaTorreshanoi::obtenerCursor() { return _cursor; } //Devuelve el puntero del nodo actual
//Funciones de Modificación
void ListaTorreshanoi::liberarMemoria() // FUNCIÓN LIBERARMEMORIA (Funciones de Modificacion): LIMPIA LA LISTA
{
if (not vacia())
{
while (_cabeza != NULL) // VA AVANZANLO LA CABEZA HACIA DELANTE, ELIMINANDO DEL PRINCIPIO AL FINAL DE LA COLA
{
_cursor = _cabeza;
_cabeza = _cabeza->siguiente;
delete _cursor;
}
_n = 0;
_cola = _cursor = NULL;
}
}
void ListaTorreshanoi::guardarMomento(TorresHanoi &MomentoAGuardar, int profundidadAGuardar, NodoLista * padreAGuardar) //FUNCIÓN GUARDARMOMENTO (Funciones de Modificacion): CAMBIA EL VALOR DEL MOMENTO EN DONDE ESTÉ EL CURSOR
{
_cursor->Momento=MomentoAGuardar;
_cursor->profundidad=profundidadAGuardar;
_cursor->padre=padreAGuardar;
}
bool ListaTorreshanoi::insertarAlPrincipio(TorresHanoi &MomentoAGuardar, int profundidadAGuardar, NodoLista * padreAGuardar) //FUNCIÓN INSERTARALPRINCIPIO (Funciones de Modificación): INSERTA EN UN NUEVO NODO EL VALOR DE MOMENTO Y LO COLOCA AL PRINCIPIO DE LA LISTA
{
NodoLista *nuevo;
nuevo = new NodoLista;
if (nuevo == NULL) // Si no a podido reservarse la memoria se devuelve false
{
return false;
}else{
nuevo->Momento=MomentoAGuardar;
nuevo->profundidad=profundidadAGuardar;
nuevo->padre=padreAGuardar;
if(vacia())
{
nuevo->siguiente=NULL;
_cabeza=nuevo;
_cursor=nuevo;
_cola=nuevo;
_n++;
}else{
nuevo->siguiente=_cabeza;
_cabeza=nuevo;
_cursor=nuevo;
_n++;
}
return true;
}
}
bool ListaTorreshanoi::insertarAlFinal(TorresHanoi &MomentoAGuardar, int profundidadAGuardar, NodoLista * padreAGuardar) //FUNCIÓN INTERTARALFINAL (Funciones de Modificacion): INSERTA EN UN NUEVO NODO EL VALOR DE MOMENTO Y LO COLOCA AL FINAL DE LA LISTA
{
NodoLista *nuevo;
nuevo = new NodoLista;
if (nuevo == NULL) // Si no a podido reservarse la memoria se devuelve false
{
return false;
}else{
nuevo->Momento=MomentoAGuardar;
nuevo->profundidad=profundidadAGuardar;
nuevo->padre=padreAGuardar;
nuevo->siguiente=NULL;
if(vacia())
{
_cabeza=nuevo;
_cursor=nuevo;
_cola=nuevo;
_n++;
}else{
_cola->siguiente = nuevo;
_cola=_cola->siguiente;
_n++;
}
return true;
}
}
bool ListaTorreshanoi::insertarNodoAlPrincipio(NodoLista *nuevo) //FUNCIÓN INSERTARALPRINCIPIO (Funciones de Modificación): INSERTA EN UN NUEVO NODO EL VALOR DE MOMENTO Y LO COLOCA AL PRINCIPIO DE LA LISTA
{
if (nuevo == NULL) // Si no a podido reservarse la memoria se devuelve false
{
return false;
}else{
if(vacia())
{
nuevo->siguiente=NULL;
_cabeza=nuevo;
_cursor=nuevo;
_cola=nuevo;
_n++;
}else{
nuevo->siguiente=_cabeza;
_cabeza=nuevo;
_cursor=nuevo;
_n++;
}
return true;
}
}
bool ListaTorreshanoi::insertarNodoAlFinal(NodoLista *nuevo) //FUNCIÓN INTERTARALFINAL (Funciones de Modificacion): INSERTA EN UN NUEVO NODO EL VALOR DE MOMENTO Y LO COLOCA AL FINAL DE LA LISTA
{
if (nuevo == NULL) // Si no a podido reservarse la memoria se devuelve false
{
return false;
}else{
nuevo->siguiente=NULL;
if(vacia())
{
_cabeza=nuevo;
_cursor=nuevo;
_cola=nuevo;
_n++;
}else{
_cola->siguiente = nuevo;
_cola=_cola->siguiente;
_n++;
}
return true;
}
}
bool ListaTorreshanoi::borrarActual(int logico) //FUNCIÓN BORRAR (Funciones de Modificacion): BORRA EL ELEMENTO ACTUAL DE LA LISTA
{
if (vacia()) // Si la lista está vacia no se borra nada
{
return false;
} else {
NodoLista *buscado, *anterior;
buscado = _cabeza;
if (buscado == _cursor) // Se verifica si el elemento a eliminar está al principio de la lista (**)
{
if (buscado == _cola) // (**), si es así y tambien el el ultimo (osea, solo hay un elemento) se establece n a 0, se pone todo a NULL y se elimina
{
_cabeza = _cola = _cursor = NULL;
_n = 0;
if (logico==1)
delete buscado;
return true;
} else { // (**), si es así y hay más elementos, entonces movemos la cabeza y el cursor al siguiente elemento, despues borramos el enlace con la lista, disminuimos n y borramos el nodo.
_cabeza = _cabeza->siguiente;
_cursor = _cabeza;
buscado->siguiente = NULL;
if (logico==1)
delete buscado;
_n--;
return true;
}
} else { //Se verifica que el elemento a eliminar no está al principio de la lista (^^)
anterior = buscado; //anterior contiene la cabeza
buscado = buscado->siguiente; //buscado contiene el 2º elemento de la lista
while(buscado!=NULL) //Mientras no se llegue al final de la lista estamos en bucle
{
if (buscado == _cursor) // Se verifica que ya estamos en la posición del cursor (¨¨) (^^)
{
if (_cursor == _cola) // Se verifica que el elemento es el ultimo (++) (¨¨) (^^)
{
// Si se cumple (++) (¨¨) (^^), entonces cola y cursor pasa a ser el anterior, se apunta el siguiente de cola a NULL, se borra buscado y se disminuye n
_cola = anterior;
_cola->siguiente = NULL;
_cursor = anterior;
if (logico==1)
delete buscado;
_n--;
return true;
} else { // Si se cumple (¨¨) (^^), pero el elemento no es el ultimo (osea, el cursor esta en medio de 2 nodos)
// Se mueve el cursor al siguiente y se apunta el puntero del nodo anterior a donde está el cursor, se borra buscado y de disminuye n
_cursor = _cursor->siguiente;
anterior->siguiente = _cursor;
if (logico==1)
delete buscado;
_n--;
return true;
}
} else { // Si todabía no se a llegado a donde está el cursor, se sigue desplazando a la siguiente posición
anterior = buscado;
buscado = buscado->siguiente;
}
}
}
}
return false; // Si el programa llega a este punto, no se a podido borrar
}
void ListaTorreshanoi::cursorAlPrincipio() // FUNCIÓN CURSORALPRINCIPIO (Funciones de Modificacion): Mueve el cursor al principio de la lista
{
_cursor=_cabeza;
}
void ListaTorreshanoi::cursorAlFinal() // FUNCIÓN CURSORALFINAL (Funciones de Modificacion): Mueve el cursor al final de la lista
{
_cursor=_cola;
}
bool ListaTorreshanoi::siguienteMomento() // FUNCIÓN SIGUIENTE (Funciones de Modificacion): Mueve el cursor a la siguiente posición
{
if(!vacia()) //Si la lista no está vacía
{
if(_cursor==_cola) // Si se llega al final, se vuelve al principio de la lista
{
cursorAlPrincipio();
} else { // Si no se llega al final, se desplaza a la siguiente posición
_cursor = _cursor->siguiente;
}
return true;
} else {
return false;
}
}
//Funciones de visualización
void ListaTorreshanoi::verLista() // FUNCIÓN VERLISTA (Funciones de visualización): Muestra la lista completamente
{
if (!vacia()) // Si no está vacía
{
int n = longitud();
cursorAlPrincipio();
cout << endl << " * Resultado: " << endl << endl;
for (int i = 1; i<= n; i++)
{
cout << obtenerMomento() << endl; // Se usa el extractor heredado de la clase TorresHanoi
siguienteMomento();
}
}
else
cout << " !* La lista esta vacia." << endl;
}
};