odd2even.cpp

// $Id$

/* COMIENZO DE DESCRIPCION 

   __USE_WIKI__
   Dada una lista #L+, escribir una funcion #void odd2even(list<int>#
   #&L,map<int,list<int>> &M);# que mapea cada elemento impar de #L# a la
   siguiente subsecuencia de elementos pares. 
   [Tomado en el TPL2 2013-10-12].
   keywords: correspondencia, lista

   FIN DE DESCRIPCION */

// Por ejemplo si 
// !+L=(1,2,4,3,2,5,2,7,1,6,9,2,14)+ entonces debe dejar
// !+M={1->(2,4,6),3->{2},5->{2},7->{},9->(2,14)}+. 
// Si un numero impar aparece seguido de otro impar entonces el valor
// correspondiente debe ser la lista vacia (por ejemplo el 7
// arriba). Si un numero impar aparece mas de una vez, entonces el
// valor correspondiente debe ser la concatenacion de todas las
// subsecuencias correspondiente (por ejemplo el 1 arriba). 

#include <cstdio>

#include <list>
#include "./util.h"

using namespace std ;


//--------------------------------------------------------------------
void odd2even(list<int> &L,map<int,list<int> > &M) {
  M.clear();
  // Avanza hasta el primer impar
  list<int>::iterator q = L.begin();
  while (q!=L.end() && *q%2==0) q++;
  while (q!=L.end()) {
    list<int> &L2 = M[*q++];
    while (q!=L.end() && *q%2==0) L2.push_back(*q++);
  }
}

//--------------------------------------------------------------------
int main() {
  list<int> L;
  for (int j=0; j<20; j++) L.push_back(rand()%10);
  printf("L: ");
  printl(L);

  typedef map<int,list<int> > map_t;
  map_t M;
  odd2even(L,M);
  map_t::iterator q = M.begin();
  while (q!=M.end()) {
    printf("M[%d] -> ",q->first);
    printl(q->second);
    q++;
  }
  return 0;
}

Generated by GNU Enscript 1.6.6.