zoukankan      html  css  js  c++  java
  • 哈希表的建立、查找。

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

  • 相关阅读:
    datetime模块
    time模块
    shelve模块
    json&pickle 序列化
    re正则
    MQ常用命令
    MQ for linux安装与卸载【转】
    Linux下安装Oracle11g服务器【转】
    PLSQL_数据泵Datapump导入导出数据IMPDP / EXPDP(概念)(Oracle数据导入导出工具)[转]
    [LeetCode]:116:Populating Next Right Pointers in Each Node
  • 原文地址:https://www.cnblogs.com/paradises/p/2873800.html
Copyright © 2011-2022 走看看