multirec.pas

{ COMIENZO DE DESCRIPCION

Escribir un procedimiento procedure MULTI_REC(L1,IND: lista; var L2:
lista); que, dados una lista L1 y otra lista IND de indices enteros,
retorna los elementos de la lista L1 que est\'an en las posiciones
indicadas por los n\'umeros en IND. Se asume que los indices en IND
son crecientes, es decir IND(j)<= IND(j+1), para todo j. 
Por ejemlo, si L1=(6,4,8,1,8,2,7,3,1,2,10,1) y IND=(1,1,4,6,10,12),
entonces  MULTI_REC(L1,IND,L2); debe retornar L2=(6,6,1,2,2,1).
[Tomado en el final del 8-May-2003.]
keywords:lista

FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $Id: multirec.pas,v 1.6 2003/08/08 16:16:39 mstorti Exp mstorti $}

program sumam_p;

uses u_listpi;

type
  lista	= listpi ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure multi_rec (L1,IND : lista;  var L2 : lista) ;
var
   { p : posicion en L1 correspondiente al elemento i-esimo }
   { q: posicion en IND, el eleento correspondiente es `j'  } 
   p,q : posicion;
   i,j : integer;
begin
   { Inicializa L2. }
   L2.anula;
   { Inicializa la posicion en `L1' y su correspondiente}
   { posicion entera `i'. }
   p := L1.primero;
   i := 1;
   { Posicion en `IND' }
   q := IND.primero;
   { `p' recorre `L1' en forma creciente. Se asume que las}
   { posiciones en `IND' son crecientes. }
   while p <> L1.fin do
   begin
      { Si ya cargamos todos los indices en `IND' entonces}
      { se termino la tarea. }
      if q=IND.fin then exit;
      { Sincroniza `j' con `q' }
      j := IND.recupera(q);
      if i=j then begin
	 { Si la posicion actual en `L1' corresponde a `j' entonces}
	 { cargamos el elemento en `L2' y pasamos a la siguiente}
	 { posicion en `IND' }
	 L2.inserta(L1.recupera(p),L2.fin);
	 q:= IND.siguiente(q);
      end
      else begin
	 { Avanza `p' y sincroniza `i' }
	 p := L1.siguiente(p);
	 i := i+1;
      end
   end;
   { Si todo esta bien no deberiamos salir por aqui. }
   { Envia mensaje de error. }
   writeln('Posicion fuera de la lista: ',j);
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
   L1,L2,IND : Lista;
   p	 : posicion;
begin
   { Inicializa `L1' e introduce elementos. }
   L1.anula;
   L1.inserta(6,L1.fin);
   L1.inserta(4,L1.fin);
   L1.inserta(8,L1.fin);
   L1.inserta(1,L1.fin);
   L1.inserta(8,L1.fin);
   L1.inserta(2,L1.fin);
   L1.inserta(7,L1.fin);
   L1.inserta(3,L1.fin);
   L1.inserta(1,L1.fin);
   L1.inserta(2,L1.fin);
   L1.inserta(10,L1.fin);
   L1.inserta(1,L1.fin);

   { Inicializa `IND' e introduce elementos. }
   IND.anula;
   IND.inserta(1,IND.fin);
   IND.inserta(1,IND.fin);
   IND.inserta(4,IND.fin);
   IND.inserta(6,IND.fin);
   IND.inserta(10,IND.fin);
   IND.inserta(12,IND.fin);

   L1.imprime('L1: ');
   IND.imprime('IND: ');

   MULTI_REC(L1,IND,L2);
   
   L2.imprime('L2: ');
   
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.