Advertisement
diegoguerrero

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

Mar 23rd, 2019
145
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 4.49 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(l : TLista):integer;
  31.         PROCEDURE Ultimo(l : TLista; VAR e : TElemento);
  32.         FUNCTION Pertenece(l : TLista; e : TElemento):boolean;
  33.     {Interacción con el usuario}
  34.         PROCEDURE ImprimirListaCompleta(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.             IF (NOT EsVacia(l)) THEN BEGIN
  77.                 IF (SonIguales(l.datos[l.o].info, e)) THEN BEGIN
  78.                     aux := l.o;
  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.                     aux := l.datos[l.o].sig;
  85.                     aux2 := l.o;
  86.                     WHILE ((aux2 <> -1) AND (NOT borrado)) DO BEGIN
  87.                         IF (SonIguales(l.datos[aux].info, e)) THEN BEGIN
  88.                             IF (l.datos[aux].sig <> -1) THEN
  89.                                 l.datos[aux].sig := l.datos[aux2].sig;
  90.                             l.datos[aux2].sig := -1;
  91.                             l.datos[aux].sig := l.l;
  92.                             l.l := aux;
  93.                             borrado := TRUE;
  94.                         END ELSE BEGIN
  95.                             aux2 := aux;
  96.                             aux := l.datos[aux].sig;
  97.                         END;
  98.                     END;
  99.                 END;
  100.             END;
  101.         END;
  102.     PROCEDURE InsertarFinal(VAR l : TLista; e : TElemento);
  103.         VAR
  104.             aux, aux2 : integer;
  105.         BEGIN
  106.             IF (NOT EsLlena(l)) THEN
  107.                 IF (NOT EsVacia(l)) THEN BEGIN
  108.                     Asignar(l.datos[l.l].info, e);
  109.                     aux := l.datos[l.l].sig;
  110.                     aux2 := l.l;
  111.                     l.datos[l.l].sig := -1;
  112.                     l.l := aux;
  113.                     {Cambio el uso de aux}
  114.                     aux := l.o;
  115.                     WHILE (l.datos[aux].sig <> -1) DO
  116.                         aux := l.datos[aux].sig;
  117.                     l.datos[aux].sig := aux2;
  118.                 END ELSE
  119.                     Construir(l, e);
  120.         END;
  121. {Observadoras selectoras}
  122.     PROCEDURE Primero(l : TLista; VAR e : TElemento);
  123.         BEGIN
  124.             Asignar(e, l.datos[l.o].info);
  125.         END;
  126. {Observadoras no selectoras}
  127.     FUNCTION EsVacia(l : TLista):boolean;
  128.         BEGIN
  129.             EsVacia := (l.o = -1);
  130.         END;
  131.     FUNCTION EsLlena(l : TLista):boolean;
  132.         BEGIN
  133.             EsLlena := (l.l = -1);
  134.         END;
  135.     FUNCTION Longitud(l : TLista):integer;
  136.         VAR
  137.             n : integer;
  138.         BEGIN
  139.             n := 0;
  140.             WHILE (l.o <> -1) DO BEGIN
  141.                 n := n + 1;
  142.                 l.o := l.datos[l.o].sig;
  143.             END;
  144.             Longitud := n;
  145.         END;
  146.     PROCEDURE Ultimo(l : TLista; VAR e : TElemento);
  147.         BEGIN
  148.             WHILE (l.datos[l.o].sig <> -1) DO
  149.                 l.o := l.datos[l.o].sig;
  150.             Asignar(e, l.datos[l.o].info);
  151.         END;
  152.     FUNCTION Pertenece(l : TLista; e : TElemento):boolean;
  153.         VAR
  154.             encontrado : boolean;
  155.         BEGIN
  156.             encontrado := FALSE;
  157.             WHILE ((l.datos[l.o].sig <> -1) AND (NOT encontrado)) DO BEGIN
  158.                 IF (SonIguales(l.datos[l.o].info, e)) THEN
  159.                     encontrado := TRUE;
  160.                 l.o := l.datos[l.o].sig;
  161.             END;
  162.             Pertenece := encontrado;
  163.         END;
  164. {Interacción con el usuario}
  165.     PROCEDURE ImprimirListaCompleta(l : TLista);
  166.         BEGIN
  167.             write('[');
  168.             WHILE (l.o <> -1) DO BEGIN
  169.                 write(l.datos[l.o].info,', ');
  170.                 l.o := l.datos[l.o].sig;
  171.             END;
  172.             writeln(']');
  173.         END;
  174. END.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement