Advertisement
Guest User

Untitled

a guest
Apr 6th, 2020
245
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 4.74 KB | None | 0 0
  1. Unit listacircular;// es la implememntación de las listas circulares con puntero al final
  2.  
  3. INTERFACE
  4.  
  5. USES CRT,unidadelemento;
  6.  
  7.  Tlista = ^TNODO;
  8.  
  9.  TNODO = RECORD
  10.     dato = Telemento;
  11.     sig = ^TNODO;
  12.  END;
  13.  
  14.     Procedure Crearlista(VAR l:Tlista);
  15.     Function Listavacia(l:Tlista):boolean;
  16.     Procedure Construir (var l:Tlista; e:Telemento);//construir es insertar por la cabezara
  17.     Function primero(l:Tlista):Telemento;
  18.     Procedure resto(VAR l:Tlista);
  19.     Function longitud(l:Tlista):integer;
  20.     Function pertenece(l:lista, e: Telemento):boolean;
  21.     Procedure borrarelemento(var l: Tlista; e:Telemento);
  22.     Procedure insertarfinal (var l:Tlista; e:Telemento);
  23.    
  24. IMPLEMENTATION
  25.  Procedure Crearlista(VAR l:lista);
  26.  Begin
  27.     new(l);
  28.  end;
  29.  Function Listavacia(l:lista):boolean;
  30.  Begin
  31.      Listavacia:= l= nil;
  32.  end;
  33.  
  34.  Procedure Construir (var l:Tlista; e:Telemento);
  35.  VAR aux: ^TNODO;
  36.  Begin
  37.         New(aux);
  38.         Asignar(e,aux^.dato);///PODEMOS HACER READLN DEL ELEMENTO EN VERDAD
  39.         IF Listavacia(l) THEN Begin
  40.             l:=aux;
  41.             l^.sig:=aux;
  42.         end
  43.         else begin
  44.             aux^.sig:=l^.sig;
  45.             l^.sig:=aux;
  46.             // No, l siempre apunta al primer elemento l:=aux;
  47.         end;
  48.  end;
  49.  
  50.  Function primero(l:Tlista):Telemento;
  51.  Begin
  52.     primero:=l^.sig^.dato;
  53.  end;
  54.  
  55. Procedure resto(VAR l:Tlista);
  56. VAR aux: TNODO^;
  57. Begin
  58.     If not (Listavacia(l)) THEN Begin
  59.     aux:=l^.sig;
  60.     IF(aux <> l) THEN BEGIN
  61.         l^.sig := aux^.sig;//Cuidado l:=aux^.sig;
  62.         dispose(aux);
  63.     END ELSE BEGIN // Si no haces esto en caso de tener una lista de un elemento solo aux = l y haces dispose de l sin igualar l a nil
  64.         dispose(l);
  65.         l := nil;  
  66.     END;
  67.     end;
  68. END;
  69.    
  70. Function longitud(l:Tlista):integer;
  71. VAR i:integer; aux, lim:TNODO^; //vamos a usar lim como el puntero limite del bucle
  72. Begin
  73.     i:=1;//iniciamos en uno para contar la primera posición
  74.     If Listavacia(l) THEN
  75.         longitud:=0;
  76.     else begin
  77.         // He hecho cambios para que fufe
  78.         aux:=l^.sig;
  79.         lim:=l;
  80.         While (aux<>lim) DO Begin
  81.             i:=i+1;
  82.             aux:=aux^.sig;
  83.         end;
  84.         //pillin, que pasa si la lista solo tiene 1 elemento.
  85.         //longitud:=i+1;///sumamos uno para contar la ultima posición porque el bucle se para justo en el anterior
  86.     end;
  87. END;
  88. Function pertenece(l:lista , e: Telemento): boolean;                                                                                                                                                                                                                                                                                                                                         e: Telemento):boolean;
  89. Var aux: TNODO^; i:integer;                            
  90. Begin
  91.     If Listavacia(l) THEN
  92.         pertenece:=FALSE;
  93.     else Begin     
  94.         aux := l^.sig;
  95.         while(aux^.sig <> l^.sig)AND(aux^.dato <> e) do begin
  96.             aux := aux^.sig;
  97.         end;
  98.         pertenece := aux^.dato = e;
  99.  
  100. //ESTO ESTARIA BIEN, una forma alternativa es la de arriba un poco mas corta
  101.         aux:=l^.sig;
  102.         lim:=aux;
  103.         If not (aux^.dato = e) THEN                         //// tengo esta precondición porque el primer elemento no se revisa en el bucle
  104.             REPEAT                                      ////Este bucle inicia los punteros aux y lim en el primer elemento, en su primera ejcución el puntero aux ya apunta a la siguiente posición
  105.                 aux:=aux^.sig;                          ////entonces hasta que haga una vuelta completa aux no llega a apuntar al mismo sitio que lim(o encontremos el elemento)
  106.             until(aux^.sig=lim) AND (aux^.dato=e) ;
  107.         pertenece:= aux^.dato = e;
  108.     end;
  109. end;
  110.  
  111. Procedure borrarelemento(var l: Tlista; e: Telemento);
  112. VAR aux,aux2,lim:Tlista;
  113. Begin
  114.     If not Listavacia(l) THEN Begin
  115.         aux:=l;
  116.         lim:=l;
  117.         IF aux^.dato = e THEN begin     ///////Este if contempla el caso en que el elemento a buscar sea el último entones modificaría el puntero lista
  118.             aux:=aux^.sig; // Los putos ^
  119.             While aux^.sig<> lim do         /// este bucle nos pone aux en la posición anterior a la última
  120.                 aux:=aux^.sig;
  121.             IF(l <> aux) THEN BEGIN        
  122.                 l:=aux;
  123.                 aux^.sig:=lim^.sig;
  124.                 dispose(lim);
  125.             END ELSE BEGIN
  126.                 dispose(lim);
  127.                 lim := nil;        
  128.             END;
  129.         END                             ////// fin de eliminar el último elemento
  130.         else Begin
  131.             aux:=l^.sig;    /////recuerdalim = l por la asignación del principio
  132.             aux2:=l;
  133.             While (aux^.dato <> e) AND (aux^.sig<> lim) do begin // Deberias usar esigual de elemento ero bueno
  134.                 aux:=aux^.sig;
  135.                 aux2:=aux2^.sig;
  136.             end;
  137.             IF (aux^.dato = e) THEN begin
  138.                 aux2^.sig:=aux^.sig;
  139.                 dispose(aux);
  140.             end;
  141.         end;//del else
  142.     end;//primer if
  143. end;
  144. Procedure insertarfinal (var l:Tlista; e:Telemento);
  145. VAR aux, aux2: Tlista;
  146. Begin
  147.     If Listavacia(l) THEN
  148.         Construir(l,e);
  149.     else Begin
  150.         aux:=l;
  151.         While (aux^.sig<>l) DO
  152.             aux:=aux^.sig;
  153.         new(aux^.sig);
  154.         Asignar(e,aux^.sig^.dato);
  155.         aux^.sig:=l;
  156.         l:=aux;
  157.     end;
  158. end;
  159.  
  160. END.//Final de la unidad
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement