在 Linux 下,hlist
(哈希列表)是一种高效的数据结构,用于存储和检索数据
- 定义
hlist_head
:
#includestruct my_data { int key; int value; struct hlist_node node; }; struct hlist_head *my_hash_table; int hash_table_size = 1024; // 哈希表大小,可以根据需要调整
- 初始化哈希表:
my_hash_table = kcalloc(hash_table_size, sizeof(struct hlist_head), GFP_KERNEL); if (!my_hash_table) { printk(KERN_ERR "Failed to allocate memory for hash table\n"); return -ENOMEM; }
- 定义哈希函数:
static inline unsigned int my_hash_function(int key) { return (unsigned int)key & (hash_table_size - 1); }
- 向哈希表中添加元素:
void add_to_hash_table(struct my_data *data) { unsigned int index = my_hash_function(data->key); hlist_add_head(&data->node, &my_hash_table[index]); }
- 从哈希表中删除元素:
void remove_from_hash_table(struct my_data *data) { hlist_del(&data->node); }
- 查找哈希表中的元素:
struct my_data *find_in_hash_table(int key) { unsigned int index = my_hash_function(key); struct my_data *data; hlist_for_each_entry(data, &my_hash_table[index], node) { if (data->key == key) return data; } return NULL; }
- 遍历哈希表中的所有元素:
void traverse_hash_table(void) { int i; struct my_data *data; for (i = 0; i< hash_table_size; i++) { hlist_for_each_entry(data, &my_hash_table[i], node) { printk(KERN_INFO "Key: %d, Value: %d\n", data->key, data->value); } } }
- 释放哈希表内存:
void free_hash_table(void) { int i; struct my_data *data; struct hlist_node *tmp; for (i = 0; i< hash_table_size; i++) { hlist_for_each_entry_safe(data, tmp, &my_hash_table[i], node) { hlist_del(&data->node); kfree(data); } } kfree(my_hash_table); }
通过这些基本操作,你可以在 Linux 下高效地使用 hlist
。请注意,这里的示例代码仅作为参考,实际应用时可能需要根据具体需求进行调整。