SoloCodigo

Programación General => Pascal => Mensaje iniciado por: JrcsDev en Sábado 22 de Julio de 2006, 00:03

Título: Crear Nodo Y Forma De Implementarlo
Publicado por: JrcsDev en Sábado 22 de Julio de 2006, 00:03
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 :)
Título: Re: Crear Nodo Y Forma De Implementarlo
Publicado por: Danielo en Sábado 22 de Julio de 2006, 18:37
A ver si esto te sirve de ayuda :D :
Código: Text
  1.  
  2. TYPE Punto=RECORD
  3.         x,y:Integer;
  4.         END;
  5.  
  6.         Coordenada=^Punto;
  7. VAR coord:Coordenada;
  8. BEGIN
  9.   (* Creamos una localidad de memoria *)
  10.   NEW(coord);
  11.   (* Asignamos valores *)
  12.   coord^.x:=10;
  13.   coord^.y:=20;
  14.   Write(coord^.x);
  15.   Write(coord^.y);
  16.   (* Liberamos la memoria *)
  17.   Dispose(coord);
  18. END.
  19.  

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

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.
Título: Re: Crear Nodo Y Forma De Implementarlo
Publicado por: Enko en Sábado 22 de Julio de 2006, 19:19
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
  1.  
  2. unit uPointList;
  3.  
  4. interface
  5. uses
  6.   Types;
  7.  
  8. type
  9.   PPointNode = ^TPointNode;
  10.   TPointNode = record
  11.     Pos: TPoint;
  12.     Next: PPointNode;
  13.     Parrent: PPointNode;
  14.   end;
  15.  
  16.   TPointList = class
  17.   private
  18.     FFirst: PPointNode;
  19.     FLast: PPointNode;
  20.     FCount: Integer;
  21.     function NewNode(ANext, AParrent: PPointNode; APoint: TPoint): PPointNode;
  22.   public
  23.     constructor Create;
  24.     destructor Destroy;
  25.     procedure Add(AParrent: PPointNode; APoint: TPoint); overload;
  26.     procedure Add(var APointNode: PPointNode); overload;
  27.     function ExistPoint(APoint: TPoint): Boolean;
  28.     function PopFirst: PPointNode;
  29.     property Count: Integer read FCount;
  30.   end;
  31. implementation
  32. uses
  33.   Dialogs;
  34. { TPointList }
  35.  
  36. procedure TPointList.Add(AParrent: PPointNode; APoint: TPoint);
  37. var
  38.   Node: PPointNode;
  39. begin
  40.   Node := NewNode(nil, Aparrent, APoint);
  41.   if (FFirst <> nil) then
  42.     FLast^.Next := Node
  43.   else
  44.     FFirst := Node;
  45.   FLast := Node;
  46.   Inc(FCount);
  47. end;
  48.  
  49. procedure TPointList.Add(var APointNode: PPointNode);
  50. begin
  51.   APointNode^.Next := nil;
  52.   if (FFirst <> nil) then
  53.     FLast^.Next := APointNode
  54.   else
  55.     FFirst := APointNode;
  56.   FLast := APointNode;
  57.   Inc(FCount);
  58.  
  59. end;
  60.  
  61. constructor TPointList.Create;
  62. begin
  63.   inherited Create;
  64.   FFirst := nil;
  65.   FLast := nil;
  66.   FCount := 0;
  67. end;
  68.  
  69. destructor TPointList.Destroy;
  70. var
  71.   p,q: PPointNode;
  72. begin
  73.   p := FFirst;
  74.   while p <> nil do
  75.   begin
  76.     q := p^.Next;
  77.     Dispose(p);
  78.     p := q;
  79.   end;
  80.   FCount := -1;
  81.   inherited Destroy;
  82. end;
  83.  
  84. function TPointList.ExistPoint(APoint: TPoint): Boolean;
  85. var
  86.   p,q: PPointNode;
  87. begin
  88.   p := FFirst;
  89.   Result := False;
  90.   while p <> nil do
  91.   begin
  92.     q := p^.Next;
  93.     if (p^.Pos.X = APoint.X) and (p^.Pos.Y = APoint.Y) then Result := True;
  94.     p := q;
  95.   end;
  96. end;
  97.  
  98. function TPointList.NewNode(ANext, AParrent: PPointNode; APoint: TPoint): PPointNode;
  99. var
  100.   p: PPointNode;
  101. begin
  102.    New(p);
  103.    p^.Pos := Apoint;
  104.    p^.Next := ANext;
  105.    p^.Parrent := AParrent;
  106.    Result := p;
  107. end;
  108.  
  109. function TPointList.PopFirst: PPointNode;
  110. begin
  111.   Result := FFirst;
  112.   FFirst := FFirst^.Next;
  113.   Dec(FCount);
  114. end;
  115.  
  116.  
  117. end.
  118.  
  119.  
Título: Re: Crear Nodo Y Forma De Implementarlo
Publicado por: JrcsDev en Sábado 22 de Julio de 2006, 19:25
Gracias Amigos... es justo lo que necesitaba... :)... Se les agradece... Saludos...  :kicking: