新书推介:《语义网技术体系》
作者:瞿裕忠,胡伟,程龚
   XML论坛     W3CHINA.ORG讨论区     计算机科学论坛     SOAChina论坛     Blog     开放翻译计划     新浪微博  
 
  • 首页
  • 登录
  • 注册
  • 软件下载
  • 资料下载
  • 核心成员
  • 帮助
  •   Add to Google

    >> 本版讨论高级C/C++编程、代码重构(Refactoring)、极限编程(XP)、泛型编程等话题
    [返回] 计算机科学论坛计算机技术与应用『 C/C++编程思想 』 → 请教高手:构造哈希表 查看新帖用户列表

      发表一个新主题  发表一个新投票  回复主题  (订阅本版) 您是本帖的第 5660 个阅读者浏览上一篇主题  刷新本主题   树形显示贴子 浏览下一篇主题
     * 贴子主题: 请教高手:构造哈希表 举报  打印  推荐  IE收藏夹 
       本主题类别:     
     zyc_1999 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:3
      积分:61
      门派:XML.ORG.CN
      注册:2007/1/7

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zyc_1999发送一个短消息 把zyc_1999加入好友 查看zyc_1999的个人资料 搜索zyc_1999在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看zyc_1999的博客楼主
    发贴心情 请教高手:构造哈希表

    已知一个英文单词的序列,要求对其建立哈希表ht,哈希函数h(key)为关键字的第一个字母在字母表中的序号,哈希表的长度为m,其装填因子小于1,处理冲突的方法为线性探测再散列法.编写一个建立哈希表的程序.(用C/C++语言)

       收藏   分享  
    顶(0)
      




    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/1/7 13:12:00
     
     zyc_1999 帅哥哟,离线,有人找我吗?
      
      
      等级:大一新生
      文章:3
      积分:61
      门派:XML.ORG.CN
      注册:2007/1/7

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给zyc_1999发送一个短消息 把zyc_1999加入好友 查看zyc_1999的个人资料 搜索zyc_1999在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看zyc_1999的博客2
    发贴心情 
    请大家帮帮忙啊~
    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/1/7 17:43:00
     
     卷积内核 帅哥哟,离线,有人找我吗?
      
      
      威望:8
      头衔:总统
      等级:博士二年级(版主)
      文章:3942
      积分:27590
      门派:XML.ORG.CN
      注册:2004/7/21

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给卷积内核发送一个短消息 把卷积内核加入好友 查看卷积内核的个人资料 搜索卷积内核在『 C/C++编程思想 』的所有贴子 访问卷积内核的主页 引用回复这个贴子 回复这个贴子 查看卷积内核的博客3
    发贴心情 
    好长时间没看数据结构了,哈希表和线性探测再散列法什么的都忘了。

    ----------------------------------------------
    事业是国家的,荣誉是单位的,成绩是领导的,工资是老婆的,财产是孩子的,错误是自己的。

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/1/9 8:31:00
     
     一分之千 帅哥哟,离线,有人找我吗?射手座1984-11-30
      
      
      威望:1
      等级:研一(随老板参加了WWW大会还和Tim Berners-Lee合了影^_^)
      文章:632
      积分:4379
      门派:XML.ORG.CN
      注册:2006/12/31

    姓名:(无权查看)
    城市:(无权查看)
    院校:(无权查看)
    给一分之千发送一个短消息 把一分之千加入好友 查看一分之千的个人资料 搜索一分之千在『 C/C++编程思想 』的所有贴子 引用回复这个贴子 回复这个贴子 查看一分之千的博客4
    发贴心情 
    给你看看这个例子的,不太一样,参考下吧~
    ====================
    #include <stdio.h>
    #include<conio.h>
    #include<string.h>
    //#include<windows.h>

    #define HASH_LEN 50                     //哈希表的长度         
    #define M 47                            
    #define NAME_NO 30                     //人名的个数        

    typedef struct NAME       
    {
     char *py;   //名字的拼音
     int k;      //拼音所对应的整数
    }NAME;
    NAME NameList[HASH_LEN];                 


    typedef struct  hterm    //哈希表
    {
     char *py;  //名字的拼音
     int k;     //拼音所对应的整数
     int si;    //查找长度
    }HASH;
    HASH HashList[HASH_LEN];                            

    /*-----------------------姓名(结构体数组)初始化---------------------------------*/
    void InitNameList()               
    {
     NameList[0].py="chenghongxiu";
     NameList[1].py="yuanhao";
     NameList[2].py="yangyang";
     NameList[3].py="zhanghen";
     NameList[4].py="chenghongxiu";
     NameList[5].py="xiaokai";
     NameList[6].py="liupeng";
     NameList[7].py="shenyonghai";
     NameList[8].py="chengdaoquan";
     NameList[9].py="ludaoqing";
     NameList[10].py="gongyunxiang";
     NameList[11].py="sunzhenxing";
     NameList[12].py="sunrongfei";
     NameList[13].py="sunminglong";
     NameList[14].py="zhanghao";
     NameList[15].py="tianmiao";
     NameList[16].py="yaojianzhong";
     NameList[17].py="yaojianqing";
     NameList[18].py="yaojianhua";
     NameList[19].py="yaohaifeng";
     NameList[20].py="chengyanhao";
     NameList[21].py="yaoqiufeng";
     NameList[22].py="qianpengcheng";
     NameList[23].py="yaohaifeng";
     NameList[24].py="bianyan";
     NameList[25].py="linglei";
     NameList[26].py="fuzhonghui";
     NameList[27].py="huanhaiyan";
     NameList[28].py="liudianqin";
     NameList[29].py="wangbinnian";
     
     char *f;
     int r,s0;
     
     for (int i=0;i<NAME_NO;i++)   //求出各个姓名的拼音所对应的整数
     {
      s0=0;
      f=NameList[i].py;
      
      for (r=0;*(f+r) != '\0';r++) //方法:将字符串的各个字符所对应的ASCII码相加,所得的整数做为哈希表的关键字
       s0=*(f+r)+s0;
      
      NameList[i].k=s0;
     } 
    }

    /*-----------------------建立哈希表---------------------------------*/
    void CreateHashList()    
    {
     for (int i=0; i<HASH_LEN;i++)       //哈希表的初始化
     {
      HashList[i].py="";
      HashList[i].k=0;
      HashList[i].si=0;
     }
     
     for (i=0;  i<NAME_NO;  i++)       
     {
      int sum=0;
      int adr=(NameList[i].k) % M;    //哈希函数
      int d=adr;
      if(HashList[adr].si==0)        //如果不冲突
      {
       HashList[adr].k=NameList[i].k;
       HashList[adr].py=NameList[i].py;
       HashList[adr].si=1;
      }
      else   //冲突  
      {
       do
       {
        d=(d+((NameList[i].k))%10+1)%M;  //伪散列    
        sum=sum+1;  //查找次数加1    
       }while (HashList[d].k!=0);
       
       HashList[d].k=NameList[i].k;
       HashList[d].py=NameList[i].py;
       HashList[d].si=sum+1;
      }
     }
    }


    /*-------------------------------------查找------------------------------------*/
    void  FindList()     

     printf("\n\n请输入姓名的拼音:   ");    //输入姓名
     char name[20]={0}; 
     scanf("%s",name); 
     
     int s0=0;
     for (int r=0;r<20;r++)    //求出姓名的拼音所对应的整数(关键字)
      s0+=name[r]; 
     
     int sum=1;
     int adr=s0 % M;  //使用哈希函数
     int d=adr;
     
     if(HashList[adr].k==s0)         //分3种情况进行判断
      printf("\n姓名:%s  关键字:%d  查找长度为: 1",HashList[d].py,s0); 
     else if (HashList[adr].k==0)
      printf("无该记录!");
     else
     {
      int g=0;
      do
      {
       d=(d+s0%10+1)%M;      //伪散列                       
       sum=sum+1;
       if (HashList[d].k==0)
       {
        printf("无记录! ");  
        g=1;     
       }
       if (HashList[d].k==s0)
       {    
        printf("\n姓名:%s  关键字:%d  查找长度为:%d",HashList[d].py,s0,sum); 
        g=1;  
       }
      }while(g==0);   
     }  
    }


    /*--------------------------------显示哈希表----------------------------*/
    void  Display()         
    {
       printf("\n\n地址\t关键字\t\t搜索长度\tH(key)\t\t拼音 \n"); //显示的格式

     for(int i=0; i<15; i++)
     {
      printf("%d ",i); 
      printf("\t%d ",HashList[i].k);
      printf("\t\t%d ",HashList[i].si);
      printf("\t\t%d ",(HashList[i].k)%M);
      printf("\t %s ",HashList[i].py);
      printf("\n");
     }

     printf("按任意键继续显示...\n");  //由于数据比较多,所以分屏显示(以便在Win9x/DOS下能看到所有的数据)
     getch();
     for( i=15; i<30; i++)
     {
      printf("%d ",i); 
      printf("\t%d ",HashList[i].k);
      printf("\t\t%d ",HashList[i].si);
      printf("\t\t%d ",(HashList[i].k)%M);
      printf("\t %s ",HashList[i].py);
      printf("\n");
     }

     printf("按任意键继续显示...\n");
     getch();
     for( i=30; i<40; i++)
     {
      printf("%d ",i); 
      printf("\t%d ",HashList[i].k);
      printf("\t\t%d ",HashList[i].si);
      printf("\t\t%d ",(HashList[i].k)%M);
      printf("\t %s ",HashList[i].py);
      printf("\n");
     }

     printf("按任意键继续显示...\n");
     getch();
     for( i=40; i<50; i++)
     {
      printf("%d ",i); 
      printf("\t%d ",HashList[i].k);
      printf("\t\t%d ",HashList[i].si);
      printf("\t\t%d ",(HashList[i].k)%M);
      printf("\t %s ",HashList[i].py);
      printf("\n");
     }
     
     float average=0;
     for (i=0;i<HASH_LEN;i++)
      average+=HashList[i].si; 
     average/=NAME_NO;
     printf("\n\n平均查找长度:ASL(%d)=%f \n\n",NAME_NO,average); 
    }


    /*--------------------------------主函数----------------------------*/
    void main()
    {
    /*  ::SetConsoleTitle("哈希表操作");       //Windows API函数,设置控制台窗口的标题
     HANDLE hCon = ::GetStdHandle(STD_OUTPUT_HANDLE); //获得标准输出设备的句柄
     ::SetConsoleTextAttribute(hCon, 10|0);   //设置文本颜色
    */
     printf("\n------------------------哈希表的建立和查找----------------------");
     InitNameList();                                
     CreateHashList ();                        
     
     while(1)
     {
      printf("\n\n");
      printf("    1. 显示哈希表\n"); 
      printf("    2. 查找\n"); 
      printf("    3. 退出\n");
      
    err:  
      char ch1=getch();
      if (ch1=='1')  
       Display();   
      else if (ch1=='2') 
       FindList();
      else if (ch1=='3') 
       return;
      else
      {
       printf("\n请输入正确的选择!");
       goto err;
      }
     }
    }

    ----------------------------------------------
    越学越无知

    点击查看用户来源及管理<br>发贴IP:*.*.*.* 2007/1/9 8:58:00
     
     GoogleAdSense射手座1984-11-30
      
      
      等级:大一新生
      文章:1
      积分:50
      门派:无门无派
      院校:未填写
      注册:2007-01-01
    给Google AdSense发送一个短消息 把Google AdSense加入好友 查看Google AdSense的个人资料 搜索Google AdSense在『 C/C++编程思想 』的所有贴子 访问Google AdSense的主页 引用回复这个贴子 回复这个贴子 查看Google AdSense的博客广告
    2024/11/23 1:26:42

    本主题贴数4,分页: [1]

    管理选项修改tag | 锁定 | 解锁 | 提升 | 删除 | 移动 | 固顶 | 总固顶 | 奖励 | 惩罚 | 发布公告
    W3C Contributing Supporter! W 3 C h i n a ( since 2003 ) 旗 下 站 点
    苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》
    93.750ms