平衡二叉树的节点搜索函数——Ada应用实例之四

 

平衡二叉树的节点搜索函数——Ada应用实例之四

 

以下是一个平衡二叉树的节点搜索函数(:

binarytree *search(binarytree *tree,binarytree *parent,Type data)

{
       binarytree *p = (binarytree *)malloc(sizeof(struct binarytree)*1);
       p = tree;
       bool find = false;
       while(p && !find){
          parent = p;
          if(p->data == data){
            find = true;
            //printf(“find %d/n”,p->data);
          }
          else if(p->data > data)
             p = p->leftch;
          else
             p = p->rightch;
        }
        return find?p:NULL;
    }

上面程序中把搜索到的节点赋给parent。在另一个删除节点的函数中有如下语句:

    if((p = search(*tree,parent,data)) != NULL){

        if(p->leftch == NULL && p->rightch == NULL){//叶子节点

            if(p->data < parent->data)//左叶子节点

                parent->leftch = NULL;

            else//右叶子节点

                parent->rightch = NULL;

上述代码不能实现删除功能。问题之一是变量parent并没有指向搜索到的节点。这是因为虽然在函数search中把搜索到的节点赋给函数的形参parent,但当调用返回后,外部的实参parent没有得到这个节点。

解决方法是把形参parent定义为“binarytree **parent;”,把“parent = p;”改为“*parent = p;”,把调用语句“search(*tree, parent, data)”改为“search(*tree, &parent, data)”。

如果用Ada编程,那么在编译期间就可发现上述问题。

Ada的过程/函数定义可以对形参指定如下三种模式:

a)      in:该类形参是一个常数,其值由实参决定,在过程/函数中只能对其进行读操作,不能对其进行写操作;

b)      in out:该类形参是一个变量,其初值由实参决定,在过程/函数中既能对其进行读操作,也能对其进行写操作,写操作同时也改变相应实参的值;

c)      out:该类形参是一个没有初值的变量,在过程/函数中既能对其进行读操作,也能对其进行写操作,写操作同时也改变相应实参的值,但读操作必须在写操作之后。

 

以下是一个简单例子:

  procedure Add (A, B: in Integer; C: out Integer) is

  begin

    C := A + B;

  end Add;

假如在上述程序中写一行“A = 1;”,那么编译将报告以下错误:

Assignment to “in” mode parameter not allowed

由此可见,Ada的参数模式可以有效地避免实参与形参相结合时的问题。

 

    原文作者:平衡二叉树
    原文地址: https://blog.csdn.net/logiciel/article/details/4858015
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