rejunta.cpp

// $Id$

/*
  COMIENZO DE DESCRIPCION

  Usando las operaciones del TAD lista, escribir una funci\'on
  {\tt void rejunta (list<int> &L, int A)} que, dada una lista 
  de enteros {\tt L}, agrupe elementos de tal manera que en la
  lista queden solo elementos mayores o iguales que {\tt A}. El 
  algoritmo recorre la lista y, cuando encuentra un elemento menor,
  empieza a agrupar el elemento con los siguientes hasta
  llegar a {\tt A} o hasta que se acabe la lista. Por ejemplo,
  si L=[3,4,2,4,1,4,4,3,2,2,4,1,4,1,4,4,1,4,4,2], entonces
  rejunta (L,10) da L=[13,12,13,10,10]. En la lista final
  NO deben quedar elementos menores que {\tt A} salvo,
  eventualmente, el \'ultimo.
  [Ejercicio tomado en el Ex\'amen Final del 05/07/01]
  keywords: lista
  
  FIN DE DESCRIPCION
*/
// -----------------------------------------------------------------
#include <list>
#include <iostream>
#include "./util.h"
using namespace std;

// -----------------------------------------------------------------
void rejunta (list<int> &L, int a) {
  list<int>::iterator p ; 
  int suma ;
  p = L.begin ();
  while ( p != L.end () ) {
    if (*p > a) 
      p++ ;
    else {
      suma = 0 ;
      while ( p != L.end () && suma < a) {
	suma = suma + (*p) ;
	p = L.erase (p);
      } // end while
      p = L.insert (p, suma);
      p++;
    } // end if
  } // end while
}

// -----------------------------------------------------------------
int main () {
  list <int> L ;
  int n = 10 ;
  for (int i = 0 ; i < n ; i++) {
    L.clear ();
    randl (L, 4, 10.0);
    cout << endl ;
    cout << "antes de rejunta: ";
    printl (L);
    rejunta (L, 3);
    cout << "Despues de rejunta: ";
    printl (L);
  } // end for
  cout << endl ;
  return 0 ;
} // end main
// -----------------------------------------------------------------

Generated by GNU Enscript 1.6.6.