lista_cte.cpp

// $Id$
/* COMIENZO DE DESCRIPCION 

   __USE_WIKI__
   Dada una lista #L# de enteros escribir una funci\'on 
   #bool es_constante (list <int> &L)#
   que retorna true solo si todos sus elementos son iguales.
   Hacerlo con (i) s\'olo operaciones del TAD lista y (ii) 
   mediante una correspondencia.
   Escriba un procedimiento #void imprime (map <int,int> &M);#
   para imprimir una correspondencia.
   keywords: lista, correspondencia

   FIN DE DESCRIPCION */
// -----------------------------------------------------------------
#include <iostream>
#include <list>
#include <map>
#include "./util.h"
using namespace std ;

//--------------------------------------------------------------------
void imprime (list <int> & L) {
  list <int> :: iterator p, z;
  cout << "lista : " ; 
  p = L.begin ();
  z = L.end ();
  while (p != z) cout << *p++ << " " ;
  cout << endl ;
}

//--------------------------------------------------------------------
void imprime (map <int,int> & M) {
  map <int,int> :: iterator p;
  int x_dominio ;
  int y_rango;
  cout << endl ;
  cout << "mapeo actual (x_dominio, y_rango):" << endl ;
  p = M.begin ();
  while (p != M.end () ) {
    x_dominio = p->first;
    y_rango   = p->second;
    cout << "x_dominio = "     <<    x_dominio  << "  " ;
    cout << "M [x_dominio] = " << M [x_dominio] << endl ;
    p++;
  } // end while
}

//--------------------------------------------------------------------
// version con iteradores sobre lista
bool es_constante1 (list <int> & L) {
  list <int> :: iterator p, q;
  p = L.begin ();
  q = p;
  while (q != L.end () && *p == *q) q++; 
  if (q == L.end ()) return true ; 
  else               return false ;
}

//--------------------------------------------------------------------
// version "larga" con iteradores sobre mapeo
bool es_constante2 (list <int> & L) {
  map <int,int> M ;
  map <int,int> :: iterator q;
  list <int> :: iterator p;
  int x ;
  p = L.begin ();
  while ( p != L.end () ) {
      x = *p;
      q = M.find (x);
      if ( q == M.end () ) M [x] = 1 ;
      p++;
  } // end while
  return M.size() == 1 ;
}

//--------------------------------------------------------------------
// version "breve" con iteradores sobre mapeo pero con mas operaciones
bool es_constante3 (list <int> & L) {
  map <int,int> M ;
  list <int> :: iterator p = L.begin ();
  while ( p != L.end () ) M [*p++] = 1 ; // puede hacer varias reasign
  return M.size() == 1 ;
}

//--------------------------------------------------------------------
int main() {
  list <int> L ;
  int  v1 [] = {7,7,7,7,-1};
  int  v2 [] = {8,2,5,7,-1};
  bool b1, b2, b3;

    // construye una lista prefijada
    cout << endl;
    cout << "Construye una lista prefijada:" << endl;
    L.clear ();
    insertl (L,v1,-1); 
    cout << "lista L: "; printl (L);
    b1 = es_constante1 (L);
    b2 = es_constante2 (L);
    b3 = es_constante3 (L);
    cout << endl;
    cout << "es_constante1 (L) = " << b1 << endl;
    cout << "es_constante2 (L) = " << b2 << endl;
    cout << "es_constante3 (L) = " << b3 << endl;

    // construye una lista prefijada
    cout << endl;
    cout << "Construye una lista prefijada:" << endl;
    L.clear ();
    insertl (L,v2,-1); 
    cout << "lista L: "; printl (L);
    b1 = es_constante1 (L);
    b2 = es_constante2 (L);
    b3 = es_constante3 (L);
    cout << endl;
    cout << "es_constante1 (L) = " << b1 << endl;
    cout << "es_constante2 (L) = " << b2 << endl;
    cout << "es_constante3 (L) = " << b3 << endl;

    // construye una lista aleatoria
    cout << endl;
    cout << "Construye una lista aleatoria:" << endl;
    L.clear ();
    randl (L, 13, 111.0);
    cout << "lista L: "; printl (L);
    cout << endl;
    cout << "es_constante1 (L) = " << b1 << endl;
    cout << "es_constante2 (L) = " << b2 << endl;
    cout << "es_constante3 (L) = " << b3 << endl;

  cout << endl;
  return 0;
}
// -----------------------------------------------------------------
// 

Generated by GNU Enscript 1.6.6.