实验十一 查找算法 昆工版本.docx
《实验十一 查找算法 昆工版本.docx》由会员分享,可在线阅读,更多相关《实验十一 查找算法 昆工版本.docx(14页珍藏版)》请在冰豆网上搜索。
实验十一查找算法昆工版本
昆明理工大学信息工程与自动化学院学生实验报告
(2013—2014学年第三学期)
课程名称:
数据结构开课实验室:
信自楼4422013年12月10日
年级、专业、班
计科122班
学号
201210405204
姓名
邹华宇
成绩
实验项目名称
简单的查找算法
指导教师
胡守成
教师评语
教师签名:
年月日
注:
报告内容按实验须知中七点要求进行。
一、实验目的和要求
1.掌握各种查找算法理解和实现;
2.增强上机编程调试能力;
二、实验原理及基本技术路线图(方框原理图)
设计思想:
开始的时候提示输入一组数据。
并存入一维数组中,接下来调用一系列查找算法对其进行处理。
顺序查找只是从头到尾进行遍历。
二分查找则是先对数据进行排序,然后利用三个标志,分别指向最大,中间和最小数据,接下来根据待查找数据和中间数据的比较不断移动标志,直至找到。
二叉排序树则是先构造,构造部分花费最多的精力,比根节点数据大的结点放入根节点的右子树,比根节点数据小的放入根节点的左子树,其实完全可以利用递归实现,这里使用的循环来实现的,感觉这里可以尝试用递归。
当二叉树建好后,中序遍历序列即为由小到大的有序序列,查找次数不会超过二叉树的深度。
这里还使用了广义表输出二叉树,以使得更直观。
哈希表则是利用给定的函数式建立索引,方便查找。
三、所用仪器、材料(设备名称、型号、规格等)
联想计算机一台
MicrosoftVisualc++6.0
四、程序源代码(*cpp)
#include
#defineLENGTH100
#include
#include
#defineINFMT"%d"
#defineOUTFMT"%d"
/*#defineNULL0L*/
#defineBOOLint
#defineTRUE1
#defineFALSE0
#defineLEN10000
typedefintElemType;
typedefstructBSTNode
{
ElemTypedata;
structBSTNode*lchild,*rchild;
}BSTNode,*BSTree;
typedefBSTreeBiTree;
/*插入新节点*/
voidInsert(BSTree*tree,ElemTypeitem)
{
BSTreenode=(BSTree)malloc(sizeof(BSTNode));
node->data=item;
node->lchild=node->rchild=NULL;
if(!
*tree)
*tree=node;
else
{
BSTreecursor=*tree;
while
(1)
{
if(itemdata)
{
if(NULL==cursor->lchild)
{
cursor->lchild=node;
break;
}
cursor=cursor->lchild;
}
else
{
if(NULL==cursor->rchild)
{
cursor->rchild=node;
break;
}
cursor=cursor->rchild;
}
}
}
return;
}
voidshowbitree(BiTreeT)
//递归显示二叉树的广义表形式
{
if(!
T){printf("空");return;}
printf("%d",T->data);//打印根节点
if(T->lchild||T->rchild)
{
putchar('(');
showbitree(T->lchild);//递归显示左子树
putchar(',');
showbitree(T->rchild);//递归显示右子树
putchar(')');
}
}
/*查找指定值*/
BSTreeSearch(BSTreetree,ElemTypeitem)
{
BSTreecursor=tree;
while(cursor)
{
if(item==cursor->data)
returncursor;
elseif(itemdata)
cursor=cursor->lchild;
else
cursor=cursor->rchild;
}
returnNULL;
}
/*中缀遍历*/
voidInorder(BSTreetree)
{
BSTreecursor=tree;
if(cursor)
{
Inorder(cursor->lchild);
printf(OUTFMT,cursor->data);
Inorder(cursor->rchild);
}
}
/*回收资源*/
voidCleanup(BSTreetree)
{
BSTreecursor=tree,temp=NULL;
if(cursor)
{
Cleanup(cursor->lchild);
Cleanup(cursor->rchild);
free(cursor);
}
}
voidsearchtree(BSTreeroot)
{
charchoice;
printf("中序遍历的结果为:
\n");
Inorder(root);
printf("\n\n");
ElemTypeitem;
BSTreeret;
/*二叉排序树的查找测试*/
do
{
printf("\n请输入查找数据:
");
scanf("%d",&item);
getchar();
printf("Searching...\n");
ret=Search(root,item);
if(NULL==ret)
printf("查找失败!
");
else
printf("查找成功!
");
printf("\n继续测试按y,退出按其它键。
\n");
choice=getchar();
}while(choice=='y'||choice=='Y');
Cleanup(root);
}
searchhash(int*arr,intn)
{
inta[10];
intb,i,j,c;
j=1;
for(i=0;i<9;i++)
a[i]=0;
printf("以下为哈希表输出\n");
for(i=0;i{
c=arr[i]%7;
A:
if(a[c]==0)a[c]=arr[i];
else{c=(c+1)%7;j++;a[c]++;gotoA;}
printf("\n%d在哈希表的第%d位,第%d次放入哈希表\n",arr[i],c,j);
j=1;}
}
voidSequenceSearch(int*fp,intLength);
voidSearch(int*fp,intlength);
voidSort(int*fp,intlength);
voidSequenceSearch(int*fp,intLength)
{
intdata;
printf("开始使用顺序查询.\n请输入你想要查找的数据.\n");
scanf("%d",&data);
for(inti=0;iif(fp[i]==data)
{
printf("经过%d次查找,查找到数据%d.\n",i+1,data);
return;
}
printf("经过%d次查找,未能查找到数据%d.\n",i,data);
}
voidSearch(int*fp,intlength)
{
intdata;
printf("开始使用顺序查询.\n请输入你想要查找的数据.\n");
scanf("%d",&data);
printf("由于二分查找法要求数据是有序的,现在开始为数组排序.\n");
Sort(fp,length);
printf("数组现在已经是从小到大排列,下面将开始查找.\n");
intbottom,top,middle;
bottom=0;
top=length;
inti=0;
while(bottom<=top)
{
middle=(bottom+top)/2;
i++;
if(fp[middle]{
bottom=middle+1;
}
elseif(fp[middle]>data)
{
top=middle-1;
}
else
{
printf("经过%d次查找,查找到数据%d.\n",i,data);
return;
}
}
printf("经过%d次查找,未能查找到数据%d.\n",i,data);
}
voidSort(int*fp,intlength)
{
printf("现在开始为数组排序,排列结果将是从小到大.\n");
inttemp;
for(inti=0;ifor(intj=0;jif(fp[j]>fp[j+1])
{
temp=fp[j];
fp[j]=fp[j+1];
fp[j+1]=temp;
}
printf("排序完成!
\n下面输出排序后的数组:
\n");
for(intk=0;k{
printf("%5d",fp[k]);
}
printf("\n");
}
structhash
{intkey;
intsi;
};
structhashhlist[11];
inti,adr,sum,d;
floataverage;
voidchash(int*arr,intn)
{for(i=0;i<11;i++)
{hlist[i].key=0;
hlist[i].si=0;
}
for(i=0;i{sum=0;
adr=(3*arr[i])%11;
d=adr;
if(hlist[adr].key==0)
{hlist[adr].key=arr[i];
hlist[adr].si=1;
}
else{do
{d=(d+(arr[i]*7)%10+1)%11;
sum=sum+1;
}while(hlist[d].key!
=0);
hlist[d].key=arr[i];
hlist[d].si=sum+1;
}}
}
voiddhash(int*arr,intn)
{printf("哈希表显示为:
");
for(i=0;i<11;i++)
printf("%4d",i);printf("\n");
printf("哈希表关键字:
");
for(i=0;i<11;i++)
printf("%4d",hlist[i].key);
printf("\n");
printf("查找长度是:
");
for(i=0;i<11;i++)
printf("%4d",hlist[i].si);
printf("\n");
average=0.0;
for(i=0;i<11;i++)
average=average+hlist[i].si;
average=average/n;
printf("平均长度:
asl(%d)=%f\n",n,average);
}
voidmain()
{
intcount;
intarr[LENGTH];
ElemTypeitem;
charchoice;
BSTreeroot=NULL,ret;/*必须赋予NULL值,否则出错*/
BOOLfinish=FALSE;
printf("请输入你的数据的个数:
\n");
scanf("%d",&count);
printf("请输入%d个数据\n",count);
for(inti=0;i{
scanf("%d",&arr[i]);
item=arr[i];
if(-10000!
=item)
Insert(&root,item);
}
printf("当前已经生成的数列:
\n");
for(i=0;i{
printf("%d",arr[i]);
}
printf("\n当前已经生成的二叉树:
\n");
showbitree(root);
printf("\n\n");
intchoise=0;
do
{
printf("\n1.使用顺序查询.\n2.使用二分查找法查找.\n3.利用二叉排序树查找.\n4.利用哈希表查找.\n5.退出\n");
scanf("%d",&choise);
if(choise==1)
SequenceSearch(arr,count);
elseif(choise==2)
Search(arr,count);
elseif(choise==3)
searchtree(root);
elseif(choise==4)
{chash(arr,count);dhash(arr,count);}
elseif(choise==5)
break;
}while(choise==1||choise==2||choise==3||choise==4||choise==5);
}
五、运行结果
当程序开始运行时,显示如下:
当用户输入10并再次输入数据3214765098后,输出结果如下:
当用户输入1,在输入9后,输出结果如下:
当用户输入2,并输入3后,输出显示如下:
当用户在输入3,并且在输入6后,显示如下:
当用户输入4后,输出的哈希表如下:
当输入5后,程序结束。
六、实验总结
在做这个程序的时候,虽然遇到一些问题,但最后都被我解决,自信心上得到比较大的提升,这也是这次实践最大的收获。
同时,知识上的收获也是不可忽视的,亲手解决问题的过程也是很好的学习过程,并且积累了一些经验,相信会为以后的学习发展带来非常积极的帮助。