哈希表拉链法

#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;
}

运行截图

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值