Skip to the content.

🧾Listas


Indice

Recorrer_Una_Lista

procedure Recorrido(l:lista);
begin
    while (l <> nil) do
    begin
        writeln(l^.dato);
        l:=l^.sig;
    end;
end;

Buscar_un_Elemento_en_una_Lista =============================== Desordenada ———–

Ordenada

Desordenada Ordenada
```Pas function buscar (l:lista; x:integer):boolean; var encontre: boolean; begin encontre:=false; while (l <> nil) and (not encontre) do begin if (x = l^.dato) then encontre:=true; else encontre:=false; end; buscar:=encontre; end; ``` ```Pas function buscar (l:lista; x:integer):boolean; var //Ordenada De menor a mayor encontre: boolean; begin encontre:=false; while (l <> nil) and (not encontre) and (x > l^.dato) do begin if (x = l^.dato) then encontre:=true; else encontre:=false; end; buscar:=encontre; end; ```

Crear_una_Lista_Vacia

begin
    l:=nil;
end.

Agregar_un_Elemento_al_Principio_de_la_Lista

Agregar_un_Elemento_al_Final_de_la_Lista

Ordenando la lista Con un puntero al ultimo
```Pas procedure AgregarAlFinal1(var pri:lista;per:persona); var act, nue : lista; begin new (nue); nue^.datos:= per; nue^.sig := NIL; if pri <> Nil then begin act := pri ; while (act^.sig <> NIL ) do act := act^.sig ; act^.sig := nue ; end else pri:= nue; end; ``` ```Pas procedure AgregarAlFinal2(var pri,ult:lista;per:persona); var nue : lista; begin new (nue); nue^.datos:= per; nue^.sig := NIL; if pri <> Nil then ult^.sig := nue; else pri := nue; ult := nue; end; ```

Eliminar_un_Elemento_de_la_Lista

  1. En el módulo se usan dos variables auxiliares que ayudaran a recorrer la lista: Actual y Anterior
  2. Se iguala la variable auxiliar Anterioral primer puntero de la lista Actual al siguiente elemento de la lista para poder recorrer dicha lista sin modificar los enlases.
  3. Se recorre la lista con la condición que actual sea distinta de Nil (y el dato actual sea distinto al buscado en el caso de que se sepa que el dato se encuentra en la lista)
  4. Una vez que ‘se sale del while’ , es necesario saber por que lo hizo (solo en el caso donde no se sepa si el elemento esta en la lista. Si se sabe, no es necesario preguntar porque ya siempre sale porque encontro el elemento). En el caso que lo haya hecho porque se encontro el elemento se vuelve a preguntar si el nodo se trata del primero o de los siguientes para luego hacer el nuevo enlace
  5. Se hace Dispose del elemento actual
Procedure BorrarElemento (var pri:lista; nom:cadena50; var exito: boolean);
var ant, act: lista;
begin 
    exito := false;
    act := pri;
    {Recorro mientras no se termine la lista y no encuentre el elemento}
    while  (act <> NIL)  and (act^.datos.nom <> nom) do 
    begin
        ant := act;
        act := act^.sig
    end;   
    if (act <> NIL) then 
    begin
        exito := true; 
        if (act = pri) then  
            pri := act^.sig;
        else  
            ant^.sig:= act^.sig;
        dispose (act);
    end;
end;

Insertar_un_Nuevo_Elemento_en_una_Lista_Ordenada

Procedure InsertarElemento ( var pri: lista; per: persona);
var 
    ant, nue, act: lista;
begin
    new (nue);
    nue^.datos := per;
    act := pri;
    ant := pri;
    {Recorro mientras no se termine la lista y no encuentro la posición correcta}
    while (act<>NIL) and (act^.datos.nombre < per.nombre) do //De menor a mayor
    begin
        ant := act;
        act := act^.sig ;
    end;
    if (ant = act)  then 
        pri := nue   {el dato va al principio}
    else  
        ant^.sig  := nue; {va entre otros dos o al final}
    nue^.sig := act ;
end;

Corte_de_control

Procedure CorteDeControl(var l:info;var v:vCantidadDia;var cant, total:integer);
var
    p:rPrestamos;
    info: rinfo;
begin
    LeerPrestamo(p);
    while (p.ISBN <> -1) do
    begin
        info.ISBN:=p-ISBN;
        info.cantidad:=0;
        while (p.ISBN = info.ISBN) do
        begin
            info.cantidad:=info.cantidad+1;
            v[p.dia]:=v[p.dia]+1;
            if (p.nro_p mod 2 = 1) and (p.nro_s mod 2 = 0) then
                cant := cant + 1;
            leerPrestamo(p);
        end;
        agregarAtras(l,info);
    end;
end;