查找树的节点

coreblood 2004-03-25 05:09:50
{*************************************************************************

查找节点的下一个可以编辑的节点

*************************************************************************}
Function FindNextNode(Node : PVirtualNode;Var VST : TVirtualStringTree) : PVirtualNode;
{*********************************************

找到某一节点下第一个可以编辑的节点

**********************************************}
Procedure FindFirstNode(Node:PVirtualNode;VST:TVirtualStringTree;Var Result : PVirtualNode);
Var
TNode : PVirtualNode;
Data : PNodeData;
begin
If Node = Nil then
Exit;
Data := VST.GetNodeData(Node);
If (Trim(Data.EditS) = 'Y') and (Node.ChildCount <= 0) then
begin
Result := Node; //>在这里我找到了第一我要的节点为为什么我的函数不 //返回?
Exit;
end;
If Node.ChildCount > 0 then
begin
TNode := Node.NextSibling;
While TNode <> Nil Do
begin
FindFirstNode(TNode,VST,Result);
TNode := TNode.NextSibling;
end;
end else
begin
TNode := Node.NextSibling;
FindFirstNode(TNode,VST,Result);
end;
end;
begin
Result := Nil;
If Node = Node.Parent.LastChild then
FindNextNode(Node.Parent,VST)
else
FindFirstNode(Node.NextSibling,VST,Result);
If Result <> Nil then
Exit;
end;
...全文
121 10 打赏 收藏 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
coreblood 2004-03-26
  • 打赏
  • 举报
回复
OK
谢谢 dulei115() 和 hero_yin(阿鬼)
dulei115 2004-03-26
  • 打赏
  • 举报
回复
或者不用函数,直接判断Result是否为nil
...
if Node.ChildCount > 0 then
begin
TNode := Node.FirstChild;
while TNode <> Nil do
begin
FindFirstNode(TNode,VST,Result)
if Result <> nil then
exit;
TNode := TNode.NextSibling;
end;
end
else
begin
TNode := Node.NextSibling;
FindFirstNode(TNode,VST,ResultNode);
if Result <> nil then
exit;
end;
coreblood 2004-03-25
  • 打赏
  • 举报
回复
{*******************************************************************************

查找节点的下一个可以编辑的节点

*******************************************************************************}
Function FindNextNode(Node : PVirtualNode;Var VST : TVirtualStringTree; Var ResultNode:PVirtualNode ):Boolean;
begin
Result := False;
If Node = Node.Parent.LastChild then
FindNextNode(Node.Parent,VST,ResultNode)
else
If FindFirstNode(Node.NextSibling,VST,ResultNode) then
begin
Result := True;
Exit;
end;
end;
{*********************************************

找到某一节点下第一个可以编辑的节点

**********************************************}
Function FindFirstNode(Node:PVirtualNode;VST:TVirtualStringTree; Var ResultNode:PVirtualNode ):Boolean;
Var
TNode : PVirtualNode;
Data : PNodeData;
begin
If Node = Nil then
Exit;
Data := VST.GetNodeData(Node);
If (Trim(Data.EditS) = 'Y') and (Node.ChildCount <= 0) then
begin
ResultNode := Node;
Result := True;
Exit;
end;
If Node.ChildCount > 0 then
begin
TNode := Node.FirstChild;
While TNode <> Nil Do
begin
If not FindFirstNode(TNode,VST,ResultNode) then
TNode := TNode.NextSibling
else
begin
Result := True;
Exit;
end;
end; //EndWhile
end else
begin
TNode := Node.NextSibling;
If FindFirstNode(TNode,VST,ResultNode) then
Begin
Result := True;
Exit;
end;
end;
end;
coreblood 2004-03-25
  • 打赏
  • 举报
回复
查找某个节点下面第一个可以编辑的节点已经可以调试通过了,如上
coreblood 2004-03-25
  • 打赏
  • 举报
回复
{*********************************************

找到某一节点下第一个可以编辑的节点

**********************************************}
Function FindFirstNode(Node:PVirtualNode;VST:TVirtualStringTree; Var ResultNode:PVirtualNode ):Boolean;
Var
TNode : PVirtualNode;
Data : PNodeData;
begin
If Node = Nil then
Exit;
Data := VST.GetNodeData(Node);
If (Trim(Data.EditS) = 'Y') and (Node.ChildCount <= 0) then
begin
ResultNode := Node;
Result := True;
Exit;
end;
If Node.ChildCount > 0 then
begin
TNode := Node.FirstChild;
While TNode <> Nil Do
begin
If not FindFirstNode(TNode,VST,ResultNode) then
TNode := TNode.NextSibling
else
begin
Result := True;
Exit;
end;
end; //EndWhile
end else
begin
TNode := Node.NextSibling;
If FindFirstNode(TNode,VST,ResultNode) then
Begin
Result := True;
Exit;
end;
end;
end;
hero_yin 2004-03-25
  • 打赏
  • 举报
回复
Function FindNextNodes(PNode : PVirtualNode;Var VST : TVirtualStringTree) : PVirtualNode;
Var
Node : PVirtualNode;
Data : PNodeData;
begin
Result:= Nil;
IF PNode=Nil THen Exit;
Node := PNode;
Data := VST.GetNodeData(Node);
While (Trim(Data.EditS) <> 'Y')Or(Node=PNode) Do
begin
If Node.FirstChild<>Nil Then
Begin
Node := Node.FirstChild;
Data := VST.GetNodeData(Node);
Continue;
End;

While Node.NextSibling = nil Do
Begin
If Node.Parent=Nil Then
Begin
Node:= Nil;
Break;
End;
Node := Node.Parent;
End;
Node:= Node.NextSibling;
Data := VST.GetNodeData(Node);
If (Data=Nil) Then Exit;
end;
Result:= Node;
end;

