首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于哈希表的使用,请大家指教,该怎么解决

2012-04-15 
关于哈希表的使用,请大家指教如题,大家能不能给个完整的关于建立嵌套哈希表的例子,用C++写的一个完整的程

关于哈希表的使用,请大家指教
如题,大家能不能给个完整的关于建立嵌套哈希表的例子,用C++写的一个完整的程序,谢谢大家啊,谁给了一定给大家加全分,谢谢谢谢啊,我好急,希望好心人能帮个忙!!!

[解决办法]

C/C++ code
//有个例子,参考一下;#include <stdio.h>#include <stdlib.h>#include <string.h>#include <ctype.h>#define N 30#define L 38#define P 37typedef struct {    char *name;    char *py;    int k;}old;old oldlist[N];typedef struct {    char *name;    char *py;    int k;      int b;  }hx;hx hlist[L];void InputOldlist(){      int i,s=0,r;    /*for(i=1;i<=N;i++){        oldlist[i-1].name=(char*)malloc(sizeof(char)*20);        printf("请输入人名:");        gets(oldlist[i-1].name);        oldlist[i-1].py=(char*)malloc(sizeof(char)*20);        printf("请输入拼音:");        gets(oldlist[i-1].py);    }*/    oldlist[0].name="栾雪峰";    oldlist[0].py="luan xue feng";    oldlist[1].name="刘翔";        oldlist[1].py="liu xiang";    oldlist[2].name="马三立";    oldlist[2].py="ma san li";    oldlist[3].name="李开复";        oldlist[3].py="li kai fu";    oldlist[4].name="李彦宏";    oldlist[4].py="li yan hong";    oldlist[5].name="王冰杰";    oldlist[5].py="wang bin jie";    oldlist[6].name="孟茂昌";    oldlist[6].py="meng mao chang";    oldlist[7].name="蒋睿杰";    oldlist[7].py="jiang rui jie";    oldlist[8].name="嫦娥";    oldlist[8].py="chang er";    oldlist[9].name="孙悟空";    oldlist[9].py="sun wu kong";    oldlist[10].name="猪八戒";    oldlist[10].py="zhu ba jie";    oldlist[11].name="徐琛";    oldlist[11].py="xu chen";    oldlist[12].name="唐僧";    oldlist[12].py="tang seng";    oldlist[13].name="周星驰";    oldlist[13].py="zhou xing chi";    oldlist[14].name="董寸瑞";    oldlist[14].py="dong cun rui";    oldlist[15].name="黄继光";    oldlist[15].py="huang ji guang";    oldlist[16].name="金庸";    oldlist[16].py="jin rong";    oldlist[17].name="杨过";    oldlist[17].py="yang guo";    oldlist[18].name="小龙女";    oldlist[18].py="xiao long nv";    oldlist[19].name="郭大侠";    oldlist[19].py="guo da xia";    oldlist[20].name="黄蓉";    oldlist[20].py="huang rong";    oldlist[21].name="老师";    oldlist[21].py="lao shi";    oldlist[22].name="学生";    oldlist[22].py="xue sheng";    oldlist[23].name="小平同志";    oldlist[23].py="xiao ping tong zhi";    oldlist[24].name="泽民";    oldlist[24].py="ze min";    oldlist[25].name="圣诞老人";    oldlist[25].py="sheng dan lao ren";    oldlist[26].name="朱德庸";    oldlist[26].py="zhu de yong";    oldlist[27].name="阿扁";    oldlist[27].py="a bian";    oldlist[28].name="连战";    oldlist[28].py="lian zhan";    oldlist[29].name="幸福";    oldlist[29].py="xing fu";         for (i=0;i<N;i++)    {                for(s=0,r=0;oldlist[i].py[r]!='\0';r++)        {                        s=toascii(oldlist[i].py[r])+s;        }        oldlist[i].k=s;    }}void hash(){    int i,adr,d;    float average,sum=0;    for (i=0;i<L;i++)      {        hlist[i].name="";        hlist[i].py="";        hlist[i].k=0;        hlist[i].b=0;    }        for (i=0;i<N;i++)      {             adr=(oldlist[i].k)%P;        d=adr;        if(hlist[adr].b==0)        {            hlist[adr].k=oldlist[i].k;            hlist[adr].name=oldlist[i].name;            hlist[adr].py=oldlist[i].py;            hlist[adr].b=1;            sum=sum+1;        }        else        {            do            {   d=(d+adr%10+1)%P;                sum=sum+1;            }while (hlist[d].b!=0);            hlist[d].k=oldlist[i].k;            hlist[d].name=oldlist[i].name;            hlist[d].py=oldlist[i].py;            hlist[d].b=1;        }    }    average=sum/30;    printf("平均查找长度为:%f\n",average);    if(average>2)    hash();}void findlist()   {    char c[20];        int i=0,d,g,adr,s=0;    printf("请输入你要查找的人的拼音:\n");    getchar();    gets(c);        for(i=0;c[i]!='\0';i++)    {        s=toascii(c[i])+s;    }    adr=s%P;    d=adr;    if(strcmp(hlist[adr].py,c)==0)    {        printf("姓名:%s 拼音:%s 哈希表中存储位置:%d\n",hlist[adr].name,hlist[adr].py,adr);    }    else          if(hlist[adr].b==0)            {              printf("哈希表中无记录!\n");            }         else          {             g=0;             for (i=0;g==0;i++)             {    d=(d+adr%10+1)%P;                 if(hlist[d].b==0)                 {                     printf("哈希表中无记录!\n");                     g=1;                 }                 if(strcmp(hlist[d].py,c)==0)                 {                     printf("姓名:%s 拼音:%s 哈希表中存储位置:%d\n",hlist[d].name,hlist[d].py,d);                     g=1;                 }             }         }}void printlist(){    int i;    for(i=0;i<L;i++)    printf("%s    %s    %d \n",hlist[i].name,hlist[i].py,hlist[i].k);}void main(){    int ch;    InputOldlist();    hash();    do    {        printf("1.查找  2.输出哈希表  3.退出程序\n");        scanf("%d",&ch);        switch(ch)        {        case 1:            findlist();            printf("Press any key to continue.\n");            break;        case 2:            printlist();            printf("Press any key to continue.\n");            break;        case 3:            break;        default:              printf("No this operation.\n");            printf("Press any key to continue.\n");        }        getchar();    }while (ch!=3);} 


