哈希表的建立和查找
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
哈希表的建立和查找
/* 针对某个集体(比如所在班级)中的人名设计一个哈希表,使的平均查找的长度不超过2完成相应的建表和查表的程序
题目要求:
假设人名为姓名的汉语拼音形式,待填入哈希表的人名工有30个,取平均查找长度的上限
为2。哈希函数用除留余数法构造,用伪随机探测再散列法处理冲突。
测试数据
自定义。
*/
#include
#include
#define HASH_LEN 50 //哈希表的长度
#define M 47 //随机数
#define NAME_NO 30 //人名的个数
typedef struct
{
char *py; //名字的拼音
int k; //拼音所对应的整数
}NAME;
NAME NameList[HASH_LEN]; //全局变量NAME
typedef struct //哈希表
{
char *py; //名字的拼音
int k; //拼音所对应的整数
int si; //查找长度
}HASH;
HASH HashList[HASH_LEN]; //全局变量HASH
void InitNameList() //姓名(结构体数组)初始化
{
char *f;
int r,s0,i;
NameList[0].py="wanghui";
NameList[1].py="mayuelong";
NameList[2].py="chenzhicheng";
NameList[3].py="sunpeng";
NameList[4].py="zengqinghui";
NameList[5].py="liqingbo";
NameList[6].py="liujunpeng";
NameList[7].py="jiangquanlei";
NameList[8].py="xingzhengchuan";
NameList[9].py="luzhaoqian";
NameList[10].py="gaowenhu";
NameList[11].py="zhuhaoyin";
NameList[12].py="chenlili";
NameList[13].py="wuyunyun";
NameList[14].py="huangjuanxia";
NameList[15].py="wangyan";
NameList[16].py="zhoutao";
NameList[17].py="jiangzhenyu";
NameList[18].py="liuxiaolong";
NameList[19].py="wangziming";
NameList[20].py="fengjunbo";
NameList[21].py="lilei";
NameList[22].py="wangjia";
NameList[23].py="zhangjianguo";
NameList[24].py="zhuqingqing";
NameList[25].py="huangmin";
NameList[26].py="haoyuhan";
NameList[27].py="zhoutao";
NameList[28].py="zhujiang";
NameList[29].py="lixiaojun";
for (i=0;i { s0=0; f=NameList[i].py; for (r=0;*(f+r)!='\0';r++) /* 方法:将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字*/ s0=*(f+r)+s0; NameList[i].k=s0; } } void CreateHashList() //建立哈希表 {int i; for (i=0; i { HashList[i].py=""; HashList[i].k=0; HashList[i].si=0; } for (i=0;i { int sum=0; int adr=(NameList[i].k)%M; //哈希函数 int d=adr; if(HashList[adr].si==0) //如果不冲突 { HashList[adr].k=NameList[i].k; HashList[adr].py=NameList[i].py; HashList[adr].si=1; } else //冲突 { do { d=(d+NameList[i].k%10+1)%M; //伪随机探测再散列法处理冲突 sum=sum+1; //查找次数加1 }while (HashList[d].k!=0); HashList[d].k=NameList[i].k; HashList[d].py=NameList[i].py; HashList[d].si=sum+1; }}} void FindList() //查找 { char name[20]={0}; int s0=0,r,sum=1,adr,d; printf("\n请输入姓名的拼音:"); scanf("%s",name); for (r=0;r<20;r++) //求出姓名的拼音所对应的整数(关键字) s0+=name[r]; adr=s0%M; //使用哈希函数 d=adr; if(HashList[adr].k==s0) //分3种情况进行判断 printf("\n姓名:%s 关键字:%d 查找长度为: 1",HashList[d].py,s0); else if (HashList[adr].k==0) printf("无此记录!"); else { int g=0; do { d=(d+s0%10+1)%M; //伪随机探测再散列法处理冲突 sum=sum+1; if (HashList[d].k==0) { printf("无此记录! "); g=1; } if (HashList[d].k==s0) { printf("\n姓名:%s 关键字:%d 查找长度为:%d",HashList[d].py,s0,sum);