数据结构课大作业中有这么一个模块,通过学生学号创建哈希表,方便查找学生信息,那么我们就根据学生学号来创建一个哈希表。
已知某学校学!生学号编排规则如下:
我们可以根据这个规则,通过除留余数法创建。
代码如下
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