#include<stdio.h>
#include<malloc.h>
#include<string.h>
//#include
#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="baojianbo";
NameList[1].py="chenjiabin";
NameList[2].py="chenxi";
NameList[3].py="dinglin";
NameList[4].py="fangzewei";
NameList[5].py="fengpan";
NameList[6].py="guidong";
NameList[7].py="hanlijuan";
NameList[8].py="haoxiaoju";
NameList[9].py="heqing";
NameList[10].py="jishaomei";
NameList[11].py="jiyunfeng";
NameList[12].py="jiangshanshan";
NameList[13].py="lixuefei";
NameList[14].py="lixueqin";
NameList[15].py="liyuanxin";
NameList[16].py="liangguannan";
NameList[17].py="liuna";
NameList[18].py="liupeiyu";
NameList[19].py="nixiaodong";
NameList[20].py="peixue";
NameList[21].py="sunke";
NameList[22].py="sunying";
NameList[23].py="wanqishuai";
NameList[24].py="wangna";
NameList[25].py="linglei";
NameList[26].py="xinnaping";
NameList[27].py="xuyuanfei";
NameList[28].py="yanlipeng";
NameList[29].py="yangmengjiao";
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 (j=0; j<=HASH_LEN;j++)
{
int sum=0;
int adr=(NameList[j].k) % M; //哈希函数
int d=adr;
if(HashList[adr].si==0) //如果不冲突
{ HashList[adr].k=NameList[j].k;
HashList[adr].py=NameList[j]].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;
}i++;
}
}
/*-------------------------------------查 找 ------------------------------------*/
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()
{ //显示哈希表
int i;
float average=0;
printf("\n地址\t关键字\t搜索长度\t哈希表地址\t 姓名\n");
for(i=0;i<Hash_LEN;i++)
{printf("%d\t",i);
printf("%d\t",Hashlist[i].key);
printf("%d\t\t",Hashlist[i].Slength);
printf("%d\t\t ",(Hashlist[i].key%M));
printf("%s",Hashlist[i].name);
printf("\n");
}
for(i=0;i<HashLength;i++)
average+=Hashlist[i].Slength;
average/=NameLength;
printf("平均查找长度:ASL(%d)=%f\n",NameLength,average);
}
/*--------------------------------主函数 ----------------------------*/
int 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;
scanf("%c",&ch1);
if (ch1=='1')
Display();
else if (ch1=='2')
FindList();
else if (ch1=='3')
return 0;
else { printf("\n请输入正确的选择!");
goto err;
}
}
}