除留余数法创建哈希表

数据结构课大作业中有这么一个模块,通过学生学号创建哈希表,方便查找学生信息,那么我们就根据学生学号来创建一个哈希表。
已知某学校学!生学号编排规则如下:
在这里插入图片描述
我们可以根据这个规则,通过除留余数法创建。
代码如下

typedef struct
{
    Student* p[31];
}classhashlist;//班级,里面存放学生指针

typedef struct
{
    classhashlist cla[10];
}collegehashlist;//学院,一个学院默认10个班

typedef struct
{
    collegehashlist y[18];
}yearhashlist;//年级,一个年级共17个学院

void inithashlist(yearhashlist ye[])
{
    int i,j,k,l;
    for(i=0;i<5;i++)
    {
        for(j=0;j<18;j++)
        {
            for(k=1;k<6;k++)
            {
                for(l=0;l<31;l++)
                {
                    ye[i].y[j].cla[k].p[l]=NULL;
                }
            }
        }
    }
}

void Hash(string s,int& year,int& col,int& cla,int& num)
{
    string y,coll,clas,n;
    y=s.substr(0,4);
    coll=s.substr(4,3);
    clas=s.substr(7,4);
    n=s.substr(11,2);
    year=stoi(y);
    col=stoi(coll);
    cla=stoi(clas);
    num=stoi(n);
}

int searchstudent(int yno,int colno,int clano,int num,yearhashlist ye[])
{
    if(num>=0 && num<=30 && ye[yno].y[colno].cla[clano].p[num]!=NULL)
    {
        cout<<*(ye[yno].y[colno].cla[clano].p[num]);
        return 1;
    }
    else
        return 0;
}

int searchclass(int yno,int colno,int cla,int num,yearhashlist y[])
{
    return searchstudent(yno,colno,cla%10,num,y);
}

int searchcollege(int yno,int college,int cla,int num,yearhashlist y[])
{
    if(college<=317 && college>300)
        return searchclass(yno,college-300,cla,num,y);
    else
        return 0;
}

int searchstu(int y,int college,int cla,int num,yearhashlist ye[])
{
    if(y-2023>=0 && y-2023<=3)
        return searchcollege(y-2023,college,cla,num,ye);
    else
        return 0;
}

void hashlistcreate(string id,yearhashlist ye[],Student *ps)
{
    int year,college,clas,num;
    Hash(id,year,college,clas,num);
    ye[year-2023].y[college-300].cla[clas%10].p[num]=ps;
}

结构体定义:
结构体是嵌套定义,按照年级,学院,班级的顺序定义,班级里面有学生指针。
Hash通过把学号分段,转化成为数字,这相当于取余数,然后把对应的部分存在对应的结构体位置上,这是实现哈希的主要过程。
查找的过程通过不停的判断学号位置,如果合规(在对应的学号区间)就继续找,不合规就返回0,在主函数中有判断的语句来实现。
如果找到就输出学生信息(类的定义中实现了重载),没有找到就返回0。
【数据结构大作业1.0版本讲解及演示-哔哩哔哩】 https://b23.tv/Ag5AdSS

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值