本篇文章记录哈希表的一些基本操作:
代码以及解释如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 97
typedef struct P{
char id[12];
char name[7];
char sex[3];
char grade[10];
} HashTable[M];//结构体构建,用于存数据使用
int hash(char id[])//哈希函数,计算关键字的下标,这里使用的是数据分析法和除留余数法
{
int d;
d=((id[8]-'0')*100+(id[9]-'0')*10+(id[10]-'0'))%97;//留最后的三位进行分析和计算
return d;
}
void hashTable(HashTable HT,char *filename)//建立哈希表的函数
{
int i;
int d;//哈希值
int di;//线性探测法增量序列
int Hi;//线性探测法得到的地址Hi
FILE *fp;
char id[12];
char name[7];
char sex[3];
char grade[10];
for(i=0;i<M;i++)//初始化表中的数据全部为空
{
strcpy(HT[i].id,"");//strcpy函数的作用就是将逗号后面的内容复制到逗号前面
strcpy(HT[i].name,"");
strcpy(HT[i].sex,"");
strcpy(HT[i].grade,"");
}
if((fp=fopen(filename,"r"))==NULL)//判断输入的文件路径里是否有文件
{
printf("文件%s不存在",filename);
exit(0);
}
while(!feof(fp))//当有文件的时候进行输入
{
fscanf(fp,"%s%s%s%s",id,name,sex,grade);
d=hash(id);
if(strcmp(HT[d].id,"")==0)
{
strcpy(HT[d].id,id);
strcpy(HT[d].name,name);
strcpy(HT[d].sex,sex);
strcpy(HT[d].grade,grade);
}
else
{
for(di=1;di<M;di++)//这一部分是处理冲突,利用的是线性分析法
{
Hi=(d+di)%M;
if(strcmp(HT[Hi].id,"")==0)
{
strcpy(HT[Hi].id,id);
strcpy(HT[Hi].name,name);
strcpy(HT[Hi].sex,sex);
strcpy(HT[Hi].grade,grade);
break;
}
}
}
}
}
int serch(HashTable HT,char id[])//查找函数
{
int d;
int di;
int Hi;
d=hash(id);
if(strcmp(id,HT[d].id)==0)
return d;//说明此位置找到了
else if(strcmp(HT[d].id,"")==0)
return -1;//说明在此位置没有找到,但是并不是代表没有,可能是之前冲突处理了
else{
for(di=1;di<M;di++)//所以这里要线性查找
{
Hi=(d+di)%M;
if(strcmp(id,HT[Hi].id)==0)
return Hi;
else if(strcmp(HT[Hi].id,"")==0)
return -1;//说明真就没有找到了
}
return -1;
}
}
void print(HashTable HT,int i)//单行打印数据函数
{
printf("姓名:%-10s性别:%-5s班级:%-10s\n",HT[i].name,HT[i].sex,HT[i].grade);
}
void printHT(HashTable HT)//将哈希表中的所有数据全部打印输出
{
int i;
for(i=0;i<M;i++)
{
printf("%-3d:%-15s%-10s%-5s%-10s\n",i,HT[i].id,HT[i].name,HT[i].sex,HT[i].grade);
}
}
int main()
{
HashTable HT;
int d;
char ch;
char filename[80],id[12];
printf("构造哈希表,请输入信息所在的文件的名字:");
scanf("%s",filename);
printf("哈希表中数据为:\n");
hashTable(HT,filename);
printHT(HT);
printf("**********哈希查找*************\n");
printf("\n");
while(1)
{
printf("请输入要查找的学生学号:");
scanf("%s",id);
fflush(stdin);
d=serch(HT,id);
if(d==-1)
{
printf("表中不存在学号为%s的学生记录,查找失败\n",id);
}
else
{
printf("学号为%s的学生记录为:\n",id);
print(HT,d);
}
printf("\n");
printf("是否继续查找,请按Y或者N\n");
scanf("%c",&ch);
fflush(stdin);//处理缓冲区
if(ch=='Y'||ch=='y')
continue;
else break;
}
}
?其中txt文件我放在E盘中,所以路径为E:/名单.txt
?操作测试:
完结!!!!!
|