关于一个哈希表的实现

 //有个例子,参考一下;
#include <stdio.h>
#include
<stdlib.h>
#include
<string.h>
#include
<ctype.h>


#define N 30
#define L 38
#define P 37

typedef 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);
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值