如何使用尚未初始化的变量

我想创建一个节点,这个节点有一个字符串和一个节点数组,但其他节点还没有创建,我如何使用它们?我稍后需要在 “for node中的所有边缘 “循环中访问特定节点的边缘。这是一个图数据结构。图是有向的,这意味着一个节点A可以与B有连接,而B与A没有连接。

type
  TNode = record
    name: String;
    edges: TNodeArray;
    procedure Init(const aName: String; const aEdges: TNodeArray);
  end;
  TNodeArray = array of TNode;

procedure  TNode.Init(const aName: String; const aEdges: TNodeArray);
begin
  name := aName;  edges := aEdges;
end;

function NewNode(const aName: String; const aEdges: TNodeArray): TNode;
begin
  Result.Init(aName, aEdges);
end;

procedure Main;
var
  n0, n1, n2, n3: TNode;
begin
  n0 := NewNode('new york', TNodeArray.Create(n1, n2));
  n1 := NewNode('london', TNodeArray.Create(n2));
  n2 := NewNode('moscu', TNodeArray.Create(n1, n3));
  n3 := NewNode('other city', nil);  // 'other city' has no connections
end;

解决方案:

在评论中,原来这是一个有向图。如果是这样,你可以用这样的方法。

type
  TNode = class
  strict private
    FName: string;
    FOutgoingArcs: TList<TNode>;
    function GetOutgoingArc(Index: Integer): TNode;
    function GetOutgoingArcCount: Integer;
  public
    constructor Create(const AName: string);
    procedure AddOutgoingArc(ANode: TNode);
    procedure AddOutgoingArcs(const ANodes: array of TNode);
    property OutgoingArcs[Index: Integer]: TNode read GetOutgoingArc;
    property OutgoingArcCount: Integer read GetOutgoingArcCount;
    property Name: string read FName write FName;
    destructor Destroy; override;
  end;

implementation

{ TNode }

procedure TNode.AddOutgoingArc(ANode: TNode);
begin
  FOutgoingArcs.Add(ANode)
end;

procedure TNode.AddOutgoingArcs(const ANodes: array of TNode);
var
  Node: TNode;
begin
  for Node in ANodes do
    AddOutgoingArc(Node);
end;

constructor TNode.Create(const AName: string);
begin
  FName := AName;
  FOutgoingArcs := TList<TNode>.Create;
end;

destructor TNode.Destroy;
begin
  FOutgoingArcs.Free;
  inherited;
end;

function TNode.GetOutgoingArcCount: Integer;
begin
  Result := FOutgoingArcs.Count;
end;

function TNode.GetOutgoingArc(Index: Integer): TNode;
begin
  Result := FOutgoingArcs[Index];
end;

我也认为在一个列表中记录所有节点是很好的 所以我会这样做:

var
  Nodes: TObjectList<TNode>;

function CreateNode(const AName: string): TNode;
begin
  Result := TNode.Create(AName);
  Nodes.Add(Result);
end;

现在我们可以玩了(一定要创建 Nodes 第一。Nodes := TObjectList<TNode>.Create(True{say})):

var
  NewYork,
  London,
  Paris,
  Moscow: TNode;
begin

  NewYork := CreateNode('New York');
  London := CreateNode('London');
  Paris := CreateNode('Paris');
  Moscow := CreateNode('Moscow');

  NewYork.AddOutgoingArc(London);
  London.AddOutgoingArcs([NewYork, Paris, Moscow]);
  Paris.AddOutgoingArcs([London, Moscow]);
  Moscow.AddOutgoingArc(NewYork);

但是,当然有一千种方法来设计这个。这只是一种可能的解决方案。

更新一下。

注意到只有一个名为 “伦敦 “的对象 所以如果你把它改成 “途经巴黎”,它就会变成 “途经纽约”。

Paris.OutgoingArcs[0].Name := 'The Capital of the United Kingdom';

现在

NewYork.OutgoingArcs[0].Name

也是 'The Capital of the United Kingdom'.

还注意到,对于

Nodes := TObjectList<TNode>.Create(True)

节点将由 Nodes 对象列表 True 手段),所以当他们被释放时,他们将被释放。Nodes 被释放了。所以,举例来说,如果你在自己的类中使用这些结点 TTravelPlanner,你可能想创建 NodesTTravelPlanner.Create 并做 Nodes.FreeTTravelPlanner.Destroy.

给TA打赏
共{{data.count}}人
人已打赏
解决方案

未捕获类型错误:$(...).combobox不是一个函数。

2022-5-13 7:00:16

解决方案

嵌套的PreferenceFragmentCompat在Android 4.4上不显示。

2022-5-13 7:00:18

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索