哈希表的建立、查找。

今天考完数电回来接着昨天的写,昨天只用伪随机数列探测法建立了哈希表,今天完成查找功能。但是对于两个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

posted @ 2013-01-23 21:04  paradise in hell  Views(524)  Comments(0Edit  收藏  举报