当前位置:文档之家› 数据结构——查找,顺序查找,折半查找

数据结构——查找,顺序查找,折半查找

实验五查找的应用一、实验目的: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的数据元素。

若找到,则函数值为//该元素在表中的位置,否则为0int 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_Seqint Search_Bin(SSTable ST,int key){// 在有序表ST中折半查找其关键字等于key的数据元素。

若找到,则函数值为// 该元素在表中的位置,否则为0int 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<ST.R[mid].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);}elseInsertBST(T->rchild,e);}//**********************二叉排序树的创建void CreateBST(BSTree &T ){//依次读入一个关键字为key的结点,将此结点插入二叉排序树T中T=NULL;int e,i=1,max;printf("输入的个数为:");scanf("%d",&max);while(i<=max){printf("输入第%d个数:",i++);scanf("%d" ,&e);InsertBST(T, e); //将此结点插入二叉排序树T中}//while}//CreatBST//*********************二叉排序树的递归查找BSTree SearchBST(BSTree T,char key){//在根指针T所指二叉排序树中递归地查找某关键字等于key的数据元素//若查找成功,则返回指向该数据元素结点的指针,否则返回空指针if(T)printf("第%d次查询:%d\n",N++,T->data.key);if((!T)|| key==T->data.key)return T; //查找结束else if(key<T->data.key)return SearchBST(T->lchild,key); //在左子树中继续查找elsereturn SearchBST(T->rchild,key); //在右子树中继续查找}五、调试记录(调试过程中遇到的主要问题,是如何解决的,对设计和编码的回顾讨论和分析;改进设想等)调试中出现了几次程序查找失败的情况,究其原因,是奇数个元素的时候,二分查找未定义好,在后续改进之后,程序能实现预期的效果六、运行说明(列出测试结果,包括输入和输出。

这里的测试数据应该完整和严格,最好多于示例中所列数据)以下附上源代码:#include<stdio.h>#include<stdlib.h>#include<string.h>int N;typedef struct{int key;//关键字域}ElemType;typedef struct Elem{int key;}Elem;typedef struct BSTNode{Elem data; //结点数据域BSTNode *lchild,*rchild; //左右孩子指针}BSTNode,*BSTree;typedef struct{ElemType *R;int length;}SSTable;int Search_Seq(SSTable ST, int key){//在顺序表ST中顺序查找其关键字等于key的数据元素。

若找到,则函数值为//该元素在表中的位置,否则为0int 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_Seqint Search_Bin(SSTable ST,int key){// 在有序表ST中折半查找其关键字等于key的数据元素。

若找到,则函数值为// 该元素在表中的位置,否则为0int 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<ST.R[mid].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);}elseInsertBST(T->rchild,e);}// **********************二叉排序树的创建void CreateBST(BSTree &T ){//依次读入一个关键字为key的结点,将此结点插入二叉排序树T中T=NULL;int e,i=1,max;printf("输入的个数为:");scanf("%d",&max);while(i<=max){printf("输入第%d个数:",i++);scanf("%d" ,&e);InsertBST(T, e); //将此结点插入二叉排序树T中}//while}//CreatBST//*********************二叉排序树的递归查找BSTree SearchBST(BSTree T,char key){//在根指针T所指二叉排序树中递归地查找某关键字等于key的数据元素//若查找成功,则返回指向该数据元素结点的指针,否则返回空指针if(T)printf("第%d次查询:%d\n",++N,T->data.key);if((!T)|| key==T->data.key)return T; //查找结束else if(key<T->data.key)return SearchBST(T->lchild,key); //在左子树中继续查找elsereturn SearchBST(T->rchild,key); //在右子树中继续查找}void main(){int N=1;printf("****************查找实验*****************\n");SSTable W;int t,i,a;while(1){printf("*****功能:1--顺序、二分查找 2--二分查找\n");scanf("%d",&a);switch(a){case 1:Init(W);printf("****************有序表的顺序查找*****************\n");printf("请输入查找元素\n");scanf("%d",&t);if(i=Search_Seq(W, t))printf("位置在第 %d位\n",i);elseprintf("不存在\n");printf("****************有序表的二分查找*****************\n");if(i=Search_Bin(W,t)+1)printf("位置在第%d位\n",i);elseprintf("不存在\n");break;case 2:printf("***利用序列(12,7,17,11,16,2,13,9,21,4)建立二叉排序树,并完成指定元素的查询***********\n");BSTree T ;int x;CreateBST(T);printf("输入查询元素:");scanf("%d",&x);if(SearchBST(T,x) )printf("查询成功");else printf("查询失败");break;}}}。

相关主题