数据结构实验七
更新时间:2023-09-07 00:48:01 阅读量: 教育文库 文档下载
实验六查找
一、实验目的
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的比较次数:
查找key=35的比较次数:
算法实现代码
#include<stdio.h>
#define N 100
typedef struct {
int data[N];
int length;
}SSTable;
int zbcz(SSTable s,int k, int *p)
{
int n=0;
int low,high,mid;
low=1;
high=s.length;
while(low<=high)
{
n++;
mid=(low+high)/2;
if(s.data[mid]==k)
{
*p=n;
return mid;
}
else if(s.data[mid]>k)
{
high=mid-1;
}
else
low=mid+1;
}
*p=n;
return 0;
}
void show_zb(SSTable s,int k, int *p)
{
int n;
p=&n;
if(zbcz(s,k,p))
{
printf("查找%d成功\n",k);
printf("查找%d的比较次数为:%d\n",k,n);
}
else
{
printf("查找%失败\n",k);
printf("查找%d的比较次数为:%d\n",k,n);
}
}
int sxcz(SSTable s,int k,int *p)
{
int n=1;
int i;
for(i=s.length;s.data[i]!=k&&i>0;i--)
n++;
*p=n;
return i;
}
void show_sx(SSTable s,int k,int *p)
{
int n;
p=&n;
if(sxcz(s,k,p))
{
printf("查找%d成功\n",k);
printf("查找%d的比较次数为:%d\n",k,n);
}
else
{
printf("查找%失败\n",k);
printf("查找%d的比较次数为:%d\n",k,n);
}
}
void main()
{
SSTable s;
int i,n,*p;
int k;
do {
printf("数据元素的个数:");
scanf("%d",&s.length);
printf("输入10个数据元素:");
for(i=1;i<=s.length;i++)
scanf("%d",&s.data[i]);
printf("输入要查找的数:");
scanf("%d",&k);
printf("\n---String---\n");
printf("1. 折半查找\n");
printf("2. 顺序查找\n");
printf("0. EXIT\n");
printf("\ninput choice:");
scanf("%d",&n);
switch(n){
case 1:show_zb(s,k,p);break;
case 2:show_sx(s,k,p);break;
default:n=0;break;
}
}while(n);
}
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;
else
return;
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);
else
printf("\n%d在哈希表中下标为%d\n",e,i);
}
getchar();
}while(1);
}
int main(){
menu();
return 0;
}
运行程序:
(1)输入查找表为:19 14 23 1 68 20 84 27 55 11 10 79(注意以输入一个非整数结束) 请写出运行结果:
线性探测散列:
84在哈希表中的位置:
二次探测散列:
84在哈希表中的位置:
(2)输入查找表为:15 65 88 77 99 88
运行结果:
三、实验小结
四、教师评语
正在阅读:
数据结构实验七09-07
《人力资源管理》第03章在线测试06-14
论高校教学评估与督导工作的功能和紧迫性08-21
2012年中级会计职称学习计划(新教材下来前预习计划)05-05
空时块编码的研究10-01
330MW供热规程(最终版后)10-09
保险法规1103-21
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 数据结构
- 实验
- 化工学院学习标兵申报材料
- 山东省实验中学2012-2013学年高一上学期期末考试物理试题(word版)
- 新人教版小学数学一年级上册《10以内的数解决问题(加法)》
- 消防灭火应急疏散预案
- 初三化学试题___2012版第三单元物质构成的奥秘测试题及答案
- 递归经典问题—汉诺塔问题
- 八年级英语下册Unit10I’vehadthisbikeforthreeyearsSectionA3a_4c同步练习新版人教新目标版
- 裕兴新概念英语第二册笔记_第44课_单词讲解
- 人教版二年级数学下册《2-6的乘法口诀求商例4》
- 郑州市新郑机电工业学校2012年对口高考农作(十一)(2012.5.8)
- 网上书店管理系统 可行性分析报告
- 中国中频加热设备行业市场前景展望及投资机会分析报告2016-2021年
- 高考数学一轮总复习检测:11.1 排列、组合
- 化工原理换热器课程设计
- 如何做一个成功的管理者
- 振动试验及振动试验设备
- c语言期中试卷
- 00894计算机与网络技术基础 全国13年10月自考 试题
- 公共服务的顾客满意度调查:理论与方法.
- 煤矿矿井基建工程档案规范档案资料管理的暂时规定