-
Notifications
You must be signed in to change notification settings - Fork 0
/
lista.h
222 lines (181 loc) · 5.14 KB
/
lista.h
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
#ifndef LISTA_H_
#define LISTA_H_
#include "nodo.h"
template <typename T>
class Lista {
private:
Nodo<T> * primero;
int tamanio;
Nodo<T>* cursor;
public:
/**
* pre:
* pos: crea una lista vacia
*/
Lista();
/**
* pre:
* pos: elimina la memoria de la lista y los datos
*/
virtual ~Lista();
/**
* pre:
* pos: indica si la Lista tiene algún elemento.
*/
bool estaVacia();
/*
* post: devuelve la cantidad de elementos que tiene la Lista.
*/
int getTamanio();
/**
* pre: -
* pos: agrega el elemento al final de la Lista, en la posición:
* contarElementos() + 1.
*/
void agregar(T elemento);
void agregarAlInicio(T elemento);
/**
* pre: posición pertenece al intervalo: [1, contarElementos() + 1]
* pos: agrega el elemento en la posición indicada.
*/
void agregar(T elemento, int posicion);
/*
* pre : posición pertenece al intervalo: [1, contarElementos()]
* post: remueve de la Lista el elemento en la posición indicada.
*/
void remover(int posicion);
/**
* pre : posición pertenece al intervalo: [1, contarElementos()]
* pos: devuelve el dato de la posicion
*/
T obtener(int posicion);
/**
* pre : posición pertenece al intervalo: [1, contarElementos()]
* pos: cambia el elemento de la posicion
*/
void cambiar(T elemento, int posicion);
/*
* post: deja el cursor de la Lista preparado para hacer un nuevo
* recorrido sobre sus elementos.
*/
void iniciarCursor();
/*
* pre : se ha iniciado un recorrido (invocando el método
* iniciarCursor()) y desde entonces no se han agregado o
* removido elementos de la Lista.
* post: mueve el cursor y lo posiciona en el siguiente elemento
* del recorrido.
* El valor de retorno indica si el cursor quedó posicionado
* sobre un elemento o no (en caso de que la Lista esté vacía o
* no existan más elementos por recorrer.)
*/
bool avanzarCursor();
/*
* pre : el cursor está posicionado sobre un elemento de la Lista,
* (fue invocado el método avanzarCursor() y devolvió true)
* post: devuelve el elemento en la posición del cursor.
*
*/
T obtenerCursor();
private:
/*
* pre : posición pertenece al intervalo: [1, contarElementos()]
* post: devuelve el nodo en la posición indicada.
*/
Nodo<T> * obtenerNodo(int posicion);
void validarPosicion(int posicion);
};
template <typename T> Lista<T>::Lista() {
this->primero = NULL;
this->tamanio = 0;
this->cursor = NULL;
}
template <typename T> Lista<T>::~Lista() {
while (this->primero != NULL) {
Nodo<T> * aBorrar = this->primero;
this->primero = aBorrar->getSiguiente();
delete aBorrar;
}
}
template <typename T> bool Lista<T>::estaVacia() {
//return (this->primero == NULL);
return (this->tamanio == 0);
}
template <typename T> int Lista<T>::getTamanio() {
return this->tamanio;
}
template <typename T> void Lista<T>::agregar(T elemento) {
this->agregar(elemento, this->getTamanio() + 1);
}
template <typename T> void Lista<T>::agregarAlInicio(T elemento) {
this->agregar(elemento, 1);
}
template <typename T> void Lista<T>::agregar(T elemento, int posicion) {
validarPosicion(posicion);
Nodo<T>* nuevo = new Nodo<T>(elemento);
if (posicion == 1) {
nuevo->setSiguiente(this->primero);
this->primero = nuevo;
} else {
Nodo<T> * anterior = this->obtenerNodo(posicion - 1);
nuevo->setSiguiente( anterior->getSiguiente());
anterior->setSiguiente( nuevo );
}
this->tamanio++;
}
template <typename T> Nodo<T> * Lista<T>::obtenerNodo(int posicion) {
//validarPosicion(posicion);
Nodo<T> * actual = this->primero;
for(int i = 1; i < posicion; i++) {
actual = actual->getSiguiente();
}
return actual;
}
template <typename T> void Lista<T>::validarPosicion(int posicion) {
if ((posicion < 1) ||
(posicion > this->tamanio + 1)) {
throw "La posicion debe estar entre 1 y tamaño + 1";
}
}
template <typename T> void Lista<T>::remover(int posicion) {
validarPosicion(posicion);
Nodo<T> * removido;
if (posicion == 1) {
removido = this->primero;
this->primero = removido->getSiguiente();
} else {
Nodo<T> * anterior = this->obtenerNodo(posicion -1);
removido = anterior->getSiguiente();
anterior->setSiguiente( removido->getSiguiente());
}
delete removido;
this->tamanio--;
}
template <typename T> T Lista<T>::obtener(int posicion) {
validarPosicion(posicion);
return this->obtenerNodo(posicion)->getDato();
}
template <typename T> void Lista<T>::cambiar(T elemento, int posicion) {
validarPosicion(posicion);
this->obtenerNodo(posicion)->setDato(elemento);
}
template<class T> void Lista<T>::iniciarCursor() {
this->cursor = NULL;
}
template<class T> bool Lista<T>::avanzarCursor() {
if (this->cursor == NULL) {
this->cursor = this->primero;
} else {
this->cursor = this->cursor->getSiguiente();
}
/* pudo avanzar si el cursor ahora apunta a un nodo */
return (this->cursor != NULL);
}
template<class T> T Lista<T>::obtenerCursor() {
T elemento;
if (this->cursor != NULL) {
elemento = this->cursor->getDato();
}
return elemento;
}
#endif /* LISTA_H_ */