数据结构查找实验.docx
- 文档编号:9067677
- 上传时间:2023-02-03
- 格式:DOCX
- 页数:10
- 大小:219.40KB
数据结构查找实验.docx
《数据结构查找实验.docx》由会员分享,可在线阅读,更多相关《数据结构查找实验.docx(10页珍藏版)》请在冰豆网上搜索。
数据结构查找实验
数据结构实验报告
课程数据结构实验实验名称查找
系别计算机学院专业班级组别_____________
一.实验目的:
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;i printf("%d",i); printf("\n"); printf("A数组值: \n"); for(i=0;i printf("%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(key 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.实验结果 三.个人小结 通过这次实验,我对于各类查找的算法都有了很清晰的认识,在实验的过程中我深刻地体会到了作为一个合格的程序员,不仅仅要理解算法还要学会对其灵活运用,一定要多动手,在实践的过程中你会遇到各种意想不到的意外,当运用自己的办法把问题都解决好了之后,自己的编程能力也有了一定的提高。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 查找 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)