#include <iostream.h>
#include <ctype.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <iomanip.h>
#include <string.h>
#define Maxranum 10
#define P 10
struct student{
int key;
};
struct student stu[30]={0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0,
0,0,0,0,0,0,0,0,0,0};
int RandomList[10]={18,19,20,21,22,23,24,25,26,27};
char Name[10][19]={{"Wang Duo"}
,{"Wei Hongzhuo"}
,{"Li Zenglei"}
,{"Fei Xiaoyu"}
,{"Lv Hongwei"}
,{"Lv Ziguang"}
,{"Lu Jie"}
,{"Chen Xueshi"}
,{"Wan Chan"}
,{"Zhang Li"}};
int HUSH(int h)
{
return (abs(h%(P+1)));
}
void InitHushList()
{
int i,j,k;
int a,b;
int ascnum,temp1;
int len;
for(i=0;i<10;i++)
{
len=strlen(Name[i]);
for(j=0,a=0;j<len;j++)
{
a=a+toascii(Name[i][j]);
ascnum=a;
}//for
b=HUSH(ascnum);
if(stu[b].key==0)
{
stu[b].key=ascnum;
}
else
{
for(k=0;k<Maxranum;k++)
{
temp1=RandomList[k];
if(stu[temp1].key==0)
{
stu[temp1].key=ascnum;
break;
}
else continue;
}//for
}//else
}//for
}//InitHushList
int Search(int k,int p)
{
int i;
if(stu[p].key==k)
{
return p;
}
else
{
for(i=0;i<Maxranum;i++)
{
p=RandomList[i];
if(stu[p].key==k)
return p;
else continue;
}//for
}//else
}//search
void test()//测试哈西表的正确性
{
int i;
int tlen;
int j,a,b,ascnum;
cout<<"名字"<<" "<<"关键字"<<" "<<"哈希地址"<<endl;
for(i=0;i<10;i++)
{
tlen=strlen(Name[i]);
for(j=0,a=0;j<tlen;j++)
{
a=a+toascii(Name[i][j]);
ascnum=a;
cout<<Name[i][j];
}//for
b=HUSH(ascnum);
cout<<setw(15)<<ascnum;
cout<<setw(15)<<b+1;
cout<<endl;
}
cout<<"已经建好的哈西表如下:"<<endl;
for(i=0;i<30;i++)
{
cout<<setw(4)<<i+1;
}
cout<<endl;
for(i=0;i<30;i++)
{
cout<<setw(4)<<stu[i].key;
}
cout<<endl;
}
void main()
{
int i,a,b;
int len;
int KEY,position;
char temp[19];
InitHushList();
test();
cout<<endl;
cout<<"请输入要查找的姓名:"<<endl;
gets(temp);
len=strlen(temp);
for(a=0,i=0;i<len;i++)
{
a=a+toascii(temp[i]);
}
cout<<"名字对应的关键字是:"<<" "<<a<<endl;
KEY=a;
position=HUSH(KEY);
b=Search(KEY,position);
cout<<endl;
if(b==0)
{
cout<<"没有这个姓名!"<<endl;
}
else cout<<"姓名找到:HUSH表中的位置是:"<<b+1<<endl;
cout<<endl;
}//main