关于哈希表的使用,请大家指教
如题,大家能不能给个完整的关于建立嵌套哈希表的例子,用C++写的一个完整的程序,谢谢大家啊,谁给了一定给大家加全分,谢谢谢谢啊,我好急,希望好心人能帮个忙!!!
[解决办法]
//有个例子,参考一下;#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#define N 30#define L 38#define P 37typedef struct { char *name; char *py; int k;}old;old oldlist[N];typedef struct { char *name; char *py; int k; int b; }hx;hx hlist[L];void InputOldlist(){ int i,s=0,r; /*for(i=1;i<=N;i++){ oldlist[i-1].name=(char*)malloc(sizeof(char)*20); printf("请输入人名:"); gets(oldlist[i-1].name); oldlist[i-1].py=(char*)malloc(sizeof(char)*20); printf("请输入拼音:"); gets(oldlist[i-1].py); }*/ oldlist[0].name="栾雪峰"; oldlist[0].py="luan xue feng"; oldlist[1].name="刘翔"; oldlist[1].py="liu xiang"; oldlist[2].name="马三立"; oldlist[2].py="ma san li"; oldlist[3].name="李开复"; oldlist[3].py="li kai fu"; oldlist[4].name="李彦宏"; oldlist[4].py="li yan hong"; oldlist[5].name="王冰杰"; oldlist[5].py="wang bin jie"; oldlist[6].name="孟茂昌"; oldlist[6].py="meng mao chang"; oldlist[7].name="蒋睿杰"; oldlist[7].py="jiang rui jie"; oldlist[8].name="嫦娥"; oldlist[8].py="chang er"; oldlist[9].name="孙悟空"; oldlist[9].py="sun wu kong"; oldlist[10].name="猪八戒"; oldlist[10].py="zhu ba jie"; oldlist[11].name="徐琛"; oldlist[11].py="xu chen"; oldlist[12].name="唐僧"; oldlist[12].py="tang seng"; oldlist[13].name="周星驰"; oldlist[13].py="zhou xing chi"; oldlist[14].name="董寸瑞"; oldlist[14].py="dong cun rui"; oldlist[15].name="黄继光"; oldlist[15].py="huang ji guang"; oldlist[16].name="金庸"; oldlist[16].py="jin rong"; oldlist[17].name="杨过"; oldlist[17].py="yang guo"; oldlist[18].name="小龙女"; oldlist[18].py="xiao long nv"; oldlist[19].name="郭大侠"; oldlist[19].py="guo da xia"; oldlist[20].name="黄蓉"; oldlist[20].py="huang rong"; oldlist[21].name="老师"; oldlist[21].py="lao shi"; oldlist[22].name="学生"; oldlist[22].py="xue sheng"; oldlist[23].name="小平同志"; oldlist[23].py="xiao ping tong zhi"; oldlist[24].name="泽民"; oldlist[24].py="ze min"; oldlist[25].name="圣诞老人"; oldlist[25].py="sheng dan lao ren"; oldlist[26].name="朱德庸"; oldlist[26].py="zhu de yong"; oldlist[27].name="阿扁"; oldlist[27].py="a bian"; oldlist[28].name="连战"; oldlist[28].py="lian zhan"; oldlist[29].name="幸福"; oldlist[29].py="xing fu"; for (i=0;i<N;i++) { for(s=0,r=0;oldlist[i].py[r]!='\0';r++) { s=toascii(oldlist[i].py[r])+s; } oldlist[i].k=s; }}void hash(){ int i,adr,d; float average,sum=0; for (i=0;i<L;i++) { hlist[i].name=""; hlist[i].py=""; hlist[i].k=0; hlist[i].b=0; } for (i=0;i<N;i++) { adr=(oldlist[i].k)%P; d=adr; if(hlist[adr].b==0) { hlist[adr].k=oldlist[i].k; hlist[adr].name=oldlist[i].name; hlist[adr].py=oldlist[i].py; hlist[adr].b=1; sum=sum+1; } else { do { d=(d+adr%10+1)%P; sum=sum+1; }while (hlist[d].b!=0); hlist[d].k=oldlist[i].k; hlist[d].name=oldlist[i].name; hlist[d].py=oldlist[i].py; hlist[d].b=1; } } average=sum/30; printf("平均查找长度为:%f\n",average); if(average>2) hash();}void findlist() { char c[20]; int i=0,d,g,adr,s=0; printf("请输入你要查找的人的拼音:\n"); getchar(); gets(c); for(i=0;c[i]!='\0';i++) { s=toascii(c[i])+s; } adr=s%P; d=adr; if(strcmp(hlist[adr].py,c)==0) { printf("姓名:%s 拼音:%s 哈希表中存储位置:%d\n",hlist[adr].name,hlist[adr].py,adr); } else if(hlist[adr].b==0) { printf("哈希表中无记录!\n"); } else { g=0; for (i=0;g==0;i++) { d=(d+adr%10+1)%P; if(hlist[d].b==0) { printf("哈希表中无记录!\n"); g=1; } if(strcmp(hlist[d].py,c)==0) { printf("姓名:%s 拼音:%s 哈希表中存储位置:%d\n",hlist[d].name,hlist[d].py,d); g=1; } } }}void printlist(){ int i; for(i=0;i<L;i++) printf("%s %s %d \n",hlist[i].name,hlist[i].py,hlist[i].k);}void main(){ int ch; InputOldlist(); hash(); do { printf("1.查找 2.输出哈希表 3.退出程序\n"); scanf("%d",&ch); switch(ch) { case 1: findlist(); printf("Press any key to continue.\n"); break; case 2: printlist(); printf("Press any key to continue.\n"); break; case 3: break; default: printf("No this operation.\n"); printf("Press any key to continue.\n"); } getchar(); }while (ch!=3);}
[解决办法]
哈希表的建立和查找2007年06月15日 星期五 11:44/* 针对某个集体(比如所在班级)中的人名设计一个哈希表,使的平均查找的长度不超过2完成相应的建表和查表的程序题目要求: 假设人名为姓名的汉语拼音形式,待填入哈希表的人名工有30个,取平均查找长度的上限 为2。哈希函数用除留余数法构造,用伪随机探测再散列法处理冲突。 测试数据 自定义。 */#include<stdio.h>#include<conio.h>#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<NAME_NO;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<HASH_LEN;i++) { HashList[i].py=""; HashList[i].k=0; HashList[i].si=0; } for (i=0;i<HASH_LEN;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; }}}