Hash表(散列表)是一种数据结构,通过哈希函数将键(key)映射到存储位置,实现快速的查找、插入和删除操作。在Linux C中,Hash表通常用于高效地管理数据集合。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct Node {
char *key;
int value;
struct Node *next;
} Node;
typedef struct HashTable {
int size;
Node **table;
} HashTable;
unsigned int hash(const char *key, int size) {
unsigned int hash = 0;
while (*key) {
hash = (hash << 5) + *key++;
}
return hash % size;
}
HashTable* createHashTable(int size) {
HashTable *ht = malloc(sizeof(HashTable));
ht->size = size;
ht->table = calloc(size, sizeof(Node *));
return ht;
}
void insert(HashTable *ht, const char *key, int value) {
unsigned int index = hash(key, ht->size);
Node *newNode = malloc(sizeof(Node));
newNode->key = strdup(key);
newNode->value = value;
newNode->next = ht->table[index];
ht->table[index] = newNode;
}
int search(HashTable *ht, const char *key) {
unsigned int index = hash(key, ht->size);
Node *node = ht->table[index];
while (node) {
if (strcmp(node->key, key) == 0) {
return node->value;
}
node = node->next;
}
return -1; // Not found
}
void delete(HashTable *ht, const char *key) {
unsigned int index = hash(key, ht->size);
Node *prev = NULL;
Node *node = ht->table[index];
while (node) {
if (strcmp(node->key, key) == 0) {
if (prev) {
prev->next = node->next;
} else {
ht->table[index] = node->next;
}
free(node->key);
free(node);
return;
}
prev = node;
node = node->next;
}
}
void freeHashTable(HashTable *ht) {
for (int i = 0; i < ht->size; i++) {
Node *node = ht->table[i];
while (node) {
Node *temp = node;
node = node->next;
free(temp->key);
free(temp);
}
}
free(ht->table);
free(ht);
}
int main() {
HashTable *ht = createHashTable(10);
insert(ht, "apple", 1);
insert(ht, "banana", 2);
printf("Value of 'apple': %d\n", search(ht, "apple"));
delete(ht, "apple");
printf("Value of 'apple' after deletion: %d\n", search(ht, "apple"));
freeHashTable(ht);
return 0;
}
问题1:哈希冲突
原因:不同的键通过哈希函数映射到同一个位置。
解决方法:
问题2:性能下降
原因:哈希表负载过高,导致查找效率降低。
解决方法:
通过以上方法,可以有效管理和优化Linux C中的Hash表,确保其在各种应用场景中都能发挥最佳性能。
领取专属 10元无门槛券
手把手带您无忧上云