[解决办法]

C/C++ code
哈希表的建立和查找2007年06月15日 星期五 11:44/* 针对某个集体(比如所在班级)中的人名设计一个哈希表,使的平均查找的长度不超过2完成相应的建表和查表的程序题目要求:       假设人名为姓名的汉语拼音形式,待填入哈希表的人名工有30个,取平均查找长度的上限    为2。哈希函数用除留余数法构造,用伪随机探测再散列法处理冲突。   测试数据       自定义。 */#include<stdio.h>#include<conio.h>#define HASH_LEN 50                      //哈希表的长度         #define M 47                            //随机数#define NAME_NO 30                      //人名的个数        typedef struct      {char *py;    //名字的拼音int k;       //拼音所对应的整数}NAME;NAME NameList[HASH_LEN];    //全局变量NAME             typedef struct    //哈希表{char *py;   //名字的拼音int k;      //拼音所对应的整数int si;     //查找长度}HASH;HASH HashList[HASH_LEN];        //全局变量HASH                     void InitNameList() //姓名(结构体数组)初始化          {char *f;int r,s0,i;NameList[0].py="wanghui";NameList[1].py="mayuelong";NameList[2].py="chenzhicheng";NameList[3].py="sunpeng";NameList[4].py="zengqinghui";NameList[5].py="liqingbo";NameList[6].py="liujunpeng";NameList[7].py="jiangquanlei";NameList[8].py="xingzhengchuan";NameList[9].py="luzhaoqian";NameList[10].py="gaowenhu";NameList[11].py="zhuhaoyin";NameList[12].py="chenlili";NameList[13].py="wuyunyun";NameList[14].py="huangjuanxia";NameList[15].py="wangyan";NameList[16].py="zhoutao";NameList[17].py="jiangzhenyu";NameList[18].py="liuxiaolong";NameList[19].py="wangziming";NameList[20].py="fengjunbo";NameList[21].py="lilei";NameList[22].py="wangjia";NameList[23].py="zhangjianguo";NameList[24].py="zhuqingqing";NameList[25].py="huangmin";NameList[26].py="haoyuhan";NameList[27].py="zhoutao";NameList[28].py="zhujiang";NameList[29].py="lixiaojun";for (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() //建立哈希表   {int i;    for (i=0; i<HASH_LEN;i++)        {     HashList[i].py="";     HashList[i].k=0;     HashList[i].si=0;       }  for (i=0;i<HASH_LEN;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;          }}} 

热点排行