7-43 字符串关键字的散列映射 (25分)
注意:第i次冲突后第i次探测的散列地址 Hi=(H(key)+di)%p
#include <stdio.h> #include <string.h> #include <math.h> #include <malloc.h> typedef struct { int key; char value[9]; } Hash; int hash(char value[]) {//求H(key) int len=strlen(value); int sum=0; if(len==1) sum=value[len-1]-'A'; else if(len==2) sum=(value[len-2]-'A')*32+(value[len-1]-'A'); else if(len>=3) sum=(value[len-3]-'A')*32*32+(value[len-2]-'A')*32+(value[len-1]-'A'); return sum; } int main() { int n,p; scanf("%d %d",&n,&p); int i,j,k=0; int flag[p],index[n]; Hash H[n]; memset(flag,0,sizeof(flag)); memset(index,0,sizeof(index)); char c[9]; for(i=0; i<n; i++) { scanf("%s",c); for(j=0; j<k; j++) { if(!strcmp(c,H[j].value)) { index[i]=H[j].key; break; } } if(j==k) { int key=hash(c); int tag=1,d=1,D=1,tmp=key; while(flag[key%p]) { key=tmp+tag*D;//注意key不是迭代 if(key<0) key=tmp;//回退 if(tag==-1) { d++; D=d*d; } tag=-1*tag; } flag[key%p]=1; index[i]=key%p; strcpy(H[k].value,c); H[k].key=key%p; k++; } } for(i=0; i<n; i++) { if(i>0) printf(" "); printf("%d",index[i]); } return 0; }
勤能补拙,熟能生巧