xxx大学实验报告
课程名称数据结构实验项目实验三查找和排序(一)——查找
院系信息学院计类系专业班级计类1501 姓名学号
指导老师日期
批改日期成绩
一实验目的
1.掌握哈希函数——除留余数法的应用;
2. 掌握哈希表的建立;
3. 掌握冲突的解决方法;
4. 掌握哈希查找算法的实现。
二实验内容及要求
实验内容:已知一组关键字(19,14,23,1,68,20,84,27,55,11,10,79),哈希
函数定义为:H(key)=key MOD 13, 哈希表长为m=16。
实现该哈希表的散列,并
计算平均查找长度(设每个记录的查找概率相等)。
实验要求:1. 哈希表定义为定长的数组结构;2. 使用线性探测再散列或链
地址法解决冲突;3. 散列完成后在屏幕上输出数组内容或链表;4. 输出等概率
查找下的平均查找长度;5. 完成散列后,输入关键字完成查找操作,要分别测
试查找成功与不成功两种情况。
注意:不同解决冲突的方法会使得平均查找长度不同,可尝试使用不同解决
冲突的办法,比较平均查找长度。
(根据完成情况自选,但至少能使用一种方法
解决冲突)
三实验过程及运行结果
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define hashsize 16
#define q 13
int sign=2;
typedef struct Hash
{
int date; //值域
int sign; //标记
}HashNode;
void compare(HashNode H[],int p,int i,int key[]) //线性冲突处理{
p++;
if(H[p].sign!=0)
{
sign++;
compare(H,p,i,key);
}
else
{
H[p].date=key[i];
H[p].sign=sign;
sign=2;
}
}
void Hashlist(HashNode H[],int key[])
{
int p;
for(int i=0;i<12;i++)
{
p=key[i]%q;
if(H[p].sign==0)
{
H[p].date=key[i];
H[p].sign=1;
}
else
compare(H,p,i,key);
}
}
int judge(HashNode H[],int num,int n) //查找冲突处理
{
n++;
if(n>=hashsize) return 0;
if(H[n].date==num)
{
printf("位置\t 数据\n");
printf("%d\t %d\n\n",n,H[n].date);
return 1;
}
else
judge(H,num,n);
}
int search(char num,HashNode H[]) //查找
{
int n;
n= num % q;
if(H[n].sign==0)
{
printf("失败");
return 0;
}
if(H[n].sign!=0&&H[n].date==num)
{
printf("位置\t 数据\n");
printf("%d\t %d\n\n",n,H[n].date);
}
else if(H[n].sign!=0&&H[n].date!=num)
{
if(judge(H,num,n)==0) return 0;
}
return 1;
}
int main(void)
{
int key[q]={19,14,23,1,68,20,84,27,55,11,10,79};
float a=0;
HashNode H[hashsize];
for(int i=0;i<hashsize;i++)
H[i].sign=0;
Hashlist(H,key);
printf("位置\t 数据\n\n");
for(int i=0;i<hashsize;i++)
{
if(H[i].sign!=0)
{
printf("%d\t %d\n",i,H[i].date);
}
else
{
H[i].date=0;
printf("%d\t %d\n",i,H[i].date);
}
}
int num;
printf("请输入查找数值(‘-1’查找完成):\n");
for(int i=0;;i++)
{
scanf("%d",&num);
if(num==-1)
break;
if(search(num,H)==0)
printf("不存在\n");
}
for(int i=0;i<hashsize;i++)
{
printf("%d ",H[i].sign);
a=a+H[i].sign;
}
printf("\n%2.0f",a);
printf("平均查找长度:%0.2f\n",a/12);
return 0;
}
四调试情况、设计技巧及体会
首先得确定哈希函数,虽然冲突是无法避免的,但是我们应该选择合适的函数,减少冲突,最简单的可以采用开放定止法,出现冲突后,以原地址为基点再次寻找下一个地址。