步骤:
1.首先确定散列表的大小,一般选择一个质数作为散列表的大小,例如:13、31、97等等。
2.创建一个结构体或数组来表示散列表,每个元素对应一个桶或槽,用于存储数据。
3.定义一个散列函数,该函数将输入的键(通常是字符串)映射到散列表中的特定位置。
4.实现散列函数时,可以使用一些常见的方法,如除留余数法、乘法取整法、平方取中法等。选择合适的散列函数方法取决于特定的需求和数据集。
5.在散列函数中,将建转换为散列值,并根据所选择的散列表大小,对散列值进行取余运算,以确保它适合散列表的大小范围内。
6.将散列值作为散列表的索引,将键存储在相应的桶中。
示例:
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define TABLE_SIZE 13
//哈希函数
unsigned int hash(char* key)
{
unsigned int hash_value = 0;
unsigned int key_length = strlen(key);
//索引值的计算方法
for (int i = 0; i < key_length; i++)
{
hash_value = hash_value * 31 + key[i];
}
return hash_value % TABLE_SIZE;
}
int main()
{
//创建散列表
char* hash_table[TABLE_SIZE];
//初始化散列表
for (int i = 0; i < TABLE_SIZE; i++)
{
hash_table[i] = NULL;
}
//添加键值对到散列表
char keys[][100] = { "apple","banana","cat","dog","elephant" };
int num_keys = sizeof(keys) / sizeof(keys[0]);
for (int i = 0; i < num_keys; i++)
{
unsigned int index = hash(keys[i]);
hash_table[index] = keys[i];
//输出哈希函数的计算结果
printf("%d\n", index);
}
//遍历散列表并打印键值对
for (int i = 0; i < TABLE_SIZE; i++)
{
if (hash_table[i] != NULL)
{
printf("Index %d:%s\n", i, hash_table[i]);
}
}
return 0;
}
代码结果为:
dog被覆盖。
结论:
这段示例演示了一个简单的字符串散列函数,它使用了乘法取整法来计算键的散列值,并使用一个字符串数组来模拟散列表。