一、实验目的

1、掌握查找表、动态查找表、静态查找表和平均查找长度的概念。
2、掌握线性表中顺序查找和折半查找的方法。
3、学会哈希函数的构造方法,处理冲突的机制以及哈希表的查找。

二、实验内容和要求

1.静态查找表技术

依据顺序查找算法和折半查找算法的特点,对下面的两个查找表选择一个合适的算法,设计出完整的C源程序。并完成问题:
查找表1 : { 8 ,15 ,19 ,26 ,33 ,41 ,47 ,52 ,64 ,90 } ,查找key = 41
查找表2 : {12 ,76 ,29 ,15 ,62 ,35 ,33 ,89 ,48 ,20 } ,查找key =35
查找key=41的算法:折半查找算法 比较次数:3
查找key=35的算法:顺序查找算法 比较次数:5

顺序查找算法算法实现代码
#include<bits/stdc++.h>
#define MAX_NUM 100
using namespace std;
typedef int KeyType;typedef struct
{KeyType key;
}ElemType;
typedef struct
{ElemType elem[MAX_NUM];int length;
}SSTable;
int seq_search(SSTable ST,KeyType key)
{int i;ST.elem[0].key=key;for(i=ST.length;ST.elem[i].key!=key;i--);return i;
}
int main()
{SSTable ST;KeyType tkey;int n,i;ST.length=0;printf("请输入查找表元素个数:");scanf("%d",&n);printf("\n查找表输入:\n");while(n--)scanf("%d",&ST.elem[ST.length++].key);printf("\n输入查找元素:");scanf("%d",&tkey);i=seq_search(ST,tkey);if(i==0)printf("\n未找到此元素\n");elseprintf("\n在查找表中下标为%d",ST.length+1-i);return 0;
}
折半查找算法算法实现代码
#include<bits/stdc++.h>
#define MAX_NUM 100
using namespace std;
typedef int KeyType;typedef struct
{KeyType key;
}ElemType;
typedef struct
{ElemType elem[MAX_NUM];int length;
}SSTable;
int bin_search(SSTable ST,int key)
{int low,high,mid;low=0;high=ST.length;while(low<=high){mid=(low+high)/2;if(key==ST.elem[mid].key)return mid;elseif(key<ST.elem[mid].key)high=mid-1;elselow=mid+1;}return -1;
}int main()
{SSTable ST;KeyType tkey;int n,i;ST.length=0;printf("请输入查找表元素个数:");scanf("%d",&n);printf("\n查找表输入:\n");while(n--)scanf("%d",&ST.elem[ST.length++].key);printf("\n输入查找元素:");scanf("%d",&tkey);i=bin_search(ST,tkey);if(i==-1)printf("\n未找到此元素\n");elseprintf("\n在查找表中下标为%d",i+1);return 0;}

2、哈希表的构造与查找

