junta.pas
{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION
Escribir un procedure JUNTA (var L: lista; m: integer);
que dada una lista L, agrupa de a "m" elementos dejando
su suma. Por ejemplo si la lista L contiene
L = (1,3,2,4,5,2,2,3,5,7,4,3,2,2), entonces depu\'es de
JUNTA (L,3) debe quedar L = (6,11,9,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 O(n), donde n es el n\'umero
de elementos en la lista original.
[Tomado en el examen final del 1/8/2002]
keywords: lista
FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $ Id: junta.pas 2002/07/22 18:17 mstorti Exp jdelia $ }
program junta_p;
uses u_listpi;
type
lista = listpi;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure JUNTA (var L : lista; m:integer);
var
p : posicion;
cont : integer;
suma : integer;
begin
p := L.PRIMERO;
while (p <> L.FIN) do begin
{A esta altura p siempre es la posicion del primer }
{elemento de la siguiente terna a procesar}
{Inicializa el contador y el acumulador }
cont := 0;
suma := 0;
{Debemos verificar que "p" no llegue al fin (cuando }
{el numero de elementos no es un multiplo de "m" }
while (p <> L.FIN) and (cont < m) do begin
suma := suma + L.RECUPERA (p);
L.SUPRIME (p); {Al suprimir la posicion avanza sola}
cont := cont + 1;
end; {while}
{A esta altura "p" siempre apunta a la primera posicion}
{de la lista de manera que podemos insertar}
L.INSERTA (suma,p);
{Para que "p" quede apuntando a la siguiente terna a }
{procesar hay que avanzar la posicion }
p := L.SIGUIENTE (p);
end ; {while}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
L : lista;
k : integer;
begin
{ Genera una lista de numeros aleatorios. }
randomize;
L.ANULA;
for k := 1 to 29 do
L.INSERTA (trunc(random(10)), L.PRIMERO);
{Junta de a 3 elementos. Imprime la lista antes y despues}
L.IMPRIME ('antes: ');
JUNTA (L,3);
L.IMPRIME ('despues: ');
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
Generated by GNU enscript 1.6.1.