我想用堆栈实现树的遍历,但为什么用getfirstchild和getnextchild取的节点地址是相同的?部分代码如下所示
ln_node := ln_pnode.getFirstChild;
while ln_node <> nil do
begin
ls_stack.Push(@ln_node); //此处入栈地址为什么相同啊? 断点调试显示节点text属性以改变
ln_node := ln_pnode.GetNextChild(ln_node);
end;
ln_node := ln_pnode.getFirstChild;
while ln_node <> nil do
begin
ls_stack.Push(@ln_node); //此处入栈地址为什么相同啊? 断点调试显示节点text属性以改变
ln_node := ln_pnode.GetNextChild(ln_node);
end;
ls_stack := TStack.Create;
ln_pnode := bsSkinTreeView1.Items.GetFirstNode;
ls_stack.Push(@ln_pnode);
while ls_stack.count <> 0 do
begin
p := ls_stack.Pop;
ln_pnode := TTreeNode(p^);
ln_node := ln_pnode.getFirstChild;
while ln_node <> nil do
begin
ls_stack.Push(@ln_node); --调试时入栈地址相同
ln_node := ln_pnode.GetNextChild(ln_node);
end;
end;
如果你是从C++转过来的,那我原谅你这么写,如果不是我BS你。ln_node是个函数内声明的局部变量吧,你对局部变量取地址,当然总不是不变了。难道你不知道ln_node: TTreeNode,实际是个指针?
直接treeview1.items[i]就行了
p:Ttreenode;for i:=0 to tv.items.count-1 do
begin
p:=tv.items[i];
干 遍历到一个节点后 该干的事
end;
ln_pnode时,其子节点入栈时@ln_node为同一内存的问题。
ls_stack.Push(ln_node);