我要分!!!!!!!!
dulei115 2004-03-25
  • 打赏
  • 举报
回复
//大概改了一下,没有调试,基本就是这样了,楼主自己慢慢改吧!
function FindFirstNode(Node: PVirtualNode; VST: TVirtualStringTree; var ResultNode: PVirtualNode): Boolean;
var
TNode: PVirtualNode;
Data: PNodeData;
begin
if Node = Nil then
Exit;
Data := VST.GetNodeData(Node);
if (Trim(Data.EditS) = 'Y') and (Node.ChildCount <= 0) then
begin
ResultNode := Node;
Result := True;
Exit;
end;
if Node.ChildCount > 0 then
begin
TNode := Node.FirstChild;
while TNode <> Nil do
begin
if not FindFirstNode(TNode,VST,ResultNode) then
TNode := TNode.NextSibling
else
begin
Result := True;
exit;
end;
end;
end
else
begin
TNode := Node.NextSibling;
if FindFirstNode(TNode,VST,ResultNode) then
begin
Result := True;
exit;
end;
end;
Result := False;
end;
dulei115 2004-03-25
  • 打赏
  • 举报
回复
你应该把过程改为函数,返回值类型为Boolean
If (Trim(Data.EditS) = 'Y') and (Node.ChildCount <= 0) then
begin
Result := Node;
//这里设置函数的返回值为找到了
Exit;
end;
If Node.ChildCount > 0 then
begin
TNode := Node.FirstChild;
While TNode <> Nil Do
begin
FindFirstNode(TNode,VST,Result);
//这里判断这一个递规调用是否找到,如果找到就exit
TNode := TNode.NextSibling;
end;
end else
begin
TNode := Node.NextSibling;
FindFirstNode(TNode,VST,Result);
//这里判断这一个递规调用是否找到,如果找到就exit
end;
dulei115 2004-03-25
  • 打赏
  • 举报
回复
If Node.ChildCount > 0 then
begin
TNode := Node.FirstChild; //--> 上面这里有点问题
While TNode <> Nil Do
begin
FindFirstNode(TNode,VST,Result);//问题出在这里
//此时不管这一步找到没有都会执行下面的语句,实际的到的应该是(最后一个根节点上的)(层数最少的节点)
TNode := TNode.NextSibling;
end;
end else
begin
TNode := Node.NextSibling;
FindFirstNode(TNode,VST,Result);
end;
a
|-aa
| |-bb
|- bb
b
|-ad
| |-bb
|bb//如果找bb,找到的应该会是这个
c
cc
//规律:根节点从后往前找,c上没有,b上有,然后看b上的第一层,也是从后往前找,得到结果
coreblood 2004-03-25
  • 打赏
  • 举报
回复
{*******************************************************************************

查找节点的下一个可以编辑的节点

*******************************************************************************}
Function FindNextNode(Node : PVirtualNode;Var VST : TVirtualStringTree) : PVirtualNode;
{*********************************************

找到某一节点下第一个可以编辑的节点

**********************************************}
Procedure FindFirstNode(Node:PVirtualNode;VST:TVirtualStringTree;Var Result : PVirtualNode);
Var
TNode : PVirtualNode;
Data : PNodeData;
begin
If Node = Nil then
Exit;
Data := VST.GetNodeData(Node);
If (Trim(Data.EditS) = 'Y') and (Node.ChildCount <= 0) then
begin
Result := Node; //----->在这里我找到了第一我要的节点为为什么我的函数不返回?
Exit; //----->我想如果找到合适节点在这里就应该跳出Procedure但是....
end;
If Node.ChildCount > 0 then
begin
TNode := Node.FirstChild; //--> 上面这里有点问题
While TNode <> Nil Do
begin
FindFirstNode(TNode,VST,Result);
TNode := TNode.NextSibling;
end;
end else
begin
TNode := Node.NextSibling;
FindFirstNode(TNode,VST,Result);
end;
end;
begin
Result := Nil;
If Node = Node.Parent.LastChild then
FindNextNode(Node.Parent,VST)
else
FindFirstNode(Node.NextSibling,VST,Result);
If Result <> Nil then
Exit;
end;
内容概要:本文围绕基于一致性分布式控制的多领航无人机编队跟随控制与轨迹跟踪问题展开研究,通过Matlab代码复现IEEE二区文献中的先进算法,系统阐述了多智能体系统中一致性控制策略的理论基础与实现方法。研究重点在于设计分布式控制律,使得多个领航无人机能够协同引导跟随者形成稳定编队,并精确跟踪预设轨迹,尤其在复杂动态环境下展现出良好的协同性能与系统鲁棒性。内容涵盖系统建模、控制算法设计、仿真验证全过程,并提供了完整的Matlab代码与运行说明,便于读者复现、测试及进一步拓展研究。; 适合人群:具备控制理论基础知识和Matlab编程能力,从事无人机协同控制、多智能体系统、分布式控制及相关领域的研究生、科研人员与工程技术人员。; 使用场景及目标:① 深入理解多无人机编队中基于一致性的分布式控制原理与实现机制;② 掌握轨迹跟踪与编队保持中的协同控制技术;③ 利用所提供的Matlab代码进行算法复现、性能分析与二次开发,服务于学术论文撰写、科研项目验证或工程仿真应用。; 阅读建议:建议结合现代控制理论与多智能体系统相关知识,按照文档结构循序渐进学习,重点关注控制算法设计与代码实现的对应关系,动手运行并调试程序,尝试调整通信拓扑、控制参数等变量以观察系统响应变化,从而深化对分布式协同控制机制的理解与实践能力。

5,944

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