数据结构 散列表 除留余数法 线性探测法解决冲突

本文介绍了一个具体的散列表应用案例,通过使用除留余数法作为散列函数,并采用线性探测法解决冲突,实现了以学生编号为关键码的查找功能。文章提供了完整的C语言代码示例,展示了如何从文本文件读取学生信息并建立散列表。

已知9名学生的信息,每个学生信息包括编号和姓名。学生信息为11,王红,22,刘军,47,王亮,92,张强,16,吴迪,3,李伟,7,赵磊,29,钱鹤,8,孙芳。用散列表实现以编号为关键码的查找。散列函数使用除留余数法,散列表长11,即Hash(key)=key%11。用线性探测法解决冲突。要求从文本文件中读取学生信息(相邻数据间用空白符分隔,且姓名不含有空白符),建立散列表,然后输入学生编号,查找并显示学生姓名

文件的实现还是需要自己写一个文本文件。

  • #include<stdio.h>
    #include<stdlib.h>
    #include<string.h>
    typedef struct
    {
    	int sno;
    	char name[10];
    }student;
    
    void creat(student t,student s[],int i)
    {
    	int n;
    	n=t.sno%11;
    	if(s[n].sno==0) s[n]=t;
    	else {while(s[n%11].sno!=0)
    	n++;
    	s[n]=t; 
    	} 
     } 
    void ini(student s[],int n)
    {
    	int i;
    	for(i=0;i<n;i++)
    	{
    		s[i].sno=0;
    	}
    }
    void find(int f,student s[],int n)
    {
    	int i,j;
    	for(i=f%11,j=0;j<11;j++,i=(i+1)%11)
    	{
    		if(s[i].sno==f) 
    		{
    			printf("%d %s\n",s[i].sno,s[i].name);
    			break;
    		}
    	}
    	if(j==11)printf("未找到该学生信息!\n");
    }
    int main()
    {
    	int i=1,f;
    	char c;
    	char filename[80];
    	FILE *fp;
    	student s[11],t;
    	ini(s,11);
    	puts("请输入文本文件地址:");
    	gets(filename);
    	if((fp=fopen(filename,"r"))==NULL)
    	{
    		printf("文件打开失败!\n");
    		return 0;
    	}
    	while(!feof(fp))
    	{
    		fscanf(fp,"%d %s ",&t.sno,&t.name);
    		creat(t,s,11);
    	}
    	fclose(fp);
    	for(i=0;i<10;i++)
    	{
    		printf("%d %s\n",s[i].sno,s[i].name);
    	}
    	do{
    		printf("请输入查找学生编号(0结束)\n");
    		scanf("%d",&f);
    		if(f) find(f,s,11);
    	}while(f); 
    	return 0;
    }
    

代码输出结果为

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值