junta.cpp
// $Id$
/*
COMIENZO DE DESCRIPCION
Escribir una funci\'on {\tt void junta (list <int> &L, int n)}
que, dada una lista {\tt L}, agrupa de a {\tt n} elementos
dejando su suma IN PLACE. Por ejemplo, si la lista {\tt L}
contiene L=(1,3,2,4,5,2,2,3,5,7,4,3,2,2), entonces depu\'es de
{\tt junta (L,3)} debe quedar L=(6,11,10,14,4). Prestar atenci\'on
a no usar posiciones inv\'alidas despu\'es de una supresi\'on.
El algoritmo debe tener un tiempo de ejecuci\'on {\tt O (m)},
donde {\tt m} es el n\'umero de elementos en la lista original.
[Tomado en el examen final del 1/8/2002]
keywords: lista
FIN DE DESCRIPCION
*/
// -----------------------------------------------------------------
#include <list>
#include <iostream>
using namespace std;
// -----------------------------------------------------------------
void junta(list<int> &L,int n) {
list<int>::iterator p;
int suma;
p=L.begin();
while (p!=L.end()) {
suma=0;
// Suma de N elementos y los elimina
for (int j=0;j<n;j++) {
suma=suma+(*p);
p=L.erase(p);
// Atencion podrian quedar menos de N elementos
// en la lista. En tal caso llegamos a L.end () y
// debemos salir del lazo
if (p==L.end()) break;
} // end i
// Inserta SUMA e incrementa P de manera de quedar apuntando
// al comienzo de la siguiente subsecuencia.
p=L.insert(p,suma);p++;
} // end while
}
// -----------------------------------------------------------------
// imprime en orden normal (directo)
void printl(list<int> &l) {
list<int>::iterator p;
p=l.begin();
while (p!=l.end()) cout << *p++ << " ";
cout << endl;
}
// -----------------------------------------------------------------
int main () {
int v[]={10,1,15,7,2,19,15,16,11,15,9,13,3,7,6,12,1,-1};
int n=3;
int *z;
list<int> L;
z=v;
while (*z!=-1) {L.insert(L.end(),*z++);}
cout << endl;
cout << "Agrupa de a " << n << " elementos " << endl;
cout << "Lista inicial : ";
printl(L);
junta (L,n);
cout << "Lista agrupada: ";
printl(L);
cout << endl;
return 0;
} // end main
// -----------------------------------------------------------------
Generated by GNU Enscript 1.6.6.