数据结构——查找,顺序查找,折半查找
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五查找的应用
一、实验目的:
1、掌握各种查找方法及适用场合,并能在解决实际问题时灵活应用。
2、增强上机编程调试能力。
二、问题描述
1.分别利用顺序查找和折半查找方法完成查找。
有序表(3,4,5,7,24,30,42,54,63,72,87,95)
输入示例:
请输入查找元素:52
输出示例:
顺序查找:
第一次比较元素95
第二次比较元素87 ……..
查找成功,i=**/查找失败
折半查找:
第一次比较元素30
第二次比较元素63 …..
2.利用序列(12,7,17,11,16,2,13,9,21,4)建立二叉排序树,并完成指定元素的查
询。
输入输出示例同题1的要求。
三、数据结构设计(选用的数据逻辑结构和存储结构实现形式说明)
(1)逻辑结构设计
顺序查找和折半查找采用线性表的结构,二叉排序树的查找则是建立一棵二叉树,采用的非线性逻辑结构。
(2)存储结构设计
采用顺序存储的结构,开辟一块空间用于存放元素。
(3)存储结构形式说明
分别建立查找关键字,顺序表数据和二叉树数据的结构体进行存储数据
四、算法设计
(1)算法列表(说明各个函数的名称,作用,完成什么操作)
序号 名称 函数表示符 操作说明
1 顺序查找 Search_Seq 在顺序表中顺序查找关键字的数据元素
2 折半查找 Search_Bin 在顺序表中折半查找关键字的数据元素
3 初始化 Init 对顺序表进行初始化,并输入元素
4 树初始化 CreateBST 创建一棵二叉排序树
5 插入 InsertBST 将输入元素插入到二叉排序树中
6 查找 SearchBST
在根指针所指二叉排序树中递归查找关键字
数据元素 (2)各函数间调用关系(画出函数之间调用关系)
typedef struct { ElemType *R; int length;
}SSTable;
typedef struct BSTNode{
Elem data; //结点数据域 BSTNode *lchild,*rchild; //左右孩子指针
}BSTNode,*BSTree; typedef struct Elem{ int key; }Elem;
typedef struct {
int key;//关键字域
}ElemType;
(3)算法描述
int Search_Seq(SSTable ST, int key)
{
//在顺序表ST中顺序查找其关键字等于key的数据元素。若找到,则函数值为
//该元素在表中的位置,否则为0
int c=1,i;
for (i=ST.length; i>=0; --i)
{
printf("第%d次比较元素%d\n",c++,ST.R[i-1].key);
if (ST.R[i-1].key==key)//从后往前找
return i;
}
return 0;
}// Search_Seq
int Search_Bin(SSTable ST,int key)
{
// 在有序表ST中折半查找其关键字等于key的数据元素。若找到,则函数值为
// 该元素在表中的位置,否则为0
int low=0,high=ST.length,i=1; //置查找区间初值int mid;
while(low<=high)
{
mid=(low+high) / 2;
printf("......第%d次比较元素%d\n",i++,ST.R[mid].key);
if (key==ST.R[mid].key)
return mid; //找到待查元素
else if (key high = mid -1; //继续在前一子表进行查找 else low =mid +1; //继续在后一子表进行查找 } return 0; //表中不存在待查元素 } //初始化顺序表 void Init(SSTable &W) { int i=0,max; W.R=(ElemType *)malloc(100*sizeof(ElemType)); printf("有序表3,4,5,7,24,30,42,54,63,72,87,95\n"); printf("输入顺序表元素个数:\n"); scanf("%d",&max); printf("依次输入顺序表元素\n"); while(i!=max) { i++; scanf("%d",&W.R[i-1].key); } W.length=max; } //*************************************插入二叉排序树T中 void InsertBST(BSTree &T,int e) { if(T==NULL) { T=new BSTNode; T->data.key=e; T->lchild=NULL; T->rchild=NULL; } else if(T->data.key>e) { InsertBST(T->lchild,e); } else InsertBST(T->rchild,e); } //**********************二叉排序树的创建