平衡二叉树的节点搜索函数——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的参数模式可以有效地避免实参与形参相结合时的问题。