sorted_list3.cpp
// $Id$
/*
COMIENZO DE DESCRIPCION
Escriba procedimientos para insertar, suprimir y buscar
un elemento en una lista ordenada {\tt L}.
Versi\'on mediante una {\tt clase gen\'erica}
(comparar con {\tt sorted_list1.cpp} y {\tt sorted_list2.cpp}).
keywords: lista
FIN DE DESCRIPCION
*/
// -----------------------------------------------------------------
#include <list>
using namespace std ;
// -------------------------------------------------------------------
template<typename T> // sintaxis para una clase generica:
class sorted_list { // template <class Tipo> class Nombre { }
private:
list<T> data;
public:
typedef typename list<T>::iterator posicion;
sorted_list () {}
sorted_list (list<T> & L) : data(L) {this->data.sort();}
~sorted_list () { }
void clear() { this->data.clear(); }
posicion begin () {return this->data.begin();};
posicion end () {return this->data.end();}
posicion insert (const T &); // no hay posicion pues esta ordenada
posicion erase (const T &);
posicion find (const T &);
};
// -----------------------------------------------------------------
// inserta un item "x" en la lista ordenada "L"
template<typename T>
typename sorted_list<T>::posicion sorted_list<T>::insert(const T& x){
posicion p = begin();
while ( p != end() && *p < x ) p++; // avanzar
p = this->data.insert (p,x); // inserta item 'x' en 'p'
return p;
}
// -----------------------------------------------------------------
// suprime un item "x" en la lista ordenada "L"
template<typename T>
typename sorted_list<T>::posicion sorted_list<T>::erase(const T& x) {
posicion p = begin();
while ( p != end() && *p < x ) p++; // avanzar mientras pueda
if ( p != end() ) { // si "p" no es final de "L"
if ( *p == x ) // y como "*p" es igual a "x", borrar
p = this->data.erase (p); // y refrescar posicion
else // como "x" no esta en posicion "p"
p++; // avanza
}
return p;
}
// -----------------------------------------------------------------
// busca posicion "p" de un item "x" en la lista ordenada "L"
template<typename T>
typename sorted_list<T>::posicion sorted_list<T>::find(const T& t) {
posicion p = begin();
while ( p!= end() && *p < t ) p++; // avanzar
if( p != end() && *p == t ) // '*p' esta en 'L', retornar 'p'.
return p;
else // '*p' no esta en 'L', retornar 'end()'.
return end();
}
// ------------------------------------------------------------------
// auxiliar para impresion
#include <iostream>
#include <iterator>
template<typename T>
ostream& operator<<(ostream& os, sorted_list<T>& L) {
os << "( ";
copy(L.begin(), L.end(), ostream_iterator<T>(os," "));
os << " )";
return os;
}
// ------------------------------------------------------------------
// Test
using namespace std ;
int main() {
int v1[] = {4,2,6,3,7,1,-1} ; int const n1 = 6 ;
int v2[] = {9,0,3,2,7,8,4,-1}; int const n2 = 7 ;
list<int> L;
int x ;
cout << endl;
cout << "Tareas simples sobre una lista ordenada S " << endl;
for (int i=0; i<n1; i++) L.insert(L.end(),v1[i]);
for (int i=0; i<n2; i++) L.insert(L.end(),v2[i]);
sorted_list <int> S (L);
sorted_list <int> :: posicion p ;
cout << "Lista ordenada actual S: "; cout << S << endl;
for (int i=0; i<n1; i++) S.insert (v1[i]);
cout << "Lista ordenada actual S: "; cout << S << endl;
for (int i=0; i<n1; i++) S.erase (v1[i]);
cout << "Lista ordenada actual S: "; cout << S << endl;
x = 6 ;
cout << endl << "Busca elemento x = " << x << endl;
p = S.find (x);
if ( p != S.end () )
cout << "se lo encontro en la lista ordenada S " << endl;
else
cout << "no se lo encontro en la lista ordenada S" << endl;
x = 5 ;
cout << endl << "Busca elemento x = " << x << endl;
p = S.find (x);
if ( p != S.end () )
cout << "se lo encontro en la lista ordenada S" << endl;
else
cout << "no se lo encontro en la lista ordenada S" << endl;
S.insert (-758);
S.insert (136);
S.erase (0);
S.insert (5);
S.erase (3);
cout << endl ;
cout << "Lista ordenada actual S: "; cout << S << endl;
S.clear();
cout << "Lista despues de un clear S: "; cout << S << endl;
cout << endl ;
return 0 ;
}
// ------------------------------------------------------------------
Generated by GNU Enscript 1.6.6.