tpu/u_setlis.pas

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

  Conjuntos como listas. keywords: lista, conjunto

FIN DE DESCRIPCION }
{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
{ $Id: u_setlis.pas,v 1.1 2002/04/25 15:57:09 mstorti Exp mstorti $}
 
unit u_setlis;

interface

uses u_listpi ;

type

setlis = object
  private
    LL : listpi;
  public
    procedure INSERTA (c: tipo_elemento);
    procedure SUPRIME (c: tipo_elemento);
    procedure ANULA;
    procedure IMPRIME (s: string);
    function  MIEMBRO (c: tipo_elemento) : boolean;
    procedure UNION        (A, B: setlis);
    procedure INTERSECCION (A, B: setlis);
    procedure DIFERENCIA   (A, B: setlis);
end;

implementation

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure setlis.INSERTA (c: tipo_elemento);
var
  x : tipo_elemento;
  p : posicion;
label
  999;
begin
  p  := LL.PRIMERO;
  while (p <> LL.FIN) do begin
    x := LL.RECUPERA (p);
    if (x >  c) then LL.INSERTA (c,p);
    if (x >= c) then goto 999 ;
    p := LL.SIGUIENTE (p);
  end; {while}
  LL.INSERTA (c,p);
  999:
end; { setlis.INSERTA }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure setlis.SUPRIME (c: tipo_elemento);
var
  p: posicion;
begin
  p := LL.LOCALIZA (c);
  if ( p <> LL.FIN ) then LL.SUPRIME (p);
end; { setlis.SUPRIME }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure setlis.ANULA;
begin
  LL.ANULA;
end; { setlis.ANULA }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
function setlis.MIEMBRO (c: tipo_elemento) : boolean;
var
  p: posicion;
begin
  p       := LL.LOCALIZA (c);
  MIEMBRO := (p <> LL.FIN);
end; { setlis.SUPRIME }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure setlis.IMPRIME (s: string);
begin
  LL.IMPRIME (s);
  writeln;
end; { setlis.IMPRIME }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure setlis.UNION (A, B: setlis);
var
  pa, pb : posicion;
  xa, xb : tipo_elemento;
begin
  ANULA;
  pa := A.LL.PRIMERO;
  pb := B.LL.PRIMERO;
  while (pa <> A.LL.FIN) and (pb <> B.LL.FIN) do begin
    xa := A.LL.RECUPERA (pa);
    xb := B.LL.RECUPERA (pb);
    if (xa < xb ) then
      LL.INSERTA (xa, LL.FIN)
    else begin
      LL.INSERTA (xb, LL.FIN)
    end ; {if}
    if (xa <= xb) then pa := A.LL.SIGUIENTE (pa);
    if (xa >= xb) then pb := B.LL.SIGUIENTE (pb);
  end ; {while}

  while (pb <> B.LL.FIN) do begin
    LL.INSERTA (B.LL.RECUPERA (pb), LL.FIN);
    pb := B.LL.SIGUIENTE (pb);
  end; {while}

  while (pa <> A.LL.FIN) do begin
    LL.INSERTA (A.LL.RECUPERA (pa), LL.FIN);
    pa := A.LL.SIGUIENTE (pa);
  end; {while}
end; { setlis.UNION }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure setlis.INTERSECCION (A, B: setlis);
var
  pa, pb : posicion;
  xa, xb : tipo_elemento;
begin
  ANULA;
  pa := A.LL.PRIMERO;
  pb := B.LL.PRIMERO;
  while (pa <> A.LL.FIN) and (pb <> B.LL.FIN) do begin
    xa := A.LL.RECUPERA (pa);
    xb := B.LL.RECUPERA (pb);
    if (xa =  xb) then LL.INSERTA (xa, LL.FIN);
    if (xa <= xb) then pa := A.LL.SIGUIENTE (pa);
    if (xa >= xb) then pb := B.LL.SIGUIENTE (pb);
  end; {while}
end; { setlis.INTERSECCION }

{-----+-----+-----+-----+-----+-----+-----+-----+-----+-----}
procedure setlis.DIFERENCIA (A, B: setlis);
var
  pa, pb : posicion;
  xa, xb : tipo_elemento;
begin
  ANULA;
  pa := A.LL.PRIMERO;
  pb := B.LL.PRIMERO;
  while (pa <> A.LL.FIN) and (pb <> B.LL.FIN) do begin
    xa := A.LL.RECUPERA (pa);
    xb := B.LL.RECUPERA (pb);
    if (xa <  xb ) then LL.INSERTA (xa, LL.FIN);
    if (xa <= xb ) then pa := A.LL.SIGUIENTE (pa);
    if (xa >= xb ) then pb := B.LL.SIGUIENTE (pb);
  end; {while}

  while (pa <> A.LL.FIN) do begin
    LL.INSERTA (A.LL.RECUPERA (pa), LL.FIN);
    pa := A.LL.SIGUIENTE (pa);
  end ; {while}
end; { setlis.DIFERENCIA }

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

Generated by GNU enscript 1.6.1.