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.