数据结构__哈希表

本篇文章记录哈希表的一些基本操作:

代码以及解释如下:

#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

 操作测试:

完结!!!!!

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值