Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Unit listacircular;// es la implememntación de las listas circulares con puntero al final
- INTERFACE
- USES CRT,unidadelemento;
- Tlista = ^TNODO;
- TNODO = RECORD
- dato = Telemento;
- sig = ^TNODO;
- END;
- Procedure Crearlista(VAR l:Tlista);
- Function Listavacia(l:Tlista):boolean;
- Procedure Construir (var l:Tlista; e:Telemento);//construir es insertar por la cabezara
- Function primero(l:Tlista):Telemento;
- Procedure resto(VAR l:Tlista);
- Function longitud(l:Tlista):integer;
- Function pertenece(l:lista, e: Telemento):boolean;
- Procedure borrarelemento(var l: Tlista; e:Telemento);
- Procedure insertarfinal (var l:Tlista; e:Telemento);
- IMPLEMENTATION
- Procedure Crearlista(VAR l:lista);
- Begin
- new(l);
- end;
- Function Listavacia(l:lista):boolean;
- Begin
- Listavacia:= l= nil;
- end;
- Procedure Construir (var l:Tlista; e:Telemento);
- VAR aux: ^TNODO;
- Begin
- New(aux);
- Asignar(e,aux^.dato);///PODEMOS HACER READLN DEL ELEMENTO EN VERDAD
- IF Listavacia(l) THEN Begin
- l:=aux;
- l^.sig:=aux;
- end
- else begin
- aux^.sig:=l^.sig;
- l^.sig:=aux;
- // No, l siempre apunta al primer elemento l:=aux;
- end;
- end;
- Function primero(l:Tlista):Telemento;
- Begin
- primero:=l^.sig^.dato;
- end;
- Procedure resto(VAR l:Tlista);
- VAR aux: TNODO^;
- Begin
- If not (Listavacia(l)) THEN Begin
- aux:=l^.sig;
- IF(aux <> l) THEN BEGIN
- l^.sig := aux^.sig;//Cuidado l:=aux^.sig;
- dispose(aux);
- 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
- dispose(l);
- l := nil;
- END;
- end;
- END;
- Function longitud(l:Tlista):integer;
- VAR i:integer; aux, lim:TNODO^; //vamos a usar lim como el puntero limite del bucle
- Begin
- i:=1;//iniciamos en uno para contar la primera posición
- If Listavacia(l) THEN
- longitud:=0;
- else begin
- // He hecho cambios para que fufe
- aux:=l^.sig;
- lim:=l;
- While (aux<>lim) DO Begin
- i:=i+1;
- aux:=aux^.sig;
- end;
- //pillin, que pasa si la lista solo tiene 1 elemento.
- //longitud:=i+1;///sumamos uno para contar la ultima posición porque el bucle se para justo en el anterior
- end;
- END;
- Function pertenece(l:lista , e: Telemento): boolean; e: Telemento):boolean;
- Var aux: TNODO^; i:integer;
- Begin
- If Listavacia(l) THEN
- pertenece:=FALSE;
- else Begin
- aux := l^.sig;
- while(aux^.sig <> l^.sig)AND(aux^.dato <> e) do begin
- aux := aux^.sig;
- end;
- pertenece := aux^.dato = e;
- //ESTO ESTARIA BIEN, una forma alternativa es la de arriba un poco mas corta
- aux:=l^.sig;
- lim:=aux;
- If not (aux^.dato = e) THEN //// tengo esta precondición porque el primer elemento no se revisa en el bucle
- 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
- aux:=aux^.sig; ////entonces hasta que haga una vuelta completa aux no llega a apuntar al mismo sitio que lim(o encontremos el elemento)
- until(aux^.sig=lim) AND (aux^.dato=e) ;
- pertenece:= aux^.dato = e;
- end;
- end;
- Procedure borrarelemento(var l: Tlista; e: Telemento);
- VAR aux,aux2,lim:Tlista;
- Begin
- If not Listavacia(l) THEN Begin
- aux:=l;
- lim:=l;
- 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
- aux:=aux^.sig; // Los putos ^
- While aux^.sig<> lim do /// este bucle nos pone aux en la posición anterior a la última
- aux:=aux^.sig;
- IF(l <> aux) THEN BEGIN
- l:=aux;
- aux^.sig:=lim^.sig;
- dispose(lim);
- END ELSE BEGIN
- dispose(lim);
- lim := nil;
- END;
- END ////// fin de eliminar el último elemento
- else Begin
- aux:=l^.sig; /////recuerdalim = l por la asignación del principio
- aux2:=l;
- While (aux^.dato <> e) AND (aux^.sig<> lim) do begin // Deberias usar esigual de elemento ero bueno
- aux:=aux^.sig;
- aux2:=aux2^.sig;
- end;
- IF (aux^.dato = e) THEN begin
- aux2^.sig:=aux^.sig;
- dispose(aux);
- end;
- end;//del else
- end;//primer if
- end;
- Procedure insertarfinal (var l:Tlista; e:Telemento);
- VAR aux, aux2: Tlista;
- Begin
- If Listavacia(l) THEN
- Construir(l,e);
- else Begin
- aux:=l;
- While (aux^.sig<>l) DO
- aux:=aux^.sig;
- new(aux^.sig);
- Asignar(e,aux^.sig^.dato);
- aux^.sig:=l;
- l:=aux;
- end;
- end;
- END.//Final de la unidad
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement