求大神帮忙
哈希表查找班级学生使平均查找长度不超过2。应该怎么设计?
[解决办法]
按什么查找啊,如果是按学号找的话,查找长度1就行了啊
[解决办法]
查找的根据是什么?
[解决办法]
参考下
#include<stdio.h>#include<string.h>#define N 50#define P1 47#define LEN 20 char tbl[N][LEN];int H1(char *key){ long k,d=0; int c; while(*key) d=d+*key++; k=d; k=((k*k)%10000-(k*k)%100)/100; return k%P1;}/*int H1(char *key){ int temp[10]; long k,d=0,e; int c,f,g; while(*key) d=d+*key++; d=d*d; e=d; for(c=0;e!=0;c++) { e=e/10; } g=c; for(f=c;f>=0;f--) { temp[--g]=d%10; d/=10; } k=temp[c/2]*10+temp[c/2+1]; return k%P1;}*/int Search(char *key_word ){ int pos,c=5; pos=H1(key_word); if (strcmp(tbl[pos],key_word)==0) return pos; while(tbl[pos][0]!='\0'&& strcmp(tbl[pos],key_word) ) pos=(pos+c)%N; if(tbl[pos][0]=='\0') return -1; else return pos;}char *k_word[]={"Wangdepeng","caozuan","zhangji","baiyi","wangwang","xiaohun","xiaojun","wangan","lida","nijiang", "Wanghao","wangxiaoha","lijian","neicun","chenghao","lixiaoyang","lihui","lidada","wangxiaoxiao","caomimi", "Nidada","woshishui","pengpeng","xiaoyiyi","depeng","fadiande","zhuguanjun","baoshanwei","baowei","kouwei"};void main(){ int count[N],i,pos,c,n; char k_name[LEN]; char m; for(i=0;i<N;i++) { count[i]=0; tbl[i][0]='\0'; } n=sizeof(k_word)/sizeof(k_word[i]); for(i=0;i<n;i++) { pos=H1(k_word[i]); c=5; while(tbl[pos][0]!='\0'&&strcmp(tbl[pos],k_word[i])) { count[pos]++; pos=(pos+c)%N; } strcpy(tbl[pos],k_word[i]); } for(i=c=0;i<N;i++) if(tbl[i][0]!='\0') printf("%10s%c",tbl[i],++c%5==0? '\n':'\t'); printf("\n\n"); for(i=c=0;i<N;i++) if(tbl[i][0]!='\0') printf("%4d%c",count[i],++c%5==0? '\n':'\t'); printf("\n\n"); for(i=c=0;i<N;i++) if(tbl[i][0]!='\0') c+=count[i]+1; printf("ASL=%.2f\n\n",(float)c/n); printf("Please input a keyword:"); for(;;) { gets(k_name); pos=Search(k_name); if(pos!=-1) printf(" found at %d\n",pos); else printf("not found ! \n"); } m=getchar(); }