Programación General > Pascal

 Crear Nodo Y Forma De Implementarlo

(1/1)

JrcsDev:
Qué tal??? siempre he tenido algo de problemas con la memoria dinámica. Alguien puede mostrarme algunos fragmentos de códigos necesarios para entender estas cosas bien???

Lo que necesito es lo siguiente:

- Código de la declaración del nodo
- Código de la inicialización del nodo
- Código para acceder a los campos del nodo

He visto que se usa el signo ^ para los apuntadores, pero no recuerdo si el signo se regiere a la direccion o al valor, en casos donde colocan ^p.inf

Espero que alguien puede ayudarme... Gracias :)

Danielo:
A ver si esto te sirve de ayuda :D :

--- Código: Text --- TYPE Punto=RECORD        x,y:Integer;        END;         Coordenada=^Punto;VAR coord:Coordenada;BEGIN  (* Creamos una localidad de memoria *)  NEW(coord);  (* Asignamos valores *)  coord^.x:=10;  coord^.y:=20;  Write(coord^.x);  Write(coord^.y);  (* Liberamos la memoria *)  Dispose(coord);END. 

--- Citar ---He visto que se usa el signo ^ para los apuntadores, pero no recuerdo si el signo se regiere a la direccion o al valor, en casos donde colocan ^p.inf
--- Fin de la cita ---

Si tienes p y q variables de tipo puntero, cuando haces:

p:=q

estás apuntando p al "valor" de q, esto es conocido como alias. Y si llegaras a borrar el valor de lo que está apuntando p, tambien estarías eliminando lo que está apuntando q.

en cambio su haces esto:

^p:=^q

estás copiando sin compartir memoria en p lo que está apuntando q, en este caso si borras lo apuntado por p, no se borra lo apuntado por q.

Enko:
Este codigo es de object pascal. (Free Pascal, Delphi)
Es una pila coordenadas.
Pos: es el dato para el cual se hizo la lista.
Next: es la liga.
Parrent: es el predecesor del punto en cuestion en un grafico. Tomalo como si fuera un dato mas  que no importa mucho, al igual que Pos.

PopFirst: saca el primer elemento en la lista
Add: añade un elemento en la lista, existe 2 tipos de este procedimiento, uno añade el punto y el pariente, y el otro añade directamente por el nodo.

Exists:  devuelve TRUE si la coordenada existe en la lista.

--- Código: Text --- unit uPointList; interfaceuses  Types; type  PPointNode = ^TPointNode;  TPointNode = record    Pos: TPoint;    Next: PPointNode;    Parrent: PPointNode;  end;   TPointList = class  private    FFirst: PPointNode;    FLast: PPointNode;    FCount: Integer;    function NewNode(ANext, AParrent: PPointNode; APoint: TPoint): PPointNode;  public    constructor Create;    destructor Destroy;    procedure Add(AParrent: PPointNode; APoint: TPoint); overload;    procedure Add(var APointNode: PPointNode); overload;    function ExistPoint(APoint: TPoint): Boolean;    function PopFirst: PPointNode;    property Count: Integer read FCount;  end;implementationuses  Dialogs;{ TPointList } procedure TPointList.Add(AParrent: PPointNode; APoint: TPoint);var  Node: PPointNode;begin  Node := NewNode(nil, Aparrent, APoint);  if (FFirst <> nil) then    FLast^.Next := Node  else    FFirst := Node;  FLast := Node;  Inc(FCount);end; procedure TPointList.Add(var APointNode: PPointNode);begin  APointNode^.Next := nil;  if (FFirst <> nil) then    FLast^.Next := APointNode  else    FFirst := APointNode;  FLast := APointNode;  Inc(FCount); end; constructor TPointList.Create;begin  inherited Create;  FFirst := nil;  FLast := nil;  FCount := 0;end; destructor TPointList.Destroy;var  p,q: PPointNode;begin  p := FFirst;  while p <> nil do  begin    q := p^.Next;    Dispose(p);    p := q;  end;  FCount := -1;  inherited Destroy;end; function TPointList.ExistPoint(APoint: TPoint): Boolean;var  p,q: PPointNode;begin  p := FFirst;  Result := False;  while p <> nil do  begin    q := p^.Next;    if (p^.Pos.X = APoint.X) and (p^.Pos.Y = APoint.Y) then Result := True;    p := q;  end;end; function TPointList.NewNode(ANext, AParrent: PPointNode; APoint: TPoint): PPointNode;var  p: PPointNode;begin   New(p);   p^.Pos := Apoint;   p^.Next := ANext;   p^.Parrent := AParrent;   Result := p;end; function TPointList.PopFirst: PPointNode;begin  Result := FFirst;  FFirst := FFirst^.Next;  Dec(FCount);end;  end.  

JrcsDev:
Gracias Amigos... es justo lo que necesitaba... :)... Se les agradece... Saludos...  :kicking:

Navegación

[0] Índice de Mensajes

Ir a la versión completa