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:
- 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.