diegoguerrero

ED - TAD Listas - Estática simulación de enl. simple v. 2

Mar 25th, 2019
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 4.65 KB | None | 0 0
  1. UNIT uListaSimulacionEnlazadaSimple;
  2. INTERFACE
  3.     USES uElementoInteger;
  4.         {PARÁMETROS GENÉRICOS: Funciones Asignar(), SonIguales(), Imprimir() propias de cada tipo de elemento}
  5.     CONST
  6.         MAX = 100;
  7.     TYPE
  8.         TNodo = RECORD
  9.             info : TElemento;
  10.             sig : integer;
  11.         END;
  12.         TALista = ARRAY[1..MAX] OF TNodo;
  13.         TLista = RECORD
  14.             datos : TALista;
  15.             o, l : integer;
  16.         END;
  17.  
  18.     {Constructoras generadoras}
  19.         PROCEDURE CrearVacia(VAR l : TLista);
  20.         PROCEDURE Construir(VAR l : TLista; e : TElemento);
  21.     {Constructoras no generadoras}
  22.         PROCEDURE Concatenar(VAR l : TLista; r : TLista);
  23.         PROCEDURE BorrarElemento(VAR l : TLista; e : TElemento);
  24.         PROCEDURE InsertarFinal(VAR l : TLista; e : TElemento);
  25.     {Observadoras selectoras}
  26.         PROCEDURE Primero(l : TLista; VAR e : TElemento);
  27.     {Observadoras no selectoras}
  28.         FUNCTION EsVacia(l : TLista):boolean;
  29.         FUNCTION EsLlena(l : TLista):boolean;
  30.         FUNCTION Longitud(VAR l : TLista):integer;
  31.         PROCEDURE Ultimo(VAR l : TLista; VAR e : TElemento);
  32.         FUNCTION Pertenece(VAR l : TLista; e : TElemento):boolean;
  33.     {Interacción con el usuario}
  34.         PROCEDURE ImprimirListaCompleta(VAR l : TLista);
  35.  
  36. IMPLEMENTATION
  37. {Constructoras generadoras}
  38.     PROCEDURE CrearVacia(VAR l : TLista);
  39.         VAR
  40.             i : integer;
  41.         BEGIN
  42.             l.o := -1;
  43.             l.l := 1;
  44.             FOR i := 1 TO (MAX - 1) DO BEGIN
  45.                 l.datos[i].sig := i + 1;
  46.             END;
  47.             l.datos[MAX].sig := -1;
  48.         END;
  49.     PROCEDURE Construir(VAR l : TLista; e : TElemento);
  50.         VAR
  51.             aux : integer;
  52.         BEGIN
  53.             IF (NOT EsLlena(l)) THEN BEGIN
  54.                 Asignar(l.datos[l.l].info, e);
  55.                 aux := l.l;
  56.                 l.l := l.datos[l.l].sig;
  57.                 l.datos[aux].sig := l.o;
  58.                 l.o := aux;
  59.             END;
  60.         END;
  61. {Constructoras no generadoras}
  62.     PROCEDURE Concatenar(VAR l : TLista; r : TLista);
  63.         BEGIN
  64.             IF (NOT EsVacia(r) AND ((Longitud(l) + Longitud(r)) <= MAX)) THEN BEGIN
  65.                 WHILE (r.o <> -1) DO BEGIN
  66.                     InsertarFinal(l, r.datos[r.o].info);
  67.                     r.o := r.datos[r.o].sig;
  68.                 END;
  69.             END;
  70.         END;
  71.     PROCEDURE BorrarElemento(VAR l : TLista; e : TElemento);
  72.         VAR
  73.             aux, aux2 : integer;
  74.             borrado : boolean;
  75.         BEGIN
  76.             aux := l.o;
  77.             IF (NOT EsVacia(l)) THEN BEGIN
  78.                 IF (SonIguales(l.datos[aux].info, e)) THEN BEGIN
  79.                     l.o := l.datos[l.o].sig;
  80.                     l.datos[aux].sig := l.l;
  81.                     l.l := aux;
  82.                 END ELSE BEGIN
  83.                     borrado := FALSE;
  84.                     aux2 := l.datos[l.o].sig;
  85.                     WHILE ((aux2 <> -1) AND (NOT borrado)) DO BEGIN
  86.                         IF (SonIguales(l.datos[aux2].info, e)) THEN BEGIN
  87.                             IF (l.datos[aux2].sig <> -1) THEN
  88.                                 l.datos[aux2].sig := l.datos[aux].sig;
  89.                             l.datos[aux].sig := -1;
  90.                             l.datos[aux2].sig := l.l;
  91.                             l.l := aux2;
  92.                             borrado := TRUE;
  93.                         END ELSE BEGIN
  94.                             aux := aux2;
  95.                             aux2 := l.datos[aux2].sig;
  96.                         END;
  97.                     END;
  98.                 END;
  99.             END;
  100.         END;
  101.     PROCEDURE InsertarFinal(VAR l : TLista; e : TElemento);
  102.         VAR
  103.             aux, aux2 : integer;
  104.         BEGIN
  105.             IF (NOT EsLlena(l)) THEN
  106.                 IF (NOT EsVacia(l)) THEN BEGIN
  107.                     Asignar(l.datos[l.l].info, e);
  108.                     aux := l.datos[l.l].sig;
  109.                     aux2 := l.l;
  110.                     l.datos[l.l].sig := -1;
  111.                     l.l := aux;
  112.                     {Cambio el uso de aux}
  113.                     aux := l.o;
  114.                     WHILE (l.datos[aux].sig <> -1) DO
  115.                         aux := l.datos[aux].sig;
  116.                     l.datos[aux].sig := aux2;
  117.                 END ELSE
  118.                     Construir(l, e);
  119.         END;
  120. {Observadoras selectoras}
  121.     PROCEDURE Primero(l : TLista; VAR e : TElemento);
  122.         BEGIN
  123.             Asignar(e, l.datos[l.o].info);
  124.         END;
  125. {Observadoras no selectoras}
  126.     FUNCTION EsVacia(l : TLista):boolean;
  127.         BEGIN
  128.             EsVacia := (l.o = -1);
  129.         END;
  130.     FUNCTION EsLlena(l : TLista):boolean;
  131.         BEGIN
  132.             EsLlena := (l.l = -1);
  133.         END;
  134.     FUNCTION Longitud(VAR l : TLista):integer;
  135.         VAR
  136.             n : integer;
  137.             aux : integer;
  138.         BEGIN
  139.             n := 0;
  140.             aux := l.o;
  141.             WHILE (aux <> -1) DO BEGIN
  142.                 n := n + 1;
  143.                 aux := l.datos[aux].sig;
  144.             END;
  145.             Longitud := n;
  146.         END;
  147.     PROCEDURE Ultimo(VAR l : TLista; VAR e : TElemento);
  148.         VAR
  149.             aux : integer;
  150.         BEGIN
  151.             aux := l.o;
  152.             WHILE (l.datos[aux].sig <> -1) DO
  153.                 aux := l.datos[aux].sig;
  154.             Asignar(e, l.datos[aux].info);
  155.         END;
  156.     FUNCTION Pertenece(VAR l : TLista; e : TElemento):boolean;
  157.         VAR
  158.             encontrado : boolean;
  159.             aux : integer;
  160.         BEGIN
  161.             encontrado := FALSE;
  162.             aux := l.o;
  163.             WHILE ((l.datos[aux].sig <> -1) AND (NOT encontrado)) DO BEGIN
  164.                 IF (SonIguales(l.datos[aux].info, e)) THEN
  165.                     encontrado := TRUE;
  166.                 aux := l.datos[aux].sig;
  167.             END;
  168.             Pertenece := encontrado;
  169.         END;
  170. {Interacción con el usuario}
  171.     PROCEDURE ImprimirListaCompleta(VAR l : TLista);
  172.         VAR
  173.             aux : integer;
  174.         BEGIN
  175.             aux := l.o;
  176.             write('[');
  177.             WHILE (aux <> -1) DO BEGIN
  178.                 write(l.datos[aux].info,', ');
  179.                 aux := l.datos[aux].sig;
  180.             END;
  181.             writeln(']');
  182.         END;
  183. END.
Add Comment
Please, Sign In to add comment