/* 采用开放地址法构造哈希表*/
#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 25
#define P 13
#define OK 1
#define ERROR 0
#define DUPLICATE -1
#define TRUE 1
#define FALSE 0
typedef struct{  /*哈希表元素结构*/int key;  /*关键字值*/int flag; /*是否存放元素*/
}ElemType;typedef struct {ElemType data[MAXSIZE];int count;      /*元素个数*/int sizeindex;  /*当前哈希表容量*/
}HashTable;int d1[15]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14}; /*线性探测序列*/
int d2[15]={0,1,-1,2*2,-2*2,3*3,-3*3,4*4,-4*4,5*5,-5*5,6*6,-6*6,7*7,-7*7}; /*二次探测序列*/
void dataset(int ds[],int *len);
int InsertHash(HashTable *H,int e,int d[]);
int CreateHash(HashTable *H,int ds[],int len,int d[]);
int SearchHash(HashTable *H, int e,int d[]);
void menu();
/*输入查找表*/
void dataset(int ds[],int *len){int n,m;n=0;printf("\n查找表输入:");while(scanf("%d",&m)==1){  /*以输入一个非整数作为结束*/ds[n]=m;n++;}*len=n;
}
/*计算哈希地址,插入哈希表*/
int InsertHash(HashTable *H,int e,int d[]){int k,i=1;k=e%P;while(H->data[k].flag==TRUE||k<0){k=(e%P+d[i])%MAXSIZE;i++;if(i>=15)return ERROR;}H->data[k].key=e;H->data[k].flag=TRUE;H->count++;return OK;
}
/*构造哈希表*/
int CreateHash(HashTable *H,int ds[],int len,int d[]){int i;for(i=0;i<len;i++){if(SearchHash(H,ds[i],d)!=-1)return DUPLICATE;InsertHash(H,ds[i],d);if(H->count>=MAXSIZE)return ERROR;}return OK;
}
/*初始化哈希表*/
void InitHash(HashTable *H){int i;for(i=0;i<MAXSIZE;i++){H->data[i].key=0;H->data[i].flag=FALSE;}
}
/*在哈希表中查找*/
int SearchHash(HashTable *H, int e,int d[]){int k,i=1;k=e%P;while(H->data[k].key!=e){k=(e%P+d[i])%MAXSIZE;i++;if(i>=15)return -1;}return k;
}
/*演示菜单*/
void menu(){int choice;int *p;HashTable h;h.count=0;h.sizeindex=MAXSIZE;int a[MAXSIZE]={0};int i,n,e;dataset(a,&n);  /*建立查找表*/getchar();printf("\n");do{printf("\n----哈希查找演示----\n");printf("\n1.线性探测构造哈希表\n");printf("\n2.二分探测构造哈希表\n");printf("\n3.退出\n");printf("\n输入选择:");scanf("%d",&choice);if(choice==1)p=d1;else if(choice==2)p=d2;elsereturn;InitHash(&h);   /*初始化哈希表*/if(!(i=CreateHash(&h,a,n,p))) /*构造哈希表*/printf("\n哈希表构造失败!\n");else if(i==DUPLICATE)printf("\n哈希表具有重复关键字!\n");else{printf("\n哈希表:\n");for(i=0;i<h.sizeindex;i++)printf("%3d",h.data[i].key);printf("\n\n哈希查找\n输入要查找的key值:");getchar();scanf("%d",&e);if((i=SearchHash(&h,e,p))==-1)printf("\n%d未找到\n",e);elseprintf("\n%d在哈希表中下标为%d\n",e,i);}getchar();}while(1);
}int main(){menu();return 0;
}

输入查找表为:19 14 23 1 68 20 84 27 55 11 10 79(注意以输入一个非整数结束)。
运行结果:
1)线性探测散列:
int d1[15]={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14};
哈希表形态:

84在哈希表中的位置:8
2)二次探测散列:
int d2[15]={0,1,-1,22,-22,33,-33,44,-44,55,-55,66,-66,77,-77};
哈希表形态:

84在哈希表中的位置:5

