哈希表的建立、查找。
今天考完数电回来接着昨天的写,昨天只用伪随机数列探测法建立了哈希表,今天完成查找功能。但是对于两个key值相等的名字,却没找到好的解决方法。仍然存在很大的bug,有时间再修改 。
代码如下:
1 #include<iostream> 2 using namespace std; 3 4 #define M 47//取模值为47 5 6 typedef struct Name 7 {//定义结构体储存名字 8 char *py; 9 int key; 10 }*NameList; 11 12 typedef struct HASH 13 { 14 char *py; 15 int key; 16 int si; 17 }*HASHList; 18 19 Name name[50];//表长为50 20 HASH hashs[50]; 21 22 void memset() 23 {//名字初始化 24 int i,r,s0; 25 char *f; 26 name[0].py="jiaguanghu"; 27 name[1].py="nima"; 28 name[2].py="liyili"; 29 name[3].py="xujiafeng"; 30 name[4].py="huangliang"; 31 name[5].py="huangbaoguang"; 32 name[6].py="lvxin"; 33 name[7].py="zhuxinpeng"; 34 name[8].py="yanbiao"; 35 name[9].py="zhuweiwei"; 36 name[10].py="lanjunfan"; 37 name[11].py="sunxiaoyuan"; 38 name[12].py="qifu"; 39 name[13].py="lvmenglei"; 40 name[14].py="wangrenzhang"; 41 name[15].py="wanghai"; 42 name[16].py="kuangyang"; 43 name[17].py="zhangjingwei"; 44 name[18].py="zhangteng"; 45 name[19].py="zhangtian"; 46 name[20].py="wuwenjie"; 47 name[21].py="zhanhan"; 48 name[22].py="zhangzheng"; 49 name[23].py="huangpengfei"; 50 name[24].py="qushen"; 51 name[25].py="weidi"; 52 name[26].py="chengjin"; 53 name[27].py="yangshaojun"; 54 name[28].py="lipeng"; 55 name[29].py="chengwenwen"; 56 for(i=0;i<30;i++) 57 { 58 s0=0; 59 f=name[i].py; 60 for(r=0;*(f+r)!='\0';r++) 61 s0+=int (*(f+r));//求出每个名字对应的整数并储存在name[].key中 62 name[i].key=s0; 63 } 64 } 65 66 void creathash() 67 {//建立哈希表 68 int i; 69 for(i=0;i<50;i++) 70 {//哈希函数初始化 71 hashs[i].key=0; 72 hashs[i].si=0; 73 hashs[i].py=""; 74 } 75 76 for(i=0;i<50;i++) 77 { 78 int d,addr; 79 addr=name[i].key%M;//去整取余法 80 d=addr; 81 if(hashs[d].si==0) 82 {//若未出现冲突 83 hashs[addr].py=name[i].py; 84 hashs[addr].key=name[i].key; 85 hashs[addr].si=1; 86 } 87 else 88 {//出现冲突 89 int sum=0; 90 do 91 { 92 d=(d+name[i].key%10+1)%M;//伪随机数列探测 93 sum+=1;//记录探测次数 94 }while(hashs[d].key!=0); 95 96 hashs[d].py=name[i].py; 97 hashs[d].key=name[i].key; 98 hashs[d].si=sum+1; 99 } 100 } 101 } 102 103 void find() 104 { 105 char s[20]; 106 int key=0; 107 cout<<"请输入要查找的人名"<<endl; 108 cin>>s; 109 char *f=s; 110 for(int r=0;*(f+r)!='\0';r++) 111 { 112 key+=int (*(f+r)); 113 } 114 int d; 115 d=key%M; 116 117 if(key==hashs[d].key) 118 { 119 cout<<"name:"<<" "<<hashs[d].py<<" "<<"关键字"<<" "<<key<<" " <<"查找长度"<<" "<<"1"<<endl; 120 } 121 else if(hashs[d].key==0) 122 { 123 cout<<"无此记录"<<endl; 124 } 125 else 126 { 127 int bj=0,sum=0; 128 do 129 { 130 d=(d+key%10+1)%M; 131 sum+=1; 132 if(hashs[d].key==0) 133 { 134 bj=1; 135 cout<<"无此记录"<<endl; 136 } 137 else if(hashs[d].key==key) 138 { 139 bj=1; 140 cout<<"name"<<" "<<hashs[d].py<<" "<<"关键字"<<" "<<key<<" "<<"查找长度"<<" "<<sum+1<<endl; 141 } 142 }while(bj==0); 143 144 } 145 146 } 147 148 149 int main() 150 { 151 int a,b=1; 152 memset(); 153 creathash(); 154 cout<<"1、查找 "<<endl; 155 cout<<"2、退出"<<endl; 156 while(b) 157 { 158 cin>>a; 159 switch(a) 160 { 161 case 1: find();break; 162 case 2: b=0; break; 163 } 164 } 165 166 return 0; 167 }
cheer up~!~ 2013-01-23 21:04:49