• 实现哈希表


    
    1. #include<stdio.h>   
    2. #include<iostream>   
    3. #include<conio.h>   
    4.    
    5. using namespace std;   
    6.    
    7. #define HASH_LEN 50                      //哈希表的长度            
    8. #define M 47                            //随机数   
    9. int NAME_NO=34;                     //城市名的个数           
    10.    
    11. typedef struct         
    12. {   
    13.     char *py;    //名字的拼音   
    14.     int k;       //拼音所对应的整数   
    15. }NAME;   
    16.    
    17. NAME NameList[HASH_LEN];    //全局变量NAME                
    18.    
    19. typedef struct    //哈希表   
    20. {   
    21.     char *py;   //名字的拼音   
    22.     int k;      //拼音所对应的整数   
    23.     int si;     //查找长度   
    24. }HASH;   
    25.    
    26. HASH HashList[HASH_LEN];        //全局变量HASH                        
    27.    
    28. void InitNameList() //姓名(结构体数组)初始化             
    29. {   
    30.     char *f;   
    31.     int r,s0,i;   
    32.     NameList[0].py="harbin";   
    33.     NameList[1].py="shijiazhuang";   
    34.     NameList[2].py="lanzhou";   
    35.     NameList[3].py="kunming";   
    36.     NameList[4].py="chengdu";   
    37.     NameList[5].py="changchun";   
    38.     NameList[6].py="shenyang";   
    39.     NameList[7].py="xining";   
    40.     NameList[8].py="xian";   
    41.     NameList[9].py="zhengzhou";   
    42.     NameList[10].py="jinan";   
    43.     NameList[11].py="taiyuan";   
    44.     NameList[12].py="hefei";   
    45.     NameList[13].py="wuhan";   
    46.     NameList[14].py="changsha";   
    47.     NameList[15].py="nanjing";   
    48.     NameList[16].py="guiyang";   
    49.     NameList[17].py="nanning";   
    50.     NameList[18].py="hangzhou";   
    51.     NameList[19].py="nanchang";   
    52.     NameList[20].py="guangzhou";   
    53.     NameList[21].py="fuzhou";   
    54.     NameList[22].py="taipei";   
    55.     NameList[23].py="haikou";   
    56.     NameList[24].py="huhhot";   
    57.     NameList[25].py="yinchuan";   
    58.     NameList[26].py="urumqi";   
    59.     NameList[27].py="lahsa";   
    60.     NameList[28].py="macau";   
    61.     NameList[29].py="beijing";   
    62.     NameList[30].py="shanghai";   
    63.     NameList[31].py="hongkong";   
    64.     NameList[32].py="tianjin";   
    65.     NameList[33].py="chongqing";   
    66.     for (i=0;i<NAME_NO;i++)   
    67.     {   
    68.         s0=0;   
    69.         f=NameList[i].py;   
    70.         for (r=0;*(f+r)!='';r++)   
    71.             /* 方法:将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字*/   
    72.             s0=*(f+r)+s0;   
    73.         NameList[i].k=s0;   
    74.     }    
    75. }   
    76.    
    77. void CreateHashList() //建立哈希表      
    78. {   
    79.     int i;   
    80.     for (i=0; i<HASH_LEN;i++)    
    81.     {   
    82.         HashList[i].py="";   
    83.         HashList[i].k=0;   
    84.         HashList[i].si=0;   
    85.     }   
    86.     for (i=0;i<HASH_LEN;i++)   
    87.     {   
    88.         int sum=0;   
    89.         int adr=(NameList[i].k)%M;  //哈希函数   
    90.         int d=adr;   
    91.         if(HashList[adr].si==0)     //如果不冲突   
    92.         {   
    93.             HashList[adr].k=NameList[i].k;   
    94.             HashList[adr].py=NameList[i].py;   
    95.             HashList[adr].si=1;   
    96.         }   
    97.         else   //冲突     
    98.         {   
    99.             do   
    100.             {   
    101.                 d=(d+NameList[i].k%10+1)%M;   //伪随机探测再散列法处理冲突       
    102.                 sum=sum+1;   //查找次数加1       
    103.             }while (HashList[d].k!=0);   
    104.             HashList[d].k=NameList[i].k;   
    105.             HashList[d].py=NameList[i].py;   
    106.             HashList[d].si=sum+1;   
    107.         }   
    108.     }   
    109. }   
    110.    
    111. int  FindList() //查找       
    112.    
    113. {     
    114.    
    115.        char name[20]={0};    
    116.        int s0=0,r,sum=1,adr,d;   
    117.        printf(" 请输入城市名称:");        
    118.        scanf("%s",name);    
    119.        for (r=0;r<20;r++)   //求出姓名的拼音所对应的整数(关键字)   
    120.            s0+=name[r];    
    121.        adr=s0%M;   //使用哈希函数   
    122.        d=adr;   
    123.        if(HashList[adr].k==s0)          //分3种情况进行判断   
    124.        {   
    125.            printf(" 名称:%s   关键字:%d   查找长度为: 1",HashList[d].py,s0);    
    126.            cout<<endl;   
    127.            return 0;   
    128.        }   
    129.        else if (HashList[adr].k==0)    
    130.        {   
    131.            printf("无此记录!");   
    132.            cout<<endl;   
    133.            return 1;   
    134.        }   
    135.        else   
    136.        {   
    137.            int g=0;   
    138.            do   
    139.            {   
    140.                d=(d+s0%10+1)%M;       //伪随机探测再散列法处理冲突                        
    141.                sum=sum+1;   
    142.                if (HashList[d].k==0)   
    143.                {   
    144.                    printf("无此记录! ");     
    145.                    cout<<endl;   
    146.                    g=1;        
    147.                    return 1;   
    148.                }   
    149.                if (HashList[d].k==s0)   
    150.                {       
    151.                    printf(" 名称:%s   关键字:%d   查找长度为:%d",HashList[d].py,s0,sum);    
    152.                    cout<<endl;   
    153.                    g=1;     
    154.                    return 0;   
    155.                }   
    156.            }while(g==0);      
    157.        }   
    158. }   
    159.    
    160. void   Display() // 显示哈希表          
    161. {   
    162.     int i;   
    163.     float average=0;   
    164.     for(i=0; i<HASH_LEN; i++)   
    165.     {   
    166.         if(HashList[i].k%M==0)    
    167.         HashList[i].py="";   
    168.     }   
    169.     printf(" 地址 关键字 搜索长度 H(key)  名称 "); //显示的格式   
    170.     for(i=0; i<HASH_LEN; i++)   
    171.     {   
    172.         printf("%d ",i);   
    173.         printf(" %d ",HashList[i].k);   
    174.         printf(" %d ",HashList[i].si);   
    175.         printf(" %d ",HashList[i].k%M);   
    176.         printf("  %s ",HashList[i].py);   
    177.         //cout<<"      "<<HashList[i].py<<endl;   
    178.         printf(" ");     
    179.         //cout<<i<<"         "<<HashList[i].k<<"             "<<HashList[i].si<<"             "<<HashList[i].k%M<<"         "<<HashList[i].py<<endl;   
    180.     }   
    181.     for (i=0;i<HASH_LEN;i++)   
    182.         average+=HashList[i].si;    
    183.     average/=NAME_NO;   
    184.     printf(" 平均查找长度:ASL(%d)=%f  ",NAME_NO,average);    
    185. }   
    186.    
    187. void DeleteList()   
    188. {   
    189.     char name[20]={0};    
    190.     int s0=0,r,sum=1,adr,d;   
    191.     printf(" 请输入城市名称:");        
    192.     scanf("%s",name);    
    193.     for (r=0;r<20;r++)   //求出姓名的拼音所对应的整数(关键字)   
    194.         s0+=name[r];    
    195.     adr=s0%M;   //使用哈希函数   
    196.     d=adr;   
    197.     if(HashList[adr].k==s0)          //分3种情况进行判断   
    198.     {   
    199.         printf(" 名称:%s   关键字:%d   查找长度为: 1",HashList[d].py,s0);   
    200.         cout<<endl;   
    201.         cout<<"删除成功!"<<endl;   
    202.         s0=0;   
    203.         HashList[d].py="";   //名字的拼音   
    204.         HashList[d].k=0;      //拼音所对应的整数   
    205.         HashList[d].si=0;   
    206.     }   
    207.     else if (HashList[adr].k==0)    
    208.         printf("无此记录!无法执行删除操作!");   
    209.     else   
    210.     {   
    211.         int g=0;   
    212.         do   
    213.         {   
    214.             d=(d+s0%10+1)%M;       //伪随机探测再散列法处理冲突                        
    215.             sum=sum+1;   
    216.             if (HashList[d].k==0)   
    217.             {   
    218.                 printf("无此记录!无法执行删除操作!");     
    219.                 g=1;        
    220.             }   
    221.             if (HashList[d].k==s0)   
    222.             {       
    223.                 printf(" 名称:%s   关键字:%d   查找长度为:%d",HashList[d].py,s0,sum);    
    224.                 cout<<endl;   
    225.                 cout<<"已删除成功!"<<endl;   
    226.                 s0=0;   
    227.                 HashList[d].py="";   //名字的拼音   
    228.                 HashList[d].k=0;      //拼音所对应的整数   
    229.                 HashList[d].si=0;   
    230.                 //Display();   
    231.                 g=1;     
    232.             }   
    233.         }while(g==0);      
    234.     }   
    235. }   
    236.    
    237. void EnterList()   
    238. {   
    239.      /*char name[20]={0};   
    240.      int s0=0,r,sum=1,adr,d,h;  
    241.      printf(" 请输入姓名的拼音:");       
    242.      scanf("%s",name);   
    243.      for (r=0;r<20;r++)   //求出姓名的拼音所对应的整数(关键字)  
    244.          s0+=name[r];*/   
    245.      char st[20];   
    246.      char *xin;   
    247.      xin=st;   
    248.      int s0=0,r,sum=1,adr,d,h;   
    249.      printf(" 请输入城市名称的拼音:");   
    250.      cin>>xin;   
    251.      //cout<<xin<<endl;   
    252.      for (r=0;*(xin+r)!='';r++)   
    253.      {   
    254.          /* 方法:将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字*/   
    255.          s0=(int)(*(xin+r))+s0;   
    256.      }   
    257.      //cout<<s0<<endl;   
    258.      adr=s0%M;   //使用哈希函数   
    259.      d=adr;   
    260.      if(HashList[adr].k==s0)          //分3种情况进行判断   
    261.      {   
    262.          printf(" 名称:%s   关键字:%d   查找长度为: 1",HashList[d].py,s0);   
    263.          cout<<endl;   
    264.          cout<<"已存在于表中,无需插入!"<<endl;   
    265.       }   
    266.      else if (HashList[d].k==0)    
    267.      {   
    268.          printf("插入成功!");   
    269.          HashList[d].py=xin;   
    270.          HashList[d].k=s0;   
    271.          HashList[d].si=1;   
    272.          h=1;   
    273.          cout<<endl;   
    274.       }   
    275.      else   
    276.      {   
    277.          int g=0,h=0;   
    278.          do   
    279.          {   
    280.              d=(d+s0%10+1)%M;       //伪随机探测再散列法处理冲突                        
    281.              sum=sum+1;   
    282.              if (HashList[d].k==0)   
    283.              {   
    284.                  printf("插入成功!");   
    285.                  HashList[d].py=xin;   
    286.                  HashList[d].k=s0;   
    287.                  HashList[d].si=sum;   
    288.                  h=1;   
    289.                  cout<<endl;   
    290.                  g=1;        
    291.              }   
    292.              if (HashList[d].k==s0)   
    293.              {       
    294.                  printf(" 名称:%s   关键字:%d   查找长度为:%d",HashList[d].py,s0,sum);   
    295.                  cout<<endl;   
    296.                  cout<<"已存在于表中,无需插入!"<<endl;   
    297.                  g=1;     
    298.               }   
    299.          }while(g==0);      
    300.      }   
    301.      if(h==0)   
    302.          return;   
    303.      else   
    304.      {   
    305.          NAME_NO++;   
    306.          NameList[NAME_NO-1].py=xin;   
    307.          int sum=0;   
    308.          int adr=(NameList[NAME_NO-1].k)%M;  //哈希函数   
    309.          int d=adr;   
    310.          if(HashList[adr].si==0)     //如果不冲突   
    311.          {   
    312.              HashList[adr].k=NameList[NAME_NO-1].k;   
    313.              HashList[adr].py=NameList[NAME_NO-1].py;   
    314.              HashList[adr].si=1;   
    315.          }   
    316.          else   //冲突     
    317.          {   
    318.              do   
    319.              {   
    320.                  d=(d+NameList[NAME_NO-1].k%10+1)%M;   //伪随机探测再散列法处理冲突       
    321.                  sum=sum+1;   //查找次数加1       
    322.              }while (HashList[d].k!=0);   
    323.              HashList[d].k=NameList[NAME_NO-1].k;   
    324.              HashList[d].py=NameList[NAME_NO-1].py;   
    325.              HashList[d].si=sum+1;   
    326.          }   
    327.      }   
    328. }   
    329.    
    330.    
    331. void main()   
    332.    
    333. {   
    334.     char ch1;   
    335.     printf("                                 哈希表 ");   
    336.     printf("               *-------------------------------------------* ");    
    337.     printf("               |              D. 显示哈希表                | ");    
    338.     printf("               |              F. 查找                      | ");   
    339.     printf("               |              S. 删除                      | ");   
    340.     printf("               |              E. 插入                      | ");   
    341.     printf("               |              Q. 退出                      | ");   
    342.     printf("               *-------------------------------------------* ");    
    343.     InitNameList();                                   
    344.     CreateHashList ();                           
    345.     while(1)   
    346.     {   
    347.         printf("        Option-:");   
    348.         fflush(stdin);   
    349.         ch1=getchar();   
    350.         if (ch1=='D'||ch1=='d')     
    351.             Display();      
    352.         else if (ch1=='F'||ch1=='f')    
    353.             FindList();   
    354.         else if (ch1=='S'||ch1=='s')   
    355.             DeleteList();   
    356.         else if (ch1=='E'||ch1=='e')   
    357.             EnterList();   
    358.         else if (ch1=='Q'||ch1=='q')    
    359.             return;   
    360.         else    
    361.         {    
    362.             printf(" 请输入正确的选择!");    
    363.         }   
    364.     }   
    365. }   
  • 相关阅读:
    Maven的配置文件-settings.xml内容分解
    数据库管理工具-Navicat Premium 12
    转:android Support 兼容包详解
    转:聊聊mavenCenter和JCenter
    转:serialVersionUID作用
    Android 6.0 权限知识学习笔记
    X86和X86_64和X64有什么区别?
    Android 问题汇总(持续更新)
    Android-armebi-v7a、arm64-v8a、armebi的坑
    HttpUrlConnection 基础使用
  • 原文地址:https://www.cnblogs.com/new0801/p/6176840.html
Copyright © 2020-2023  润新知