elselow=mid+1;
}
return—1; //返回查找失败得标志
}
(2)递归算法
int bin_search(elementtypeA[],intlow,int high,keytypex)
{int mid;
if( low>high)return-1;//查找失败
else{mid=(low+high)/2;//求解中间元素得下标
if( x==A[mid]、key)returnmid;//查找成功
elseif( x<A[mid]、key)
return bin_search(A,low,mid-1,x);//将在左边区域查找得结果作为在整个区域得查找结果返回
else returnbin_search(A,mid+1,high,x); //将在右边区域查找得结果作为在整个区域得查找结果返回
}
}
3.二叉排序树查找算法:
1)请写出二叉排序树结点得结构体定义语句。
typedefchardatatype;
typedefstructnode
{keytypekey;
datatypedata;
structnode *lchild,*rchild;
}BSTnode;
2)请写出二叉排序树中插入结点得算法.
voidinsert (Bnode*&T,Bnode *S) //将指针S所指结点插入到二叉排序树T中
{
if(T==NULL)
T=S; //插入到空树时,插入结点成为根结点
else if(S—〉key<T—>key)
insert(T->lchild,S); //插入到T得左子树中
elseinsert(T—>rchild,S); //插入到T得右子树中
}
3)请写出二叉排序树构造得算法。
voidcreate_bst(Bnode*&T); //通过插入结点构造二叉排序树得算法
{ Bnode*u;elementtypex;
T=NULL;cin〉>x; //初始化根指针并读入第一个元素值
While (x!
=end_of_num) //x不就是结束符时
{u=new Bnode; u->data=x; //产生新结点并装入数据
u->lchild=NILL;u->rchild=NULL;//设置左、右孩子指针为空
insert(T,u); //插入结点到二叉排序树T中
cin〉>x; //读入下一个元素得值
}
}
4)请写出二叉排序树查找得算法.
非递归算法:
Bnode*bst_search(Bnode*T,keytypex)
{
Bnode*P=T; //P指向根
while (p!
=NULL)
if( x==p-〉key)return p; //查找成功
else if(x〈p->key=p—〉lchild); //到左子树中继续查找
elsep=p—>rchild; //到右子树中继续查找
returnp; //返回结果可能为空,也可能非空
}
递归算法:
Bnode*bst_search(Bnode *T,keytypex)
{
if(T==NULL ||t—>key=x)
return T; //子树为空或已经找到时均可结束
elseif(x〈T->key)
return bst_search(T->lchild,x);//左子树中查找得结果就就是函数得结果
else returnbst_search(T->rchild, x); //右子树中查找得结果就就是函数得结果
}
三、上机实验
1.实验内容.
1)建立一个顺序表,用顺序查找得方法对其实施查找;
2)建立一个有序表,用折半查找得方法对其实施查找;
3)建立一个二叉排序树,根据给定值对其实施查找;
4)对同一组数据,试用三种方法查找某一相同数据,并尝试进行性能分析。
2.实验源程序。
(1)
#include〈stdio、h>
#include#definemax100
intx;
typedefstruct
{
ﻩint data[max];
ﻩintlistlen;
}seqlist;
voidinitial_list(seqlist*L)
{
L->listlen=0;
}
voidlist_creat(seqlist *L)
{
inti;
ﻩL—>listlen++;
i=L->listlen;
ﻩL-〉data[i]=x;
}
intlast_search(seqlist*L)
{
inti;
ﻩi=L->listlen;
L->data[0]=x;
while(L->data[i]!
=x)
i——;
returni;
}
int first_search(seqlist *L)
{
inti,n;
n=L->listlen;
ﻩfor(i=1;i<=n;i++)
ﻩ{
ﻩif(L->data[i]==x)
ﻩreturni;
ﻩ}
return -1;
}
intbin_search(seqlist*L)
{
intmid,low=1,high=L—>listlen;
ﻩwhile(low<=high)
ﻩ{
ﻩmid=(low+high)/2;
ﻩif(x==L->data[mid])
ﻩﻩreturnmid;
elseif(x<=L->data[mid])
high=mid—1;
ﻩelse
low=mid+1;
ﻩ}
ﻩreturn—1;
}
intmain(void)
{
seqlist*L;
L=(seqlist*)malloc(sizeof(seqlist));
inta,b,c;
ﻩinitial_list(L);
printf("您想创建有序得查找表(以-1结束):
”);
scanf("%d",&x);
while(x!
=-1)
{
ﻩlist_creat(L);
scanf(”%d”,&x);
}
printf("请输入您想查找得数:
");
ﻩscanf(”%d”,&x);
printf("顺序查找---您所要找数得下标号:
");
a=first_search(L);
if(a==—1)
ﻩprintf("没有您所要查得数!
");
ﻩelse
printf("%d”,a);
printf("\n”);
printf("倒序查找——-您所要找数得下标号:
");
b=last_search(L);
if(b==0)
printf("没有您所要查得数!
");
ﻩelse
ﻩprintf("%d",b);
printf("\n");
printf("折半查找——-您所要找数得下标号:
");
c=bin_search(L);
if(c==-1)
ﻩﻩprintf("没有您所要查得数!
”);
else
ﻩprintf("%d",c);
printf("\n");
ﻩreturn 0;
}
(2)
#include<stdio、h>
#include〈string、h>
#include
typedefstructBTnode
{
intdata;
struct BTnode*lchild,*rchild;
}BTnode,*Bnode;
voidinsert(Bnode&T,BnodeS)
{
ﻩif(T==NULL)
ﻩT=S;
ﻩelseif(S—>data<T-〉data)
ﻩinsert(T—>lchild,S);
elseinsert(T->rchild,S);
}
voidcreate_bat(Bnode&T)
{
Bnodeu;
ﻩintx;
ﻩT=NULL;
printf("putanumber:
");
ﻩscanf(”%d",&x);
ﻩwhile(x!
=-1)
ﻩ{
ﻩu=(BTnode*)malloc(sizeof(BTnode));
ﻩu->data=x;
u->lchild=NULL;
u—〉rchild=NULL;
insert(T,u);
ﻩprintf("putanumber:
”);
ﻩ scanf("%d”,&x);
}
}
Bnodebst_search(BnodeT,intx)
{
ﻩif(T==NULL||T-〉data==x)
returnT;
ﻩelseif((T-〉data)〉x)
ﻩﻩreturnbst_search(T—>lchild,x);
else
ﻩreturnbst_search(T->rchild,x);
}
int main()
{
intx;
ﻩBnodeT,p;
printf("请先建立一棵二叉排序树:
”);
ﻩprintf("\n");
create_bat(T);
ﻩprintf("请输入您要查找得数字:
");
scanf(”%d",&x);
ﻩp=bst_search(T,x);
ﻩif(p!
=NULL)
ﻩprintf("已找到您要查找得数!
");
ﻩelse
ﻩprintf("对不起!
没有您要查找得数!
");
ﻩprintf(”\n");
ﻩreturn0;
}
3、 实验结果。
四、实验总结(实验过程中出现得问题、解决方法、结果或其它)
问题:
1、输入程序时得手误
2、粗心漏写程序
3、程序格式错误
解决方法:
编译后根据错误提示改正
结果:
程序正确运行,截图并完成实验报告