sacapar.pas

{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION
  [Ejercicio tomado en el final del 13-Feb-2003].
  Escribir un procedure SACAPAR (var L: lista; var C: cola);
  que apendiza a la lista {\tt L} todos los elementos de
  {\tt C} que son pares, los cuales a su vez deben ser
  removidos de la cola {\tt C}. Se puede usar una
  estructura auxiliar (cola o lista). Por ejemplo, si
  inicialmente {\tt L= (2,3,4) } y {\tt C=(1,6,3,5,2,8)}
  entonces, despues de hacer {\tt SACAPAR (L,C)} debe
  quedar {\tt L=(2,3,4,6,2,8)} y {\tt C=(1,3,5)}.
  keywords: lista, cola

FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $ Id: sacapar.pas 2003/02/02 11:10  jdelia  Exp jdelia  $ }
program p_sacapar ;
uses
  u_listai, u_colaai ;
type
  lista = listai ;
  cola  = colaai ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure ERROR (s: string);
begin
  write ('error: ') ;
  writeln (s);
  halt ;
end ;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure SACAPAR (var L: lista; var C: cola);
var
  Z : cola ;
  p : posicion ;
  x : tipo_elemento ;
begin
  Z.ANULA ;
  p := L.FIN ;
  while not (C.VACIA) do begin
    x := C.FRENTE ;
    if ( x mod 2 = 0 ) then begin
      L.INSERTA (x, p) ;
      p := L.SIGUIENTE (p) ; end
    else begin
      Z.PONE (x);
    end ; {if}
    C.QUITA;
  end ; {while}

  {transfiere cola filtrada Z como nueva cola C}
  while not (Z.VACIA) do begin
    x := Z.FRENTE ;
    C.PONE (x);
    Z.QUITA;
  end ; {while}
  
  L.IMPRIME ('Debe imprimir: 2 3 4 6 2 8');
  C.IMPRIME ('Debe imprimir: 1 3 5      '); 
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
  L : lista ;
  C : cola ;
  p : posicion ;
begin

  writeln ;
  writeln ('INICIALIZA LISTA:');
  L.ANULA;
  p := L.PRIMERO ;
  L.INSERTA (4, p);
  L.INSERTA (3, p);
  L.INSERTA (2, p);
  L.IMPRIME ('Debe imprimir: 2 3 4');

  writeln ;
  writeln ('INICIALIZA COLA:');
  C.ANULA ;   
  C.PONE (1);
  C.PONE (6);
  C.PONE (3);
  C.PONE (5);
  C.PONE (2);
  C.PONE (8);
  C.IMPRIME ('Debe imprimir: 1 6 3 5 2 8');
   
  SACAPAR (L, C);

  writeln
end.  
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.