今天效率好低,方法不太正确,需要改进。
#include<iostream> using namespace std; #define M 47//取模值为47 typedef struct Name {//定义结构体储存名字 char *py; int key; }*NameList; typedef struct HASH { char *py; int key; int si; }*HASHList; Name name[50];//表长为50 HASH hashs[50]; void memset() {//名字初始化 int i,r,s0; char *f; name[0].py="jiaguanghu"; name[1].py="nima"; name[2].py="liyili"; name[3].py="xujiafeng"; name[4].py="huangliang"; name[5].py="huangbaoguang"; name[6].py="lvxin"; name[7].py="zhuxinpeng"; name[8].py="yanbiao"; name[9].py="zhuweiwei"; name[10].py="lanjunfan"; name[11].py="sunxiaoyuan"; name[12].py="qifu"; name[13].py="lvmenglei"; name[14].py="wangrenzhang"; name[15].py="wanghai"; name[16].py="kuangyang"; name[17].py="zhangjingwei"; name[18].py="zhangteng"; name[19].py="zhangtian"; name[20].py="wuwenjie"; name[21].py="zhanhan"; name[22].py="zhangzheng"; name[23].py="huangpengfei"; name[24].py="qushen"; name[25].py="weidi"; name[26].py="chengjin"; name[27].py="yangshaojun"; name[28].py="lipeng"; name[29].py="chengwenwen"; for(i=0;i<30;i++) { s0=0; f=name[i].py; for(r=0;*(f+r)!='\0';r++) s0+=int (*(f+r));//求出每个名字对应的整数并储存在name[].key中 name[i].key=s0; } } void creathash() {//建立哈希表 int i; for(i=0;i<50;i++) {//哈希函数初始化 hashs[i].key=0; hashs[i].si=0; hashs[i].py=""; } for(i=0;i<50;i++) { int d,addr; addr=name[i].key%M;//去整取余法 d=addr; if(hashs[d].si==0) {//若未出现冲突 hashs[addr].py=name[i].py; hashs[addr].key=name[i].key; hashs[addr].si=1; } else {//出现冲突 int sum=0; do { d=(d+name[i].key%10+1)%M;//伪随机数列探测 sum+=1;//记录探测次数 }while(hashs[d].key!=0); hashs[d].py=name[i].py; hashs[d].key=name[i].key; hashs[d].si=sum+1; } } } int main() { memset(); creathash(); return 0; }
只建立了哈希函数,明天考完试再实现查找功能。
2013-01-22 23:17:17