|
哈希算法求教
题目如下: 要求使用静态链表处理冲突.... 北京(B取1, 四川,上海,... 按字母顺序 静态链地址
0 -1 1 -1 -> 0 2 -1 ->7 ... 25 顺序存贮分配 0 BJ -1 1 TJ -1 ... 6 HN 5 ... 不只如何写算法. 哪位高手发一下..........十万火急 |
|
没人会吗????????摆脱大家了........ |
|
郁闷,,,,,,,,,,最后还是靠自己..........各位大侠帮我看看有没有什么问题
#include<stdio.h>
#include<string.h>
typedef struct HList{
char key[20];
int num;
int cur;
};
int Hash(char key[])
{ char ch;
ch=key[0];
if(ch>=97&&ch<=122)
ch=ch-32; //统一第一个字母为大写
ch=ch-65; //A的ASC码为65,这样使得A为0,Z为25
return ch;
}
void CreatHB(Hlist *HB[], char *key)
{ struct HList HB[32];
int i,j=-1,temp,p;
int H[26]={-1,},tp[26]; //H数组存放关键字相同的;tp存放当前关键字前驱的序号
char *key;
scanf("%s",key);
while(strcmp(key,"#")!=0)
{ h=Hash(key);
temp=tp[h];//用temp来查看关键字的前驱
H[h]=j+1; //用j来指示应该把关键字存放在HB第几个位置上
p=H[h]; //指示当前元素应存放在p位置
HB[p].key=key; //赋值
HB[p].num=p; //用num存放当前的位置
if(temp!=-1) //如果存在相同的(-1表示无)
tp[h]=HB[p].cur; //让当前的指针指向前一个相同的关键字
else HB[p].cur=-1;//否则当前为首元素,指向-1(空)
tp[h]=HB[p].num; //再把当前的位置给tp作为下一个相同关键字的前驱
scanf("%s",key);
}
}
void Search(Hlist *HB[], char *key)
{ h=Hash(key);
p=H[h]; //这时候cur实际是指向最后一个输入关键字
while(p!=-1&&strcmp(HB[P].key,key)!=0)
p=HB[p].cur; //当关键字不等切还有前驱时候向前
if(p!=-1) return p;
else return -1;
} | |
|