-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlista.h
143 lines (100 loc) · 3.18 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
#ifndef LISTA_H
#define LISTA_H
#include <iostream>
#include "nodo.h"
template <typename Tipo>
class Lista {
private:
// Atributos
Nodo<Tipo>* primero;
int cantidad;
public:
// Metodos
// pre: -
// pos: CONSTRUCTOR de la lista
Lista();
// pre: posicion menor al largo de la lista (cantidad)
// pos: da de alta un dato en un posicion en particular
void alta(Tipo d, int pos);
// pre: posicion menor al largo de la lista (cantidad)
// pre: devuelve el dato contenido en el nodo de una posicion en particular
Tipo consulta(int pos);
// pre: posicion menor al largo de la lista (cantidad)
// pos: da de baja un nodo de una posicion en particualr
void baja(int pos);
// pre: -
// pos: chequea que no este vacia la lista
bool vacia();
// pre: -
// pos: DESTRUCTOR de la lista
~Lista();
// pre: -
// pos: devuelve la cantidad de nodos que hay en la lista
int obtener_cantidad();
private:
// pre: posicion menor al largo de la lista (cantidad)
// pos: obtiene el nodo de una posicion en particular
Nodo<Tipo>* obtener_nodo(int pos);
};
// _______________________________________________________________________________________________
template <typename Tipo>
Lista<Tipo>::Lista() {
primero = nullptr;
cantidad = 0;
}
template <typename Tipo>
bool Lista<Tipo>::vacia() {
return (cantidad == 0);
}
template <typename Tipo>
void Lista<Tipo>::alta(Tipo d, int pos) {
// cheq que pos < cantidad
Nodo<Tipo>* nuevo_nodo = new Nodo<Tipo>(d);
Nodo<Tipo>* ptr_siguiente_nodo_en_lista = primero;
if (pos == 0) {
primero = nuevo_nodo;
} else {
// Apunto el nuevo nodo
Nodo<Tipo>* ptr_anterior_nodo_en_lista = obtener_nodo(pos-1);
ptr_siguiente_nodo_en_lista = ptr_anterior_nodo_en_lista -> obtener_siguiente();
ptr_anterior_nodo_en_lista -> cambiar_siguiente(nuevo_nodo);
}
nuevo_nodo->cambiar_siguiente(ptr_siguiente_nodo_en_lista);
cantidad++;
}
template <typename Tipo>
void Lista<Tipo>::baja(int pos) {
Nodo<Tipo>* ptr_nodo_a_bajar = primero;
// y si cantidad == 1?
if (pos == 0)
primero = ptr_nodo_a_bajar -> obtener_siguiente();
else {
Nodo<Tipo>* anterior_nodo_en_lista = obtener_nodo(pos-1);
ptr_nodo_a_bajar = anterior_nodo_en_lista->obtener_siguiente();
anterior_nodo_en_lista -> cambiar_siguiente(ptr_nodo_a_bajar -> obtener_siguiente());
}
cantidad--;
delete ptr_nodo_a_bajar;
}
template <typename Tipo>
Tipo Lista<Tipo>::consulta(int pos) {
Nodo<Tipo>* aux = obtener_nodo(pos);
return aux -> obtener_dato();
}
template <typename Tipo>
Lista<Tipo>::~Lista() {
while (! vacia())
baja(0);
}
template <typename Tipo>
Nodo<Tipo>* Lista<Tipo>::obtener_nodo(int pos) {
Nodo<Tipo>* aux = primero;
for (int i = 0; i < pos; i++)
aux = aux->obtener_siguiente();
return aux;
}
template <typename Tipo>
int Lista<Tipo>::obtener_cantidad(){
return cantidad;
}
#endif // LISTA_H