LISTATEMPLATE.CPP December 20, 2001 #include <iostream.h> #define OK 0 #define ERR -1 template <class T> class ListaOrd { struct nodo { T info; nodo *sig; }; nodo *cap; public : ListaOrd(){cap =NULL ;} ListaOrd(const ListaOrd &); ~ListaOrd(); ListaOrd operator =(const ListaOrd &); void Vaciar (); int Vacia () { return cap ==NULL ;} int Insertar (T); void Mostrar (); }; template <class T> ListaOrd<T>::ListaOrd(const ListaOrd <T>& L) { nodo *aux; cap=NULL; aux=L.cap; while (aux ) { Insertar(aux->info); aux=aux->sig; } } template <class T> ListaOrd<T>::~ListaOrd() { Vaciar(); } template <class T> ListaOrd<T> ListaOrd<T>::operator =(const ListaOrd <T>& L) { nodo *aux; Vaciar(); aux=L.cap; while (aux ) { Insertar(aux->info); aux=aux->sig; } return *this ; } Page 1 LISTATEMPLATE.CPP December 20, 2001 template <class T> void ListaOrd <T>:: Vaciar () { nodo *aux; while (cap !=NULL ) { aux=cap; cap=cap->sig; delete aux ; } } template <class T> int ListaOrd <T>:: Insertar (T contenido ) { nodo *act, *ant, *nuevo; nuevo=new nodo ; nuevo->info=contenido; if(cap ==NULL ) { cap=nuevo; nuevo->sig=NULL; return OK; } if(cap ->info ==contenido ) { delete nuevo ; return ERR ; } if(cap ->info >contenido ) { nuevo->sig=cap; cap=nuevo; return OK; } ant=cap; act=cap->sig; int seguir =1; while (act !=NULL && seguir ) { if(act ->info >=contenido ) seguir=0; else { ant=act; act=act->sig; } } if(!seguir ) { if(act ->info ==contenido ) { delete nuevo ; return ERR ; } } ant->sig=nuevo; nuevo->sig=act; return OK; Page 2 LISTATEMPLATE.CPP December 20, 2001 } template <class T> void ListaOrd <T>:: Mostrar () { nodo *aux; for (aux =cap ; aux !=NULL ; aux =aux ->sig ) cout<<aux->info<<endl; } int ListaOrd <char *>:: Insertar (char *cadena ) { nodo *act, *ant, *nuevo; nuevo=new nodo ; nuevo->info= new char [strlen (cadena )+1]; strcpy(nuevo->info,cadena); if(cap ==NULL ) { cap=nuevo; nuevo->sig=NULL; return OK; } if(!strcmp (cap ->info ,cadena )) { delete []nuevo ->info ; delete nuevo ; return ERR ; } if(strcmp (cap ->info ,cadena )>0) { nuevo->sig=cap; cap=nuevo; return OK; } ant=cap; act=cap->sig; int seguir =1; while (act !=NULL && seguir ) { if(strcmp (act ->info ,cadena )>= 0) seguir=0; else { ant=act; act=act->sig; } } if(!seguir ) { if(!strcmp (act ->info ,cadena )) { delete []nuevo ->info ; delete nuevo ; return ERR ; } } ant->sig=nuevo; nuevo->sig=act; Page 3 LISTATEMPLATE.CPP December 20, 2001 return OK; } void ListaOrd <char *>:: Vaciar () { nodo *aux; while (cap !=NULL ) { aux=cap; cap=cap->sig; delete []aux ->info ; delete aux ; } } class Persona { char nombre [30]; public : void Pdatos (char *c) {strcpy (nombre ,c);} int operator ==( Persona P){ return !strcmp (nombre ,P.nombre );} int operator >(Persona P) {return strcmp (nombre ,P.nombre )>0;} int operator >=( Persona P) {return strcmp (nombre ,P.nombre )>= 0;} friend ostream & operator <<( ostream &, const Persona ); }; ostream& operator <<( ostream &os, const Persona P) { os<<"Nombre:"<<P.nombre<<endl; return os; } int PedirOpcion (); void main () { ListaOrd<int > L; int opcion ; do { switch (opcion =PedirOpcion ()) { case 1: int valor ; cout<<"Deme un valor:"; cin>>valor; L.Insertar(valor); case 2: break ; L.Mostrar (); break ; } } while (opcion ); ListaOrd<char *> Lc; do { switch (opcion =PedirOpcion ()) { case 1: char cadena [30]; cout<<"Deme una cadena:"; cin>>cadena; Page 4 LISTATEMPLATE.CPP December 20, 2001 Lc.Insertar(cadena); case 2: break ; Lc.Mostrar (); break ; } } while (opcion ); ListaOrd<Persona> Lp; do { switch (opcion =PedirOpcion ()) { case 1: char cadena [30]; Persona P; cout<<"Deme un nombre:"; cin>>cadena; P.Pdatos(cadena); Lp.Insertar(P); case 2: break ; Lp.Mostrar (); break ; } } while (opcion ); } int PedirOpcion () { int opcion ; do { cout<<endl; cout<<"0..Salir"<<endl; cout<<"1..Insertar"<<endl; cout<<"2..Mostrar"<<endl; cout<<"Elija una opción:"; cin>>opcion; } while (opcion <0 || opcion >2); return opcion ; } Page 5