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.