Ver Mensaje Individual
  #2  
Antiguo 20-11-2004
Avatar de Lepe
[Lepe] Lepe is offline
Miembro Premium
 
Registrado: may 2003
Posts: 7.424
Reputación: 29
Lepe Va por buen camino
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.




Última edición por Lepe fecha: 20-11-2004 a las 14:44:53.
Responder Con Cita