已知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; }
代码输出结果为