Pointers Pascal将递归更改为带指针的while循环
嗨,我正在学习pascal并测试一些函数Pointers Pascal将递归更改为带指针的while循环,pointers,recursion,while-loop,pascal,Pointers,Recursion,While Loop,Pascal,嗨,我正在学习pascal并测试一些函数 我做了这样一个递归插入过程。 如果节点存在,请比较两个键,如果不存在,请为新节点腾出空间 procedure INSERT (KEY : integer; var NODE : NODEPTR); begin if NODE = Nil then begin New (NODE); NODE^.KEY := KEY; NODE^.LEFT := Nil; NODE
我做了这样一个递归插入过程。 如果节点存在,请比较两个键,如果不存在,请为新节点腾出空间
procedure INSERT (KEY : integer; var NODE : NODEPTR);
begin
if NODE = Nil then
begin
New (NODE);
NODE^.KEY := KEY;
NODE^.LEFT := Nil;
NODE^.RIGHT := Nil
end
else
if KEY < NODE^.KEY then
INSERT (KEY, NODE^.LEFT)
else
INSERT (KEY, NODE^.RIGHT)
end;
if KEY < NODE^.KEY then
NODE:=NODE^.LEFT
else
NODE:=NODE^.RIGHT
过程插入(键:整数;变量节点:NODEPTR);
开始
如果NODE=Nil,则
开始
新建(节点);
节点^.KEY:=键;
节点^.LEFT:=Nil;
节点^.RIGHT:=Nil
结束
其他的
如果键
我要做的是将递归函数改为while循环。
所以我做了这样的程序
如果节点存在,则执行while循环,直到节点为空。 循环结束后,创建一个新节点
procedure INSERT (KEY : integer; var NODE : NODEPTR);
begin
while NODE <> nil do
begin
if KEY < NODE^.KEY then
NODE:=NODE^.LEFT
else
NODE:=NODE^.RIGHT
end;
New (NODE);
NODE^.KEY := KEY;
NODE^.LEFT := Nil;
NODE^.RIGHT := Nil
end;
过程插入(键:整数;变量节点:NODEPTR);
开始
而节点nil do
开始
如果键
当第一个节点为root时,while循环为true并执行此代码
但在此之后,while循环变为false并创建一个新节点
procedure INSERT (KEY : integer; var NODE : NODEPTR);
begin
if NODE = Nil then
begin
New (NODE);
NODE^.KEY := KEY;
NODE^.LEFT := Nil;
NODE^.RIGHT := Nil
end
else
if KEY < NODE^.KEY then
INSERT (KEY, NODE^.LEFT)
else
INSERT (KEY, NODE^.RIGHT)
end;
if KEY < NODE^.KEY then
NODE:=NODE^.LEFT
else
NODE:=NODE^.RIGHT
如果键
最终没有节点连接,该程序只是继续创建新节点。有什么我错过的吗?或者对第二条代码有什么即兴创作?
提前感谢:)您错过的是您从未链接节点(在当前设置中,您实际上无法链接节点)。在节点的左侧和右侧节点的记录中有字段,但没有分配它们。因此,您最终只是创建节点,而没有将它们链接起来;您有一个缺少链接的链接列表 在某一点上,您将需要一些类似于
NODE^.右:=NEWNODE
(或者NODE^.左:=NEWNODE
,当然)
你需要一些东西(我的Pascal有点生疏,所以要小心语法错误;):
过程插入(键:整数;变量节点:NODEPTR)
开始
NODEPTR root:=节点;
如果(键
在上面的例子中有很多改进和美化,但我认为它显示了总体思路