Está en la página 1de 5

//Ayuzo Hernandez Aaron Adan Ignacio

//Cabrera Duran Zajid


//Delgado Castro Uriel
//Ramirez Hernandez Diego
2: #ifndef LISTAD_H
3: #define LISTAD_H
4: #include <iostream>
5: #include <iomanip>
6: #include "NodoDT.h"
7: using namespace std;
8:
9: template <class T>
10:
11: class ListaDT
12: {
13: public:
14: ListaDT();
15: ~ListaDT();
16: void insertaUnNodo(T);
17: void muestraTusDatos(void);
18: void borraUnNodo(T);
19: bool listaVacia(void);
20: void borraTodo(void);
21: NodoDT<T>* dameTuInicio(void);
22: NodoDT<T>* dameTuFin(void);
23: void muestraTusDatosDI(void);
24: private:
25: NodoDT<T>* inicio,*fin;
26: };
27: template<class T>
28: ListaDT<T>::ListaDT()
29: {
30: this->inicio = this->fin = NULL;
31: }
32: template<class T>
33: ListaDT<T>:: ~ListaDT()
34: {
35: cout << "\n\nDatos que quedaron en la lista "
36: << endl;
37: this->borraTodo();
38: }
39: template<class T>
40: void ListaDT<T>::insertaUnNodo(T dato){
41: // Si la lista no esta vacia
42: if(!this->listaVacia())
43: { // inserta al inicio
44: // si el dato es menor o igual al primer dato de la lista
45:
46: if(dato <= this->inicio->dameTuDato())
47: { // Reserva espacio de memoria con una copia identica
48: // del dato menor al inicio y una copia identica de la
49: // direccion de inicio
50: this->inicio = new
51: NodoDT<T>(dato,this->inicio);
52: // Modifica el nodo anterior del nodo que antes era inicio
53: // para que guarde una copia identica del nuevo inicio
54:
55: this->inicio->dameTuSiguiente()->modificaTuAnte
56: rior(this->inicio);
57: }
58: else{// inserta al final de la lista cuando el dato es mayor
59: // que el ultimo almacenado en la lsita
60: if(dato >= this->fin->dameTuDato())
61: { // Reserva espacio de memoria con una copia del dato
62: // siguiente apunta a NULL y anterior guarda una copia
63: // identica de la dirección al NodoD apuntado por fin
64: // este nuevo NodoD esta almacenado por el apunatdor
65: // siguiente del NodoD apuntado por fin
66: // Recuerde que en el constructor de la clase NodoD
67: // NodoD(int dato, NodoD*siguiente=NULL, NodoD* enterior=NULL )
68: // es necesario enviar NULL a siguiente pues no se puede
69: // ser NULL por omision
70: this->fin->modificaTuSiguiente(new
71: NodoDT<T>(dato,NULL,this->fin));
72: // Actualiza el apuntador fin
73: // el apuntador fin guarda siempre una copia del ultimo NodoD
74: // de la lista
75: this->fin =
76: this->fin->dameTuSiguiente();
77: }
78: else{
79: // inserta en medio
80: if(dato >
81: this->inicio->dameTuDato() && dato <
82: this->fin->dameTuDato())
83: { NodoDT<T>* aux = inicio;
84: // Recorre la lista para buscar donde se va a insertar el dato
85: // pregunta por el dato del NodoD se adelante de donde esta el
86: // apuntador aux
87:
88: while(aux->dameTuSiguiente()->dameTuDato() <
89: dato)
90: aux =
91: aux->dameTuSiguiente();
92: /* Reserva el espacio de memoria
93: Inicializa el espacio con una
94: copia identica del dato
95: siguiente, apunta al NodoD que
96: esta adelante del apuntador aux
97: anterior,apunta al NodoD apuntado
98: por aux
99: */
100:
101: aux->modificaTuSiguiente(new
102: NodoDT<T>(dato, aux->dameTuSiguiente(),aux));
103:
104: aux->dameTuSiguiente()->dameTuSiguiente()->modi
105: ficaTuAnterior(aux->dameTuSiguiente());
106: }
107: }
108: }
109: }else // inserta cuando la lista esta vacia
110:
111: this->fin = this->inicio = new
112: NodoDT<T>(dato);
113: }
114:
115: template<class T>
116: bool ListaDT<T>::listaVacia(void)
117: {
118: return this->inicio == NULL;
119: }
120:
121: template<class T>
122: void ListaDT<T>::borraUnNodo(T dato){
123: if(!listaVacia())
124: {// Trata de borrar al inicio o al final que no
125: se entra en la lista
126: if( this->inicio->dameTuDato()> dato ||
127: this->fin->dameTuDato()< dato )
128: cout << "El dato " << dato << " no esta en la lista" << endl;
129: else
130: {
131: NodoDT<T>* aux = this->inicio;
132: // Borra un nodo al inicio de la lista
133: if(this->inicio->dameTuDato() == dato)
134: { this->inicio =
135: this->inicio->dameTuSiguiente();
136: this->inicio->modificaTuAnterior(NULL);
137: delete aux;
138: }
139: else
140: { // Borra un nodo al final de la lista
141: if(this->fin->dameTuDato() == dato)
142: { aux = this->fin;
143: this->fin = this->fin->dameTuAnterior();
144: this->fin->modificaTuSiguiente(NULL);
145: delete aux;
146: }
147: else
148: { // Recorre la lista para buscar el nodo que se va a borrar
149: while(aux->dameTuDato() < dato)
150: aux = aux->dameTuSiguiente();
151: // el nodo se encontro
152: if(aux->dameTuDato() == dato)
153: { // El nodo que se encuentra atras de aux
154: // se acutaliza en su parte siguiente para que apunte
155: // a el nodo que esta adelante de aux
156:
157: aux->dameTuAnterior()->modificaTuSiguiente(aux-
158: >dameTuSiguiente());
159: // El nodo que esta adelante de aux
160: // en su parte anterio se actualiza para que apunte
161: // a el nodo que esta atras de aux
162:
163: aux->dameTuAnterior()->dameTuSiguiente()->modif
164: icaTuAnterior(aux->dameTuAnterior());
165: delete aux;
166: }
167: else // el nodo que se quiere borrar no esta en medio de la lsita
168: cout << "El dato " << dato << " no esta
169: en la lista" << endl;
170: }
171: }
172: }
173: } else
174: cout << "La lista esta vacia" << endl;
175: }
176:
177: template<class T>
178: void ListaDT<T>::muestraTusDatos(void)
179: {
180: // Pinta en pantalla los datos almacenados
181: // en la lista doblemente enlazada igual que en la
182: // lista simplemente enlazada
183: // desde el inicio hasta NULL
184: NodoDT<T>* actual = this->inicio;
185: while(actual) // actual != NULL
186: { cout << actual->dameTuDato()<<"->";
187: actual = actual->dameTuSiguiente();
188: }
189: cout << endl;
190:
191: // Pinta los datos almacenados en la lista doble
192: // desde el fin hasta NULL
193: actual = this->fin;
194: while(actual) // actual != NULL
195: { cout << actual->dameTuDato()<<"->";
196: actual = actual->dameTuAnterior();
197: }
198: cout << endl;
199: //cin.get();
200:
201: }
202: template<class T>
203: void ListaDT<T>::borraTodo(void)
204: {
205: NodoDT<T>* aux;
206: while(inicio != NULL)
207: {
208: aux = this->inicio;
209: cout << aux->dameTuDato() << endl;
210:
211: this->inicio=this->inicio->dameTuSiguiente(
212: );
213: delete aux;
214: }
215: this->fin = NULL;
216: }
217:
218: template<class T>
219: NodoDT<T>* ListaDT<T>::dameTuInicio(void)
220: {
221: return this->inicio;
222: }
223:
224: template<class T>
225: NodoDT<T>* ListaDT<T>::dameTuFin(void)
226: {
227: return this->fin;
228: }
229:
230: template<class T>
231: void ListaDT<T>::muestraTusDatosDI(void)
232: {
233: NodoDT<T>* actual = this->fin;
234: while(actual)
235: {
236: cout << actual->dameTuDato()<<" ";
237: actual = actual->dameTuAnterior();
238: }
239: cout << endl;
240: }
241: #endif // LISTAD_H

También podría gustarte