Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   Manejo de listas (https://www.clubdelphi.com/foros/showthread.php?t=16231)

Luli 20-11-2004 02:40:56

Manejo de listas
 
hola, tengo que aprender a manejar listas, si otra vez con las listas, es que no me ha quedado claro, bueno ahi va: encontré un ejemplo de listas enlazadas, de las simples no dobles, pero no se si estoy entendiendo bien, lo que estoy preguntando hasta ahora es lo como me imagino que funciona el programa pero quiero asegurarme para asi poder aprender, así que en las lineas de codigo que tengo duda insertaré una pregunta va? a ver si me pueden ayudar...


type

TApunt=^TNodo;
TNodo=record
Info: String;
Liga: TApunt;
end;

var
Inicio, Fin: TApunt; // aqui declaro las variables de tipo apuntador, pues cuando lo hago, ¿ya apuntan a nil?
  • procedure Agregar(Elem: String);
    Var Aux: TApunt; // Aux es un apuntador al nodo que se creará?
    begin
    New(Aux); // aqui, el nodo se puede llamar de otro modo, por ejemplo p? es decir que fuera: New(p);
    Aux^.Liga:=Nil;
    Aux^.Info:=Elem;
    if Inicio=Nil then Inicio:=Aux // aqui, con Inicio:=Aux digo que inicio apunta a aux?
    else Fin^.Liga:=Aux;
    Fin:=Aux; //por lo tanto, aqui digo que fin apunta a aux...
    end;
Por el momento es todo, muchas gracias

Lepe 20-11-2004 14:36:17

En principio hay otras técnicas que evitan el uso de punteros, como el TobjectList. Pero si necesitas eso...

Tapunt, yo le cambiaría el nombre, es decir, PTnodo = ^Tnodo
con esta nomenclatura es mas claro,
Tnodo es un Tipo de datos
PTNodo es un Puntero al Tipo de datos Nodo


type

TApunt=^TNodo;
TNodo=record
Info: String;
Liga: TApunt;
end;

var
Inicio, Fin: TApunt; // aqui declaro las variables de tipo apuntador, pues cuando lo hago, ¿ya apuntan a nil? SI, Delphi lo inicializa a nil al declarar la variable.

  • procedure Agregar(Elem: String);

    Var Aux: TApunt; // Aux es un apuntador al nodo que se creará? SI
    begin

    New(Aux); // aqui, el nodo se puede llamar de otro modo, por ejemplo p? es decir que fuera: New(p);NO VER EJEMPLO
    Aux^.Liga:=Nil;

    Aux^.Info:=Elem;

    if Inicio=Nil then Inicio:=Aux // aqui, con Inicio:=Aux digo que inicio apunta a aux? EXACTO
    else Fin^.Liga:=Aux;

    Fin:=Aux; //por lo tanto, aqui digo que fin apunta a aux...SIP
    end;




    Puedes hacerte un esquema grafico para aclararte un poco

    Código:

     
     Tnodo
     
     -------------
     
      | info          |
     
      | Liga          |
     
      -------------
     
     
     
      Pointer
     
      ------
     
      |  |
     
      ------
     
     
     
      Tapunt
     
      ------                        -------------
     
      | ---------------->        | info        |
     
      ------                        | Liga        |
     
                              -------------

De esta forma, estas viendo que Tapunt está compuesto por un tipo Pointer + un Tipo Registro.

Aux es una variable, imagina que delphi reserva espacio para esa variable en la posicion 100 de la memoria.
  • Código:

     
     direccion        nombre de        contenido
     
      de memoria        la variable        de la memoria
     
     
     
      0                                ocupada por windows
     
      100                Aux                inicialmente NIL
     
      150                                ocupada por windows
     
      200                                --libre--

    Cuando haces New(Aux) se reserva espacio para guardar el nodo, y se hace al conjunto completo:

    - Reserva espacio para el registro ( supongamos en la posicion 200)

    - Modifica el contenido de aux para que apunte a esa zona de memoria recien creada.

    Código:

     
     
     
      direccion        nombre de        contenido
     
      de memoria        la variable        de la memoria
     
     
     
      0                                ocupada por windows
     
      100                Aux                200
     
      150                                ocupada por windows
     
      200                aux^                el nodo recien creado



    de tal forma que cuando dices:

    Código Delphi [-]
      
      aux^.info:= 'elemento'



    - Primero, va a aux, Delphi sabe Aux está en la posición 100

    - lee el contenido de Aux (200)

    - Como encuentra el operador ^. lo que hace es ir a la posicion de memoria 200 y tratar esa porcion de memoria como si fuera un registro

    - Accede al campo infoy le asigna la cadena 'elemento'.



    Lo que si puedes hacer es extraer el registro de la lista, de esta forma:

    Código Delphi [-]
      
      var 
      
          Aux:TApunt;
      
          Reg: TNodo;
      
      begin
      
      if Inicio <> nil then
      
      begin
      
         Reg := inicio^;
      
         showMessage(reg.elemento);
      
      end;

    Mira atentamente de qué tipo es cada variable.



    Espero te ayude.




Luli 22-11-2004 02:09:32

Ejemplo ilustrativo
 
hola, muchisimas gracias, muy ilustrativo tu ejemplo, me ha sido de mucha utilidad, gracias otra vez y nos vemos por aqui pronto


La franja horaria es GMT +2. Ahora son las 18:05:53.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi