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.