separa.pas
{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION
Escribir un procedimiento SEPARA que, dada una lista L,
devuelve los elementos de la lista reordenados de tal
manera que, primero, est\'an los pares y, despu\'es, los
impares. Tanto los elementos pares como los impares deben
quedar en el mismo orden relativo entre si que tenian
previamente (en este caso se dice que el algoritmo es
`estable'). Por ejemplo, si L = [81, 16, 86, 37, 88, 29,
29, 47, 76, 59, 12, 49, 35], entonces despues de aplicar
SEPARA debemos tener L = [16, 86, 88, 76, 12, 81, 37, 29,
29, 47, 59, 49, 35]. Se sugiere el siguiente algoritmo:
recorrer la lista eliminando los elementos impares y
ponerlos en una cola auxiliar. Finalmente, insertar los
elementos de la cola al final de la lista.
keywords: lista
FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $ Id: separa.pas 2002/04/05 18:15 jdelia Exp jdelia $}
program p_separa;
uses u_colaai, u_listpi;
type
lista = listpi ;
cola = colaai ;
const
nmax = 13;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure SEPARA (var L : lista );
var
c : cola ;
p : posicion;
n : integer;
begin
C.ANULA;
p := L.PRIMERO;
while (p <> L.FIN) do begin
n := L.RECUPERA (p);
if (n mod 2 = 1) then begin
L.SUPRIME (p);
C.PONE (n);
end
else begin
p := L.SIGUIENTE (p)
end ; {if}
end; {while}
while not (C.VACIA) do begin
n := C.FRENTE ;
L.INSERTA (n, L.FIN);
C.QUITA;
end; {while}
end;
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
L : Lista;
j : integer;
begin
L.ANULA;
randomize;
for j := 1 to nmax do L.inserta (random (100), L.FIN);
L.IMPRIME ('Antes de separar:');
SEPARA (L);
L.IMPRIME ('Despues de separar:');
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
Generated by GNU enscript 1.6.1.