数据结构实验七 查找.docx
- 文档编号:10047628
- 上传时间:2023-02-08
- 格式:DOCX
- 页数:12
- 大小:22.38KB
数据结构实验七 查找.docx
《数据结构实验七 查找.docx》由会员分享,可在线阅读,更多相关《数据结构实验七 查找.docx(12页珍藏版)》请在冰豆网上搜索。
数据结构实验七查找
实验七查找
一、实验目的
1。
掌握查找的不同方法,并能用高级语言实现查找算法;
2.熟练掌握二叉排序树的构造和查找方法。
3。
熟练掌握静态查找表及哈希表查找方法.
二、实验内容
设计一个读入一串整数,然后构造二叉排序树,进行查找。
三、实验步骤
1.从空的二叉树开始,每输入一个结点数据,就建立一个新结点插入到当前已生成的二叉排序树中。
2.在二叉排序树中查找某一结点。
3.用其它查找算法进行排序(课后自己做)。
四、实现提示
1。
定义结构
typedef struct node
{int key;
int other;
struct node *lchild,*rchild;
}bstnode;
void inorder(t)
{if (t!
=Null)
{inorder(t→lchild);
printf(“%4d”,t→key);
inorder(t→rchild);
}}
bstnode *insertbst(t,s)
bstnode *s, *t;
{bstnode *f, *p;
p=t;
while(p!
=Null)
{f=p;
if(s→key==p→key) return t;
if(s→key〈p→key) p=p→lchild;
else
p=p→rchild;
}
if(t==Null) return s;
if(s→key〈f→key) f→lchild=s;
else
f→rchild=s;
return t;
}
bstnode *creatord( )
{bstnode *t,*s;
int key;
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);
scanf(“%d”,&key);
}
return t;
}
五、思考与提高
1。
用其它的查找方法完成该算法。
2。
比较各种算法的时间及空间复杂度.
六、完整参考程序
1.折半查找
#include〈conio。
h〉
#include〈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”);
printf(”2.查找一个元素\n”);
printf("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不存在!
\n",ch);//当前元素不存在
break;
}
default:
flag=0;
}
}
printf(”程序运行结束!
按任意键退出!
\n");
}
voidinitial(SSTable&v)
{//初始化有序查找表
inti;
printf(”请输入静态表的元素个数:
”);//输入有序查找表初始化时的长度
scanf(”%d",&v.length);
printf(”请从小到大输入%d个元素(整形数):
\n",v。
length);
getchar();
for(i=1;i〈=v。
length;i++)scanf("%d”,&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;
for(i=1;i〈=v.length;i++)printf(”%d",v.elem[i]);
printf(”\n”);
}
2。
二叉排序树的建立与查找
#include #include〈math。 h〉 #include〈stdio.h〉 #include〈stdlib.h〉 enumBOOL{False,True}; typedefstructBiTNode//定义二叉树节点结构 {chardata;//为了方便,数据域只有关键字一项 structBiTNode*lchild,*rchild;//左右孩子指针域 }BiTNode,*BiTree; BOOLSearchBST(BiTree,char,BiTree,BiTree&);//在二叉排序树中查找元素 BOOLInsertBST(BiTree&,char);//在二叉排序树中插入元素 BOOLDeleteBST(BiTree&,char);//在二叉排序树中删除元素 voidDelete(BiTree&);//删除二叉排序树的根结点 voidInorderBST(BiTree);//中序遍历二叉排序树,即从小到大显示各元素 voidmain() {BiTreeT,p; charch,keyword,j=’y’; BOOLtemp; T=NULL; while(j! ='n') {printf(”1。 display\n”); printf(”2。 search\n"); printf("3.insert\n"); printf(”4.delete\n”); printf("5。 exit\n”); scanf(”%c",&ch);//输入操作选项 switch(ch) {case'1’: if(! T)printf(”TheBSThasnoelem.\n"); else{InorderBST(T);printf("\n");} break; case’2': printf(”Inputthekeywordofelemtobesearched(achar): ”); scanf("%c”,&keyword);//输入要查找元素的关键字 temp=SearchBST(T,keyword,NULL,p); if(! temp)printf("%cisn’texisted! \n”,keyword);//没有找到 elseprintf(”%chasbeenfound! \n”,keyword);//成功找到 break; case’3': printf(”Inputthekeywordofelemtobeinserted(achar): ”); scanf(”%c”,&keyword);//输入要插入元素的关键字 temp=InsertBST(T,keyword); if(! temp)printf(”%chasbeenexisted! \n”,keyword);//该元素已经存在 elseprintf(”Sucesstoinert%c! \n”,keyword);//成功插入 break; case’4’: printf(”Inputthekeywordofelemtobedeleted(achar): "); scanf("%c”,&keyword);//输入要删除元素的关键字 temp=DeleteBST(T,keyword); if(! temp)printf(”%cisn’texisted! \n”,keyword);//该元素不存在 elseprintf("Sucesstodelete%c\n”,keyword);//成功删除 break; default: j=’n’; } } printf("Theprogramisover! \nPressanykeytoshutoffthewindow! \n"); getchar();getchar(); } voidInorderBST(BiTreeT) {//以中序方式遍历二叉排序树T,即从小到大显示二叉排序树的所有元素 if(T—〉lchild)InorderBST(T—〉lchild); printf(”%2c",T—>data); if(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 } BOOLInsertBST(BiTree&T,chare) {//当二叉排序树T中不存在元素e时,插入e并返回True,否则返回False BiTreep,s; if(! SearchBST(T,e,NULL,p))//查找不成功 {s=(BiTree)malloc(sizeof(BiTNode)); s-〉data=e; s—〉lchild=s—>rchild=NULL; if(! p)T=s;//被插结点*s为新的根结点 elseif(e〈p—>data)p—〉lchild=s;//被插结点*s为左孩子 elsep-〉rchild=s;//被插结点*s为右孩子 returnTrue;//成功插入 } elsereturnFalse;//树中已存在关键字为e的数据元素 } BOOLDeleteBST(BiTree&T,charkey) {//若二叉排序树T中存在关键字等于key的数据元素时,则删除该数据元素结点 //并返回True,否则返回False BOOLtmp1,tmp2; tmp1=tmp2=False; if(! T)returnFalse;//不存在关键字等于key的数据元素 else {if(key==T—〉data){Delete(T);returnTrue;} //找到关键字等于key的数据元素并删除它 elseif(key〈T—>data)tmp1=DeleteBST(T—>lchild,key);//继续在左子树中删除 elsetmp2=DeleteBST(T—>rchild,key);//继续在右子树中删除 if(tmp1||tmp2)returnTrue;//在子树中删除成功,返回True elsereturnFalse;//不存在该元素 } } voidDelete(BiTree&p) {//在二叉排序树中删除结点p,并重接它的左或右子树 BiTrees,q; if(! p-〉rchild)//右子树空,只需重接它的左子树 {q=p; p=p—〉lchild; free(q); } elseif(! p—>lchild)//左子树空,只需重接它的右子树 {q=p; p=p—〉rchild; free(q); } else//左右子树均不空 {q=p; s=p->lchild; while(s-〉rchild) {q=s;s=s—>rchild;}//转左,然后向右走到尽头 p—〉data=s—〉data;//s指向被删结点的“前驱" if(q! =p)q->rchild=s—〉rchild;//重接*q的右子树 elseq—〉lchild=s—〉lchild;//重接*q的左子树 free(s); } }
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构实验七 查找 数据结构 实验