hash表实例应用
来源:互联网 发布:腾讯内部刷枪软件 编辑:程序博客网 时间:2024/05/18 13:06
出处:http://blog.csdn.net/zouchunlaigo1988/article/details/7163920
1:问题描述
针对某个集体(比如你所在的班级)中的“人名”设计一个哈希表,使得平均查找长度不超过R,完成相应的建表和查表程序。
2:基本要求
假设人名为中国人姓名的汉语拼音形式。待填入哈希表的人名共有30个,取平均查找长度的上限为2。哈希函数用除留余数法构造,用伪随机探测再散列发处理冲突。
3:数据结构设计
- #ifndef _HashTest_H_
- #define _HashTest_H_
-
- #define NAME_NO 30
- #define HASH_LENGTH 50
- #define M 50;
-
- typedef struct
- {
- int k;
- }NAME;
-
- typedef struct
- {
- char *py;
- int k;
4:主要算法设计
(1)姓名(结构体数组)初始化
名字以拼音的形式够成字符串,将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字。
- void InitNameList()
- {
- char *f;
- int r,s0,i;
- NameList[0].py="chenliang";
- NameList[1].py="chenyuanhao";
- NameList[2].py="chengwenliang";
- NameList[3].py="dinglei";
- NameList[4].py="fenghanzao";
- NameList[5].py="fuzongkai";
- NameList[6].py="hujingbin";
- NameList[7].py="huangjianwu";
- NameList[8].py="lailaifa";
- NameList[9].py="lijiahao";
- NameList[10].py="liangxiaocong";
- NameList[11].py="linchunhua";
- NameList[12].py="liujianhui";
- NameList[13].py="luzhijian";
- NameList[14].py="luonan";
- NameList[15].py="quegaoxiang";
- NameList[16].py="sugan";
- NameList[17].py="suzhiqiang";
- NameList[18].py="taojiayang";
- NameList[19].py="wujiawen";
- NameList[20].py="xiaozhuomin";
- NameList[21].py="xujinfeng";
- NameList[22].py="yanghaichun";
- NameList[23].py="yeweixiong";
- NameList[24].py="zengwei";
- NameList[25].py="zhengyongbin";
- NameList[26].py="zhongminghua";
- NameList[27].py="chenliyan";
- NameList[28].py="liuxiaohui";
- NameList[29].py="panjinmei";
- for(i=0;i<NAME_NO;i++)
- {
- s0=0;
- f=NameList[i].py;
- for(r=0;*(f+r)!='\0';r++)
- s0=*(f+r)+s0;
- NameList[i].k=s0;
- }
- }
(2) 建立哈希表
用除留余数法构建哈希函数,用伪随机探测再散列法处理冲突
- void CreateHashList()
- {
- int i;
- for(i=0; i<HASH_LENGTH;i++)
- {
- HashList[i].py="";
- HashList[i].k=0;
- HashList[i].si=0;
- }
- for(i=0;i<HASH_LENGTH;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;
- }while (HashList[d].k!=0);
- HashList[d].k=NameList[i].k;
- HashList[d].py=NameList[i].py;
- HashList[d].si=sum+1;
- }
- }
- }
(3) 查找哈希表
在哈希表中进行查找,输出查找的结果和关键字,并计算和输出查找成功的平均查找长度
- void FindList()
- {
- char name[20]={0};
- int s0=0,r,sum=1,adr,d;
- printf("请输入姓名的拼音:");
- scanf("%s",name);
- for(r=0;r<20;r++)
- s0+=name[r];
- adr=s0%M;
- d=adr;
- if(HashList[adr].k==s0)
- 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);
- g=1;
- }
- }while(g==0);
- }
- }
(4) 显示哈希表
- void Display()
- {
- int i;
- float average=0;
- printf("\n地址\t关键字\t\t搜索长度\tH(key)\t 姓名\n");
- for(i=0; i<50; i++)
- {
- printf("%d ",i);
- printf("\t%d ",HashList[i].k);
- printf("\t\t%d ",HashList[i].si);
- printf("\t\t%d ",HashList[i].k%30);
- printf("\t %s ",HashList[i].py);
- printf("\n");
- }
- for(i=0;i<HASH_LENGTH;i++)
- average+=HashList[i].si;
- average/=NAME_NO;
- pri
(5) 主函数
- void main()
- {
- char ch1;
- InitNameList();
- CreateHashList ();
- do
- {
- printf("D. 显示哈希表\nF. 查找\nQ. 退出\n请选择: ");
- cin>>&ch1;
- switch(ch1)
- {
- case 'D':Display(); cout<<endl;break;
- case 'F':FindList();cout<<endl;break;
- case 'Q':exit(0);
- }
- cout<<"come on !(y/n):";
- cin>>&ch1;
- }while(ch1!='n');
- }
0 0