//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
La Biología Se Ha Desarrollado A Lo Largo Del Tiempo Gracias A Las Aportaciones de Notables Investigadores Que Dedicaron Su Vida Al Estudio de La Naturaleza