数据结构实验七查找Word格式文档下载.docx
《数据结构实验七查找Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构实验七查找Word格式文档下载.docx(12页珍藏版)》请在冰豆网上搜索。
*insertbst(t,s)
*s,
*t;
{bstnode
*f,
*p;
p=t;
while(p!
{f=p;
if(s→key==p→key)
return
t;
if(s→key<
p→key)
p=p→lchild;
else
p=p→rchild;
}
if(t==Null)
s;
f→key)
f→lchild=s;
f→rchild=s;
return
*creatord(
)
*t,*s;
int
t=Null;
scanf(“%d”,&
key);
while(key!
=0)
{s=malloc(sizeof(bitree));
s→key=key;
s→lchild=Null;
s→rchild=Null;
scanf(“%d”,&
data);
s→other=data;
t=insertbst(t,s);
}
五、思考与提高
1.用其它的查找方法完成该算法。
2.比较各种算法的时间及空间复杂度。
六、完整参考程序
1.折半查找
#include<
conio.h>
stdio.h>
#defineMAX30//定义有序查找表的最大长度
typedefstruct{
charelem[MAX];
//有序查找表
intlength;
//length指示当前有序查找表的长度
}SSTable;
voidinitial(SSTable&
);
//初始化有序查找表
intsearch(SSTable,int);
//在有序查找表中查找元素
voidprint(SSTable);
//显示有序查找表中所有元素
voidmain()
{SSTableST;
//ST为一有序查找表
intch,loc,flag=1;
charj;
initial(ST);
while(flag)
{printf("
请选择:
\n"
printf("
1.显示所有元素\n"
2.查找一个元素\n"
3.退出\n"
scanf("
%c"
&
j);
switch(j)
{case'
1'
:
print(ST);
break;
//显示所有元素
case'
2'
{printf("
请输入要查找的元素:
"
scanf("
%d"
ch);
//输入要查找的元素的关键字
loc=search(ST,ch);
//查找
if(loc!
=0)printf("
该元素所在位置是:
%d\n"
loc);
//显示该元素位置
elseprintf("
%d不存在!
ch);
//当前元素不存在
break;
}
default:
flag=0;
}
程序运行结束!
按任意键退出!
}
v)
{//初始化有序查找表
inti;
请输入静态表的元素个数:
//输入有序查找表初始化时的长度
v.length);
请从小到大输入%d个元素(整形数):
v.length);
getchar();
for(i=1;
i<
=v.length;
i++)scanf("
v.elem[i]);
//从小到大输入有序查找表的各元素
intsearch(SSTablev,intch)
{//在有序查找表中查找ch的位置,成功返回其位置,失败返回0
intlow,high,mid;
low=1;
high=v.length;
//置区间初值
while(low<
=high)
{mid=(low+high)/2;
if(v.elem[mid]==ch)returnmid;
//找到待查元素
elseif(v.elem[mid]>
ch)high=mid-1;
//继续在前半区间进行查找
elselow=mid+1;
//继续在后半区间进行查找
return0;
//找不到时,i为0
voidprint(SSTablev)//显示当前有序查找表所有元素
{inti;
i++)printf("
%d"
v.elem[i]);
2.二叉排序树的建立与查找
math.h>
stdlib.h>
enumBOOL{False,True};
typedefstructBiTNode//定义二叉树节点结构
{chardata;
//为了方便,数据域只有关键字一项
structBiTNode*lchild,*rchild;
//左右孩子指针域
}BiTNode,*BiTree;
BOOLSearchBST(BiTree,char,BiTree,BiTree&
//在二叉排序树中查找元素
BOOLInsertBST(BiTree&
char);
//在二叉排序树中插入元素
BOOLDeleteBST(BiTree&
//在二叉排序树中删除元素
voidDelete(BiTree&
//删除二叉排序树的根结点
voidInorderBST(BiTree);
//中序遍历二叉排序树,即从小到大显示各元素
{BiTreeT,p;
charch,keyword,j='
y'
;
BOOLtemp;
T=NULL;
while(j!
='
n'
)
{printf("
1.display\n"
2.search\n"
3.insert\n"
4.delete\n"
5.exit\n"
//输入操作选项
switch(ch)
if(!
T)printf("
TheBSThasnoelem.\n"
else{InorderBST(T);
printf("
Inputthekeywordofelemtobesearched(achar):
keyword);
//输入要查找元素的关键字
temp=SearchBST(T,keyword,NULL,p);
if(!
temp)printf("
%cisn'
texisted!
keyword);
//没有找到
%chasbeenfound!
//成功找到
3'
Inputthekeywordofelemtobeinserted(achar):
//输入要插入元素的关键字
temp=InsertBST(T,keyword);
%chasbeenexisted!
//该元素已经存在
Sucesstoinert%c!
//成功插入
4'
Inputthekeywordofelemtobedeleted(achar):
//输入要删除元素的关键字
temp=DeleteBST(T,keyword);
//该元素不存在
Sucesstodelete%c\n"
//成功删除
default:
j='
Theprogramisover!
\nPressanykeytoshutoffthewindow!
getchar();
voidInorderBST(BiTreeT)
{//以中序方式遍历二叉排序树T,即从小到大显示二叉排序树的所有元素
if(T->
lchild)InorderBST(T->
lchild);
%2c"
T->
rchild)InorderBST(T->
rchild);
BOOLSearchBST(BiTreeT,charkey,BiTreef,BiTree&
p)
{//在根指针T所指二叉排序树中递归的查找其关键字等于key的元素,若查找成功
//则指针p指向该数据元素,并返回True,否则指针指向查找路径上访问的最后一
//个结点并返回False,指针f指向T的双亲,其初始调用值为NULL
BOOLtmp1,tmp2;
tmp1=tmp2=False;
if(!
T){p=f;
returnFalse;
}//查找不成功
elseif(key==T->
data){p=T;
returnTrue;
}//查找成功
elseif(key<
T->
data)tmp1=SearchBST(T->
lchild,key,T,p);
//在左子树中继续查找
elsetmp2=SearchBST(T->
rchild,key,T,p);
//在右子树中继续查找
if(tmp1||tmp2)returnTrue;
//若在子树中查找成功,向上级返回True
elsereturnFalse;
//否则返回False
T,chare)
{//当二叉排序树T中不存在元素e时,插入e并返回True,否则返回False
BiTreep,s;
SearchBST(T,e,NULL,p))//查找不成功
{s=(BiTree)malloc(sizeof(BiTNode));
s->
data=e;
lchild=s->
rchild=NULL;
p)T=s;
//被插结点*s为新的根结点
elseif(e<
p->
data)p->
lchild=s;
//被插结点*s为左孩子
elsep->
rchild=s;
//被插结点*s为右孩子
returnTrue;
//树中已存在关键字为e的数据元素
T,charkey)
{//若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点
//并返回True,否则返回False
T)returnFalse;
//不存在关键字等于key的数据元素
else
{if(key==T->
data){Delete(T);
//找到关键字等于key的数据元素并删除它
data)tmp1=DeleteBST(T->
lchild,key);
//继续在左子树中删除
elsetmp2=DeleteBST(T->
rchild,key);
//继续在右子树中删除
//在子树中删除成功,返回True
//不存在该元素
{//在二叉排序树中删除结点p,并重接它的左或右子树
BiTrees,q;
rchild)//右子树空,只需重接它的左子树
{q=p;
p=p->
lchild;
free(q);
elseif(!
lchild)//左子树空,只需重接它的右子树
rchild;
else//左右子树均不空
s=p->
while(s->
rchild)
{q=s;
s=s->
}//转左,然后向右走到尽头
p->
data=s->
data;
//s指向被删结点的“前驱”
if(q!
=p)q->
rchild=s->
//重接*q的右子树
elseq->
//重接*q的左子树
free(s);
(注:
可编辑下载,若有不当之处,请指正,谢谢!