#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;
}
}
}
void FindList() //查找
{
char name[20] = { 0 };
int s0 = 0, r, sum = 1, adr, d;
printf("\n請輸入姓名的拼音:");
scanf("%s", name);
for (r = 0; r<20; r++) //求出姓名的拼音所對應的整數(關鍵字)
s0 += name[r];
adr = s0%M; //使用哈希函數
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\n地址\t關鍵字\t\t搜索長度\tH(key)\t 姓名\n"); //顯示的格式
for (i = 0; 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");
}
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()
{
char ch1;
printf("\n 哈希表的建立和查找\n");
printf(" *-------------------------------------------*\n");
printf(" | D. 顯示哈希表 |\n");
printf(" | F. 查找 |\n");
printf(" | Q. 退出 |\n");
printf(" *-------------------------------------------*\n");
InitNameList();
CreateHashList();
while (1)
{
printf("\n Option-:");
fflush(stdin);
ch1 = getchar();
if (ch1 == 'D' || ch1 == 'd')
Display();
else if (ch1 == 'F' || ch1 == 'f')
FindList();
else if (ch1 == 'Q' || ch1 == 'q')
return;
else
{
printf("\n請輸入正確的選擇!");
}
}
}