ralea.pas

{ ppc386 -va -vh *.pas }
{ COMIENZO DE DESCRIPCION

  Dada una lista, retornar sus elementos ordenados en
  forma pseudo-aleatoria. 
  keywords: lista
  FIN DE DESCRIPCION }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $ Id: ralea.pas 2002/04/05 16:45 jdelia  Exp jdelia       $}

program ralea ;

const
  nmax = 10 ;

type
  tipo_elemento = integer;
  tipo_celda = record
    elemento : tipo_elemento;
    sig      : ^tipo_celda;
  end;	       
  lista	= ^tipo_celda;
  posicion = ^tipo_celda;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ IMPLEMENTACION DE LISTAS }

procedure INSERTA(    x	: tipo_elemento;
		      p	: posicion;
		  var L	: lista);
var 
  temp	 : posicion;
  nuevo : ^tipo_celda;
begin
  temp := p^.sig;
  new (nuevo);
  p^.sig := nuevo;
  nuevo^.elemento := x;
  nuevo^.sig := temp;
end; {INSERTA}

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function ANULA (var L : lista) : posicion;
begin
  new (L);
  L^.sig := nil;
  ANULA  := L;
end; {ANULA}

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure IMPRIME (L : lista);
var
  p : posicion;
  q  : ^tipo_celda;
begin
  p := L;
  writeln ('Lista: ');
  q := p^.sig;
  while q <> nil do begin
    writeln (q^.elemento);
    q := q^.sig;
  end; {while}
  writeln ('Fin de la lista');
end; {IMPRIME}

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function PRIMERO (L : lista) : posicion;
begin
  PRIMERO := L;
end;{PRIMERO}

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure SUPRIME (    p : posicion;
		   var L : lista);
var
  tmp : posicion;
begin 
  tmp := p^.sig;
  p^.sig := tmp^.sig;
end; {SUPRIME}

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function FIN (L :  lista) : posicion;
var
  q : posicion;
begin
  q := L;
  while (q^.sig <> nil) do q := q^.sig;
  FIN := q;
end; { FIN }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function RECUPERA(p : posicion; L: lista): tipo_elemento;
var
  tmp : posicion;
begin 
  tmp := p^.sig;
  RECUPERA := tmp^.elemento;
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function SIGUIENTE (p : posicion; L: lista): posicion;
begin
  SIGUIENTE := p^.sig;
end;

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure ORDENA_ALEATORIO (var L : lista);
var
  n,i,j,k  : integer;
  p	   : posicion;
  auxiliar : lista;
  c	   : tipo_elemento;
begin
   {Cuenta cuantos elementos hay en la lista}
   {y pasa todos los elementos a 'auxiliar'.}
   {'L' queda vacia}
   n := 0;
   p := PRIMERO (L);
   ANULA (auxiliar);
   while (p <> FIN (L) ) do begin
     INSERTA (RECUPERA (p,L), FIN (auxiliar), auxiliar);
     SUPRIME (p,L);
     n := n + 1;
   end; {while}
   {Va tomando elementos al azar de 'auxiliar' y los pone en 'L'}
   for i := 1 to n do begin
      j := trunc (random*(n - i + 1)) + 1;
      p := PRIMERO (auxiliar);
      for k := 1 to (j - 1) do  p := SIGUIENTE (p, auxiliar);
      c := RECUPERA (p, auxiliar);
      SUPRIME (p, auxiliar);
      INSERTA (c, FIN (L), L);
   end; {i}
end; {ORDENA_ALEATORIO}
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
var
  L : lista;
  i : integer;
begin
   ANULA (L);
   randomize;
   for i := 1 to nmax do begin
      INSERTA (i, FIN (L), L);
   end ; {for}
   IMPRIME (L);
   ORDENA_ALEATORIO (L);
   IMPRIME (L);
end.
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}

Generated by GNU enscript 1.6.1.