【问题标题】:Pascal changing recursion to while loop with pointerPascal 将递归更改为带指针的 while 循环
【发布时间】:2012-12-12 16:50:30
【问题描述】:

您好,我正在学习帕斯卡并测试一些功能
我做了一个这样的递归插入过程。 如果节点存在,则比较两个键,如果不存在,则为新节点腾出空间。

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;

而我正在尝试做的是将递归函数更改为 while 循环。 所以我做了这样的程序
如果节点存在做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;

当第一个节点为根时,while循环为真并执行这段代码 但在此之后,while 循环变为 false 并创建一个新节点。

        if KEY < NODE^.KEY then
            NODE:=NODE^.LEFT
        else
            NODE:=NODE^.RIGHT

最终没有节点连接,这个程序只是不断地创建新节点。
有什么我错过的吗?或者关于第二个代码的任何即兴创作? 在此先感谢:)

【问题讨论】:

    标签: pointers recursion while-loop pascal


    【解决方案1】:

    您错过的事情是您永远不会链接节点(并且在当前设置中,您实际上无法链接节点)。您的记录中有节点的左右节点的字段,但您没有分配它们。因此,您最终只是创建节点而没有将它们链接起来;您有一个缺少链接的链接列表。

    在某一时刻,您将需要类似于 NODE^.RIGHT := NEWNODE(或 NODE^.LEFT := NEWNODE,当然)的东西。

    你需要一些东西(我的 Pascal 有点生疏,所以要小心语法错误;)):

        procedure INSERT(key: Integer; var NODE: NODEPTR)
        begin
            NODEPTR root := NODE;
            if (key < root^.KEY) then begin
                while (root^.LEFT <> nil) do begin
                    root := root^.LEFT;
                end;
                new(NODE);
                NODE^.KEY := key;
                root^.LEFT := NODE;
                node^.RIGHT := root;
            end else begin
                while (root^.Right <> nil) do begin
                    root^ := root^.RIGHT;
                end;
                new(NODE);
                NODE^.KEY := key;
                root^.RIGHT := NODE;
                NODE^.LEFT := root;
            end;
        end;
    

    上面的例子有很多改进和美化的地方,但我认为它显示了总体思路。

    【讨论】:

      猜你喜欢
      • 2020-09-05
      • 2021-03-07
      • 2013-08-12
      • 2019-05-11
      • 2018-08-13
      • 2017-09-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多