数据结构实验报告五 查找相关推荐

  1. 数据结构实验报告:查找和排序的应用

                                       学生信息管理系统 一.实验目的 1.本实验可以使学生更进一步巩固各种查找和排序的基本知识. 2.学会比较各种排序与查找算法的优劣. ...

  2. 排序与查找实验报告java,查找排序实验报告 - 范文大全 - 作文仓库-www.zuowencangku.com...

    查找排序实验报告 文章<查找排序实验报告>是由[作文仓库]的会员[笑着的人怎么哭了]为大家整理并分享的,仅供大家参考,欢迎阅读! 数据结构实验报告 实验名称:查找 班级:12级电气本2 学 ...

  3. 数据结构实验报告,二叉树的基本操作(C语言)

    数据结构实验报告,二叉树的基本操作(C语言) 作者:命运之光 专栏:数据结构 目录 数据结构实验报告,二叉树的基本操作(C语言) 实验六 二叉树的基本操作 一.需求分析 二.概要设计 三.详细设计 四 ...

  4. C语言数据结构线性表上机实验报告,数据结构实验报告实验一线性表_图文

    数据结构实验报告实验一线性表_图文 更新时间:2017/2/11 1:23:00  浏览量:763  手机版 数据结构实验报告 实验名称: 实验一 线性表 学生姓名: 班 级: 班内序号: 学 号: ...

  5. 数据结构实验报告(一)

    数据结构实验报告(一) 一.实验名称 实验一  线性表的基本操作实现及其应用 二.实验目的 1.熟练掌握线性表的结构特点,掌握顺序表的基本操作. 2.巩固 C++相关的程序设计方法与技术. 3.学会使 ...

  6. 计算机组成原理实验load,计算机组成原理实验报告五

    计算机组成原理实验报告五 (5页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 4.9 积分 广东工业大学广东工业大学实验报告 计算机学院 计算机科学与技术 ...

  7. java数据结构运动会分数统计,数据结构实验报告(运动会分数统计系)..doc

    数据结构实验报告(运动会分数统计系). 运动会分数统计系统 问题描述: 参加运动会有n个学校,学校编号为1--n.比赛分成m个男子项目,和w个女子项目.项目编号为男子1--m,女子m+1--m+w.不 ...

  8. 桂电七院数据结构实验报告一

    顺序表的基本操作 实验内容与步骤 实现顺序表上的插入.删除等操作.调试程序并对相应的输出作出分析:修改输入数据,预期输出并验证输出的结果.加深对有关算法的理解. 步骤: 第一步:定义顺序表的存储结构. ...

  9. 数据结构实验报告—学生成绩管理系统(Java实现)

    数据结构实验报告----学生成绩管理系统(Java实现) [具体下载链接]https://download.csdn.net/download/mmzian/10897535 部分代码展示 Test类 ...

  10. 数据结构实验报告(六)

    数据结构实验报告(六) 一.实验名称 实验六  图的实验1--图的邻接矩阵存储实现 二. 实验目的 1.  熟练理解图的相关概念: 2.  掌握图的邻接矩阵的存储方法的实现: 3.  学会图的遍历算法 ...

最新文章

  1. 如何在10亿个整数中找出前1000个最大的数?
  2. python插件下载地址
  3. python学习:语句
  4. Dynamics CRM 2013 初体验(1):系统的安装
  5. dcc garch matlab,如何用Eviews或者MATLAB实现DCC-garch模型?
  6. 删除oracle怎么快,如何快速删除Oracle的好方法
  7. leetcode:Majority Number
  8. tez什么意思_Tezos 与 Ethereum 的区别
  9. kis 2009 key/卡巴斯基2009 key/kis 8.0 0.454 key/卡巴斯基 8.0 0.454 key
  10. 2022软件库iAPP源码前端/后端程序整套独立后台
  11. 考研数学常见的函数图像
  12. 怎样屏蔽掉“网页对话框”
  13. Python-png转换成jpg
  14. 签张回执单 保险合同就生效?
  15. 微信登录+sdk+服务器,微信sdk后端集成
  16. 抱薪者说 | 君莫:穿越山海,终成“C链小雷锋”
  17. workman与php通信
  18. 深度学习图片预处理:crop
  19. iOS生成推送push证书,push.p12文件
  20. golang kv存储引擎

热门文章

  1. 【统计学习】细节笔记 [ 3 ] :贝叶斯角和两类错误角度理解混淆矩阵(为什么不能每个人都做核酸检测)
  2. 结构梁配筋最牛插件_结构设计常识分享!结构抗震概念——强柱弱梁
  3. 微信小程序--图片Image几种mode 设置图片方法
  4. java扫雷具有win7_window自带扫雷|扫雷下载|经典扫雷_win7扫雷下载_多特软件站
  5. 减少 JPG 文件大小
  6. Tomcat8.5下载安装配置
  7. PHPWAMP开机自启异常,服务器重启后Apache等服务不会自启的原因分析
  8. 安全生产知识竞赛答题小程序
  9. 小米pro笔记本加装dw1820a无线网卡,完美装苹果macOS
  10. 汽车变排量空调压缩机电磁阀故障诊断