字符串哈希之散列表处理冲突 poj1880

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define M 100001
#define N 100

struct node       //链表数组
{
    int id;
    struct node *next;
}*d[M];  

char a[M][N],b[M][N]; 
char s[N],str[N];

unsigned int ELFHash(char *str)
{
    unsigned int hash=0;
    unsigned int x=0;
    while(*str)
    {
        hash=(hash<<4)+(*str++);
        if((x=hash&0xF0000000L)!=0)
        {
            hash^=(x>>24);
            hash&=~x;
        }
    }
    return hash%M;
}
int main()
{
    int i=0;
    struct node *p;
    while(scanf("%s",str),strcmp("@END@",str)) 
    {
        int len=strlen(str);
        str[len-1]='\0';
        strcpy(a[i],str+1); //前一个字符串处理
        gets(str);          //后一个字符串处理
        strcpy(b[i],str+1);
        
        int hash=ELFHash(b[i]);  //后一个字符串的映射
        p=(struct node *)malloc(sizeof(struct node));//创建动态链表p
        p->id=i;          //给值
        p->next=d[hash];  //给链表数组的第hash个链表给首地址
        d[hash]=p;        //将链表p的首地址付给链表数组的第hash个链表
        
        hash=ELFHash(a[i]);    //前一个字符串的映射,两个字符串的i值相同
        p=(struct node *)malloc(sizeof(struct node));
        p->id=i;
        p->next=d[hash];
        d[hash]=p;
        i++;
    }
    int n;
    scanf("%d",&n);
    getchar();
    while(n--)
    {
        gets(str);
        if(str[0]=='[')
        {
            int len=strlen(str);
            str[len-1]='\0';
            strcpy(s,str+1);
        }
        else
            strcpy(s,str);
        int hash=ELFHash(s);
        p=d[hash];
        int flag1=1,flag2=1;
        while(p)
        {
            if(strcmp(b[p->id],s)==0)
            {
                flag1=0;
                break;
            }
            if(strcmp(a[p->id],s)==0)
            {
                flag2=0;
                break;
            }
            p=p->next;
        }
        if(p)
        {
            if(flag1==0)
                printf("%s\n",a[p->id]);
            else
                printf("%s\n",b[p->id]);
        }
        else
            printf("what?\n");
    }
    return 0;
}

 

posted @ 2016-04-04 13:56  请叫我凯凯大人  阅读(637)  评论(0编辑  收藏  举报