📅  最后修改于: 2023-12-03 14:54:46.660000             🧑  作者: Mango
哈希表表是一种基于key-value存储结构的数据结构,操作系统中常用哈希表表来实现快速的查找、插入、删除等操作。以下是一个简单的哈希表表实现的示例:
哈希函数是哈希表表的核心,它用于将key转换成哈希表表中的位置。一个好的哈希函数应该尽可能地将key映射为不同的位置,以便于减小哈希冲突的概率。以下是一个简单的哈希函数实现:
// 计算字符串的哈希值
int hash(const char* str, int size) {
int sum = 0;
while (*str) {
sum += *str++;
}
return sum % size;
}
一个哈希表表通常由一个数组和一个哈希函数组成。数组的大小根据需要确定,哈希函数可以根据实际情况选择不同的实现。以下是一个简单的哈希表表定义:
#define TABLE_SIZE 10000
typedef struct Entry {
char* key;
void* value;
struct Entry* next;
} Entry;
typedef struct Table {
Entry* entries[TABLE_SIZE];
} Table;
查找操作是哈希表表的主要操作之一。在哈希表表中,我们通过哈希函数将key转换为数组下标,然后在对应的位置上查找对应的value。如果该位置上没有对应的value,说明该key不存在;否则说明该key存在,返回对应的value即可。以下是一个简单的查找操作实现:
void* get(Table* table, const char* key) {
int index = hash(key, TABLE_SIZE);
Entry* entry = table->entries[index];
while (entry) {
if (!strcmp(entry->key, key)) {
return entry->value;
}
entry = entry->next;
}
return NULL;
}
插入操作是哈希表表的另一个主要操作。在哈希表表中,我们通过哈希函数将key转换为数组下标,然后在对应的位置上插入对应的value。如果该位置上已经存在对应的value,则需要进行冲突解决,例如使用链表等方式实现。以下是一个简单的插入操作实现:
void put(Table* table, const char* key, void* value) {
int index = hash(key, TABLE_SIZE);
Entry* entry = table->entries[index];
while (entry) {
if (!strcmp(entry->key, key)) {
entry->value = value;
return;
}
entry = entry->next;
}
entry = (Entry*)malloc(sizeof(Entry));
entry->key = strdup(key);
entry->value = value;
entry->next = table->entries[index];
table->entries[index] = entry;
}
删除操作是哈希表表的另一个常用操作。在哈希表表中,我们同样通过哈希函数将key转换为数组下标,然后在对应的位置上删除对应的value。如果该位置上存在对应的value,则将其删除即可。以下是一个简单的删除操作实现:
void* remove(Table* table, const char* key) {
int index = hash(key, TABLE_SIZE);
Entry* entry = table->entries[index];
Entry* prev = NULL;
while (entry) {
if (!strcmp(entry->key, key)) {
if (prev) {
prev->next = entry->next;
} else {
table->entries[index] = entry->next;
}
void* value = entry->value;
free(entry->key);
free(entry);
return value;
}
prev = entry;
entry = entry->next;
}
return NULL;
}
以上是一个简单的哈希表表实现,它可以实现快速的查找、插入、删除等基本操作。在实际应用中,我们可以根据具体需求选择不同的哈希函数、冲突解决方式等,以实现更高效、更灵活的哈希表表操作。