#include<iostream>
using namespace std;
#define HASH_SIZE 30//哈希表的长度
#define Name_SIZE 30//名字表长度
#define R 29//小于哈希表长度的R
struct Name
{
string name; //姓名
int ascii = 0; //对应的ascii码和
};
struct has
{
string name; //姓名
int ascii; //对应ASCII码和
int s; //查找长度
struct has* next;
};
Name NameList[Name_SIZE];
has *hashtable[HASH_SIZE];
void init_Namelist()
{
NameList[0].name = "qijie";
NameList[1].name = "lisi";
NameList[2].name = "wangmazi";
NameList[3].name = "ergoudan";
NameList[4].name = "tieniu";
NameList[5].name = "dabendan";
NameList[6].name = "xunan";
NameList[7].name = "zhoulei";
NameList[8].name = "tanglei";
NameList[9].name = "xiaomin";
NameList[10].name = "xiaohong";
NameList[11].name = "xiaoli";
NameList[12].name = "damin";
NameList[13].name = "jinzhengyu";
NameList[14].name = "xiasaobi";
NameList[15].name = "xuyang";
NameList[16].name = "lihao";
NameList[17].name = "huangzhifeng";
NameList[18].name = "liangsifen";
NameList[19].name = "yanzhiwo";
NameList[20].name = "liyanlin";
NameList[21].name = "liuxiaohan";
NameList[22].name = "tanghuan";
NameList[23].name = "gongxiaoyu";
NameList[24].name = "haoren";
NameList[25].name = "huairen";
NameList[26].name = "shuchang";
NameList[27].name = "lixinru";
NameList[28].name = "zhouhang";
NameList[29].name = "wangcunwen";
int i, j;
for (i = 0; i < Name_SIZE; i++)
{
for (j = 0; NameList[i].name[j] != '\0'; j++)
NameList[i].ascii += NameList[i].name[j]; //ascii码求和
}
}
int num(int i)
{
return (NameList[i].ascii) % R;
}
void C_hashtable()
{
int i, key;
for (i = 0; i < HASH_SIZE; i++) //初始化哈希表
{
has* head = new has;
hashtable[i] = head;
hashtable[i]->next = NULL;
}
for (i = 0; i < Name_SIZE; i++)
{
key = num(i); //除留余数法
if (hashtable[key]->next == NULL)
{
has* p = new has;
p->name = NameList[i].name;
p->ascii = NameList[i].ascii;
p->s = 1;
hashtable[key]->next = p;
p->next = NULL;
}
else
{
int count = 1;
has* q = new has;
has* h = new has;
has* r = new has;
r->name = NameList[i].name;
r->ascii = NameList[i].ascii;
r->next = NULL;
h = hashtable[key];
q = hashtable[key]->next;
while (q)
{
h = h->next;
q = q->next;
count++;
}
r->s = count;
h->next = r;
}
}
}
void printhash()
{
int sum = 0;
for (int i = 0; i < HASH_SIZE; i++)
{
has* p = new has;
p = hashtable[i]->next;
while (p)
{
cout << p->name << " -> ";
sum += p->s;
p = p->next;
}
cout << "null";
cout << endl;
}
double ASL = 0.0;
ASL = sum / 30.0;
cout <<"平均查找长度为: " << ASL << endl;
}
void test()
{
init_Namelist();
C_hashtable();
printhash();
}
int main()
{
test();
system("pause");
return 0;
}
哈希表拉链法
最新推荐文章于 2023-05-17 15:34:59 发布