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;
}
勤能补拙,熟能生巧
原文地址:https://www.cnblogs.com/snzhong/p/12430384.html