Advertisement
diegoguerrero

ED - TAD Lista - Doblemente enlazada (^ini y ^fin) v. 2

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