哈希表:根据设定的哈希函数H(key)和处理冲突的方法将一组关键字映像到
一个有限的连续的地址集(区间)上,并以关键字在地址集中得像
作为记录在表中得存储位置,这种表便是哈希表,这一映像过程成
为哈希造表的散列,所得到的位置称哈希地址或散列地址。
哈希函数的构造方法:直接地址法,数字分析法,平方取中法,折叠法,
除留余数法,随即数法。
处理冲突的方法:开放地址发,再哈希法,链地址发,建立一个公共溢出域。
#define HASHSIZE 32 //32,50,101
//待存入表格数据
char *keywords[] = {
"auto", "break", "case", "char", "const", "continue", "default",
"do",
"double", "else", "enum", "extern", "float", "for", "goto",
"if",
"int", "long", "register", "return", "short", "signed", "sizeof",
"static",
"struct", "switch", "typedef", "union", "unsigned", "void", "volatile",
"while"
};
char keybuf[HASHSIZE][10];
static char val_flag[HASHSIZE];//标志已占用存储单元
void ClearFlag()
{
int i;
for (i = 0;i < HASHSIZE;i++)
{
val_flag[i] = (HASHSIZE+1);//清标志位
}
}
//哈希函数,从数据中抽出某个成员用于哈希值的计算
unsigned int hash(char *s)
{
unsigned int hashval;
int i = 0;
for (hashval = 0; *s != '\0'; s++)
hashval = *s + 31 * hashval;
hashval = hashval % HASHSIZE; //计算下标
while ((val_flag[hashval] != (HASHSIZE+1)) && ((i+hashval)<HASHSIZE))
{
i++;
hashval = (hashval + i)%HASHSIZE; //冲突处理,存储单元(下标)偏移
}
if (i<HASHSIZE)
{
printf("\n元素下标(%d): 冲突次数: %d -- ",hashval,i);
val_flag[hashval] = hashval; //表示该单元被占用
return hashval;
}
return -1;
}
int main(void)
{
int i, size, pos;
size = sizeof(keywords) / sizeof(keywords[0]);//计算关键字数量
//将数据存入哈希表
ClearFlag();
for(i = 0;i < size; i++)
strcpy(keybuf[hash(keywords[i])],keywords[i]);
//根据数据结构中某个成员作为索引值,查找对应数据
ClearFlag();
for(i = 0; i < size; i++)
{
pos = hash(keywords[i]);
printf("%-10s: %-3d\n", keybuf[pos], pos);
}
return 0;
}