数据结构查找实验.docx
《数据结构查找实验.docx》由会员分享,可在线阅读,更多相关《数据结构查找实验.docx(10页珍藏版)》请在冰豆网上搜索。
![数据结构查找实验.docx](https://file1.bdocx.com/fileroot1/2023-2/2/37d34a01-8cf3-4948-a83b-46469ae8aee6/37d34a01-8cf3-4948-a83b-46469ae8aee61.gif)
数据结构查找实验
数据结构实验报告
课程数据结构实验实验名称查找
系别计算机学院专业班级组别_____________
一.实验目的:
1.掌握顺序查找,二分查找的算法
2.能运用线性表的查找方法解决实际问题
二.实验内容
(-)实验题目一:
写给出一个无序表A中采用顺序查找算法查找值为x的元素的算法
1.要点分析:
顺序查找首先从表的先端开始,依次与给定值x进行比较,直达找到与其相等的元素值,返回该元素值的下标,查找成功。
否则给出查找失败信息。
2.程序源代码:
#include
#defineN10
intsearch(intA[],intx,intn)
{
inti=0;
while(i=x)//找遍且找到
i++;
if(i>=n)
return-1;
else
returni;
}
voidmain()
{
inta[N]={2,38,42,44,25,12,3,1,23,89},d,i,k;
printf("A数组下标:
\n");
for(i=0;iprintf("%d",i);
printf("\n");
printf("A数组值:
\n");
for(i=0;iprintf("%d",a[i]);
printf("\n输入要查找的值:
");
scanf("%d",&d);
k=search(a,d,N);
if(k>=0)
printf("a[%d]=%d\n",k,d);
else
printf("%d未找到\n",d);
}
3.实验结果
(2)实验题目二:
编写一个算法,利用二分查找算法在一个有序表中插入一个元素x,并保持表的有序性。
1.要点分析:
首先,假设表中元素是按升序排列,将表中间位置记录的关键字与查找关键字比较,如果两者相等,则查找成功;否则利用中间位置记录将表分成前、后两个子表,如果中间位置记录的关键字大于查找关键字,则进一步查找前一子表,否则进一步查找后一子表。
重复以上过程,直到找到满足条件的记录,使查找成功,或直到子表不存在为止,此时查找不成功。
2.程序源代码:
#include
#include
#definemaxnum100
intinput(int*);//输入数据
intsearch(int*,int,int);//查找插入位置
voidplug(int*,int,int);//插入数据
voidmain()
{
intdata[maxnum],m;
intinsert=1;
m=input(data);
printf("请输入要插入的数据:
\n");//输入插入的数据
scanf("%d",data);//输入插入的数据存放在data数组0号位置
insert=search(data,1,m);//找到数据要插入的位置
plug(data,insert,m);//运用递归的方法插入数据
printf("最后结果:
\n");
for(insert=1;insert<=m+1;insert++)
printf("%d",*(data+insert));
getchar();
}
intinput(int*data)
{
inti,m;
printf("请输入该有序表的长度:
\n");
scanf("%d",&m);
printf("请按大小顺序输入%d个数据\n",m);
for(i=1;i<=m;i++)
scanf("%d",data+i);
returnm;
}
intsearch(int*data,intlow,inthigh)
{
intmid;
if(low>high)//没有找到插入位置
returnlow;
else
{
mid=(low+high)/2;
if(*(data+mid)==*data)
returnmid;
elseif(*(data+mid)<*data)
low=mid+1;
elseif(*(data+mid)>*data)
high=mid-1;
}
search(data,low,high);
}
voidplug(int*data,intinsert,intm)//移动并插入数据
{
inti;
for(i=m;i>=insert;i--)
*(data+i+1)=*(data+i);
*(data+insert)=*data;
}
3.实验结果
(三)实验题目:
设计一个算法,读入一串整数,构造其对应的二叉排序树
1.要点分析
二叉排序树的递归式定义。
二叉排序树又称二叉查找树,它可以是一棵空树,若非空时具有下述性质:
1、若根结点的左子树非空,则左子树上所有结点的关键字值均小于等于根结点的关键字值。
2、若根结点的右子树非空,则右子树上所有结点的关键字值均大于等于根结点的关键字值。
3、根结点的左、右子树也分别为二叉排序树。
二叉排序树建立说明:
当需要插入一个节点到二叉排序树时,需要先找到它的父节点。
其实它就是用插入的节点不断的和每一个节点比较(第一次当然是和根节点比较啦),如果小于等于则进入左边子树,再与左边子树的根节点比较,直到找到它要放的位置,
否则进入右子树,进行上述操作
2.源程序代码
#include
#include
typedefstructnode//二叉排序树的结点类型
{
intkey;
structnode*lchild,*rchild;
}BSTNode;
typedefBSTNode*BSTree;
voidinsertBST(BSTree*prt,intkey)
{
BSTNode*f,*p=*prt;
while(p)//判断数据插入的位置
{
if(p->key==key)//树中已有此节点无需插入
return;
f=p;
p=(key<(p->key))?
p->lchild:
p->rchild;
}
p=(BSTNode*)malloc(sizeof(BSTNode));//建立新的结点
p->key=key;
p->lchild=p->rchild=NULL;
if(*prt==NULL)
*prt=p;
elseif(keykey)
f->lchild=p;
else
f->rchild=p;
}
BSTreecreateBST(void)
{
BSTreeT=NULL;
intkey;
printf("请输入根节点\n");//先建立一个根节点
scanf("%d",&key);
while(key)
{
insertBST(&T,key);
printf("请输入一个数据以0结束:
");
scanf("%d",&key);
}
returnT;
}
voidinorder(BSTreeT)//中序遍历
{
if(T)
{
inorder(T->lchild);
printf("%3d",T->key);
inorder(T->rchild);
}
}
voidmain()
{
BSTreeT;
T=createBST();
printf("中序遍历结果:
\n");
inorder(T);
}
3.实验结果
三.个人小结
通过这次实验,我对于各类查找的算法都有了很清晰的认识,在实验的过程中我深刻地体会到了作为一个合格的程序员,不仅仅要理解算法还要学会对其灵活运用,一定要多动手,在实践的过程中你会遇到各种意想不到的意外,当运用自己的办法把问题都解决好了之后,自己的编程能力也有了一定的提高。