1 哈希链表的原理及算法实现
1.1 哈希表的原理
哈希表:散列表,它是基于快速存取的角度设计的,是一种典型的“空间换时间”的做法。
有如下一些概念:
- 键(key): 可以是编号 如, 1 、 5 、 19 。 。 。
- 值(value): 存储的值。
- 索引:数组的下标(0,1,2,3,4) ,用以快速定位和检索数据。
- 哈希桶:保存索引的数组(链表或数组),数组成员为每一个索引值相同的多个元素。
- 哈希函数:将组key映射到索引上,可以采用求余法。
1.2 哈希链表的算法实现
哈希链表数据结构的定义:
#define DEFAULT_SIZE 16
typedef struct _ListNode
{
struct _ListNode *next;
int key;
void *data;
}ListNode;
typedef ListNode *List;
typedef ListNode *Element;
typedef struct _HashTable
{
int TableSize;
List *Thelists;
}HashTable;
哈希函数:
/*根据 key 计算索引,定位 Hash 桶的位置*/
int Hash(int key, int TableSize)
{
return (key%TableSize);
}
哈希链表初始化:
/*初始化哈希表*/
HashTable *InitHash(int TableSize)
{
int i = 0;
HashTable *hTable = NULL;
if (TableSize <= 0) {
TableSize = DEFAULT_SIZE;
}
hTable = (HashTable *)malloc(sizeof(HashTable));
if (NULL == hTable)
{
printf("HashTable malloc error.\n");
return NULL;
}
hTable->TableSize = TableSize;
//为 Hash 桶分配内存空间,其为一个指针数组
hTable->Thelists = (List *)malloc(sizeof