数据结构查找算法实验报告Word格式文档下载.docx
《数据结构查找算法实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构查找算法实验报告Word格式文档下载.docx(15页珍藏版)》请在冰豆网上搜索。
这里顺序查找和折半查找均使用了数组存储的顺序表,而二叉树则是采用了链表存储的树形结构。
为了直观起见,在用户输入了数据后,分别输出已经生成的数组和树。
折半查找由于只能查找有序表,因此在查找前先调用函数对数据进行了排序。
在查找后对查找数据进行了统计。
二叉排序树应该说由于有了之前二叉树的基础,并没有费太大力气,主要是在构造二叉树的时候,要对新加入的节点数据和跟数据进行比较,如果比根节点数据大则放在右子树里,如果比根节点数据小则放入左子树。
建立了二叉树后,遍历和查找就很简单了。
而哈希表,应该说自我感觉掌握的很不好,程序主要借鉴了书上和ppt上的代码,但感觉输出还是有问题,接下来应该进一步学习哈希表的相关知识。
其实原本还设计了其他几个查找和排序算法,但做到哈希表就感觉很困难了,因此没有继续往下做,而且程序还非常简陋,二叉树和哈希表的统计部分也比较薄弱,这也是接下来我要改进的地方。
具体代码见源代码部分。
5.详细设计表示:
6.用户手册:
程序运行后,用户首先要输入数据的个数。
接下来输入一组数据并根据提示进行顺序查找,二分查找,二叉排序树查找和哈希表查找等操作,由于操作直接简单这里不再详述。
7.调试报告:
应该说在调试这个程序的过程中自己发现了很多不足,这次实验让我学到了不少东西,但应该说这个程序可实现的功能还是偏少,不太实用,接下来有待改进。
8.源代码清单和结果:
#include<
stdio.h>
#defineLENGTH100
stdlib.h>
time.h>
#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;
lchild=node->
rchild=NULL;
if(!
*tree)
*tree=node;
else
{
BSTreecursor=*tree;
while
(1)
if(item<
cursor->
data)
if(NULL==cursor->
lchild)
lchild=node;
break;
}
cursor=cursor->
lchild;
rchild)
rchild=node;
rchild;
return;
}
voidshowbitree(BiTreeT)
//递归显示二叉树的广义表形式
if(!
T){printf("
空"
);
return;
printf("
T->
data);
//打印根节点
if(T->
lchild||T->
{
putchar('
('
showbitree(T->
lchild);
//递归显示左子树
'
rchild);
//递归显示右子树
)'
}
/*查找指定值*/
BSTreeSearch(BSTreetree,ElemTypeitem)
BSTreecursor=tree;
while(cursor)
if(item==cursor->
returncursor;
elseif(item<
returnNULL;
/*中缀遍历*/
voidInorder(BSTreetree)
if(cursor)
Inorder(cursor->
printf(OUTFMT,cursor->
/*回收资源*/
voidCleanup(BSTreetree)
BSTreecursor=tree,temp=NULL;
Cleanup(cursor->
free(cursor);
voidsearchtree(BSTreeroot)
charchoice;
中序遍历的结果为:
\n"
Inorder(root);
\n\n"
ElemTypeitem;
BSTreeret;
/*二叉排序树的查找测试*/
do
{
\n请输入查找数据:
"
scanf("
&
item);
getchar();
Searching...\n"
ret=Search(root,item);
if(NULL==ret)
查找失败!
else
查找成功!
\n继续测试按y,退出按其它键。
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;
以下为哈希表输出\n"
for(i=0;
n;
c=arr[i]%7;
A:
if(a[c]==0)a[c]=arr[i];
else{c=(c+1)%7;
j++;
a[c]++;
gotoA;
\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;
开始使用顺序查询.\n请输入你想要查找的数据.\n"
&
for(inti=0;
Length;
if(fp[i]==data)
经过%d次查找,查找到数据%d.\n"
i+1,data);
return;
经过%d次查找,未能查找到数据%d.\n"
i,data);
voidSearch(int*fp,intlength)
由于二分查找法要求数据是有序的,现在开始为数组排序.\n"
Sort(fp,length);
数组现在已经是从小到大排列,下面将开始查找.\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]>
top=middle-1;
voidSort(int*fp,intlength)
现在开始为数组排序,排列结果将是从小到大.\n"
inttemp;
length;
for(intj=0;
j<
length-i-1;
j++)
if(fp[j]>
fp[j+1])
temp=fp[j];
fp[j]=fp[j+1];
fp[j+1]=temp;
排序完成!
\n下面输出