00001 //=========================================================================== 00002 //= lista.cc Julio de 1998 = 00003 //=-------------------------------------------------------------------------= 00004 //= CLASE PARAMETRICA LISTA. = 00005 //= Esta es una implementacion de uso generico de un TAD LISTA simplemente = 00006 //= encadenada, basada en nodos con apuntadores al siguiente nodo. La = 00007 //= LISTA puede indexarse como si se tratase de un arreglo, ya que posee = 00008 //= una sobrecarga del operador []. Posee metodos que permiten que sea = 00009 //= usada como una pila. = 00010 //=-------------------------------------------------------------------------= 00011 //= OJO: Notese que en C++ un "template" es una ayuda para el compilador, y = 00012 //= no puede compilarse por separado para generar codigo objeto. Este = 00013 //= modulo debe ser incluido (#include) en los modulos que lo utilicen. = 00014 //=-------------------------------------------------------------------------= 00015 //= IMPORTANTE: Esta clase NO MANEJA estructuras ni clases, esta disennada = 00016 //= solamente para tipos de datos basicos y apuntadores. Para usarla con = 00017 //= estructuras de datos complejas (i.e. clases), utilize siempre = 00018 //= apuntadores. = 00019 //=-------------------------------------------------------------------------= 00020 //= Autor original: Oscar J. Chavarro G. A.K.A. JEDILINK. Copyright (c), = 00021 //= 1997 - 2003, oscarchavarro@hotmail.com = 00022 //= AQUYNZA es software libre, y se rige bajo los terminos de la licencia = 00023 //= LGPL de GNU (http://www.gnu.org). Para mayor informacion respecto a la = 00024 //= licencia de uso, consulte el archivo ./doc/LICENCIA en la distribucion. = 00025 //=========================================================================== 00026 00027 //=========================================================================== 00028 //= Encabezados de librerias standard = 00029 //=========================================================================== 00030 00031 #ifndef __LISTA__ 00032 #define __LISTA__ 00033 00034 //#include <stdio.h> 00035 00036 #include "lista.h" 00037 00038 //=========================================================================== 00039 //= Clase de soporte NODITO = 00040 //=========================================================================== 00041 00042 template<class T> 00043 NODITO<T>::NODITO(T &data) 00048 { 00049 info=data; 00050 sig=0; 00051 } 00052 00053 template<class T> 00054 NODITO<T>::~NODITO() 00061 { 00062 ; 00063 } 00064 00065 template<class T> void 00066 NODITO<T>::data(T &dato) 00070 { 00071 dato = info; 00072 } 00073 00074 //=========================================================================== 00075 //= CLASE PARAMETRICA LISTA = 00076 //=========================================================================== 00077 00078 //= Servicios basicos ======================================================== 00079 00080 template<class T> long int 00081 LISTA<T>::tam(void) 00085 { 00086 return mi_tam; 00087 } 00088 00089 // OJO: Por alguna extranna razon estas dos tienen que estar definidas 00090 // en el .h para que no salgan como simbolos no definidos! 00091 00092 00093 //template<class T> 00094 //LISTA<T>::LISTA() 00098 //{ 00099 // mi_tam = 0; 00100 // cab=0; 00101 //} 00102 00103 //template<class T> 00104 //LISTA<T>::~LISTA() 00108 //{ 00109 // elim(); 00110 //} 00111 00112 template<class T> T& 00113 LISTA<T>::operator[](int pos) 00120 { 00121 NODITO<T> *p; 00122 int i; 00123 00124 for ( i = 0, p = cab; p && i < pos; i++, p = p->sig ) { ; } 00125 //if ( p ) { // Seria bueno, pero degradaria el desempenno de la clase 00126 return p->info; 00127 //} 00128 } 00129 00130 00131 template<class T> void 00132 LISTA<T>::elimElem(long int pos) 00136 { 00137 NODITO<T> *p, *q; 00138 00139 if ( !cab || pos < 0 || pos >= mi_tam ) { 00140 return; 00141 } 00142 00143 if ( pos == 0 ) { 00144 cab = cab->sig; 00145 mi_tam--; 00146 return; 00147 } 00148 00149 int i; 00150 00151 for ( p = cab, i = 0; i < pos - 1 && p; i++, p = p->sig ) { ; } 00152 q = p->sig; 00153 p->sig = q->sig; 00154 mi_tam--; 00155 delete q; 00156 } 00157 00158 template<class T> void 00159 LISTA<T>::elim(void) 00164 { 00165 NODITO<T> *p; 00166 00167 while ( cab ) { 00168 p=cab; 00169 cab=cab->sig; 00170 delete p; 00171 } 00172 mi_tam = 0; 00173 cab = 0; 00174 } 00175 00176 template<class T> void 00177 LISTA<T>::push(T &elm) 00181 { 00182 NODITO<T> *Nodo; 00183 00184 Nodo = new NODITO<T>(elm); 00185 if ( !Nodo ) { 00186 return; 00187 } 00188 00189 Nodo->sig = cab; 00190 cab=Nodo; 00191 mi_tam++; 00192 } 00193 00194 template<class T> void 00195 LISTA<T>::anx(T data) 00199 { 00200 insPosElem(data, mi_tam); 00201 } 00202 00203 template<class T> void 00204 LISTA<T>::insPosElem(T data, long int pos) 00208 { 00209 NODITO<T> *Nodo, *P, *Q; 00210 int i; 00211 00212 Nodo = new NODITO<T>(data); 00213 // Referencie internamente el nodo 00214 00215 for ( i = 0, Q = 0, P = cab; P && i < pos; Q = P, P = P->sig, i++ ) { ; } 00216 00217 if ( !cab || P == cab ) { 00218 Nodo->sig = cab; 00219 cab = Nodo; 00220 } 00221 else { 00222 Q->sig = Nodo; 00223 Nodo->sig = P; 00224 } 00225 00226 mi_tam++; 00227 } 00228 00229 //= Servicios de control de la lista por ventana ============================= 00230 00231 template<class T> void 00232 LISTA<T>::principio(void) 00233 { 00234 window = cab; 00235 } 00236 00237 template<class T> void 00238 LISTA<T>::operator ++(void) 00239 { 00240 if ( window ) window = window->sig; 00241 } 00242 00243 //=========================================================================== 00244 //= EOF = 00245 //=========================================================================== 00246 00247 #endif // __LISTA__ 00248