在 C 语言中实现字典
本文将演示关于如何在 C 语言中实现字典的多种方法。
使用 hcreate
、hsearch
和 hdestroy
在 C 语言中实现字典功能
一般来说,C 标准库不包含内置的字典数据结构,但 POSIX 标准规定了哈希表管理例程,可以利用这些例程来实现字典功能。即:hcreate
、hsearch
和 hdestroy
提供了创建哈希表、在表中插入项、在表中搜索项以及对整个数据结构进行重新分配等功能。尽管实现的功能是最基本的,但它可以解决很多问题场景。
首先,需要调用 hcreate
函数来创建一个给定最大元素数的哈希表,该表作为唯一的参数传递。需要注意的是,在 hcreate
调用后,容量是不能修改的,因此,用户需要在代码结构中考虑这个问题。一旦创建了表,就可以调用 hsearch
函数向其中添加元素。它需要 2 个参数;第一个参数的类型是 ENTRY
,定义为 struct
,其中 char*
为键,void*
为对应的数据。第二个参数的类型是 ACTION
,本质上是一个 enum
,由 FIND
和 ENTER
两个元素组成。后面的值用来指示对表进行什么操作。
#include <stdio.h>
#include <stdlib.h>
#include <search.h>
static char *companies[] = { "Intel", "AMD", "ARM", "Apple",
"Marvell", "Qualcomm", "IBM", "Nvidia" };
static char *uarch[] = { "Willow Cove", "Zen 3", "A78", "A14",
"ThunderX2", "Kryo", "z15", "Ampere" };
int main(void) {
ENTRY e;
ENTRY *ep;
const size_t capacity = sizeof companies / sizeof companies[0];
hcreate(capacity);
for (size_t i = 0; i < capacity - 2; i++) {
e.key = companies[i];
e.data = (void *) uarch[i];
ep = hsearch(e, ENTER);
if (ep == NULL) {
fprintf(stderr, "entry failed\n");
exit(EXIT_FAILURE);
}
}
e.key = "Intel";
ep = hsearch(e, FIND);
printf("%s -> %s\n", e.key, (char*)ep->data);
hdestroy();
exit(EXIT_SUCCESS);
}
输出:
Intel -> Willow Cove
注意,这些代码示例演示了用明文表示的键/值对,但用户可以使用哈希算法来创建键并将其存储在表中。在本例中,我们使用简单的迭代向表中添加了 6 个元素,并跳过了最后两个元素。不过接下来的 for
循环,会查询原始数组中的每一个元素,并打印出相应的数据。
hdestroy
函数是用来释放哈希表内存的,但它并不释放 ENTRY
对象中的缓冲区,这些对象通常是由用户创建的。因此,如果这些对象中的指针指向动态内存,调用者要负责为它们保留句柄,并在程序退出前进行解除分配。注意,不能从表中删除单个元素。
#include <stdio.h>
#include <stdlib.h>
#include <search.h>
static char *companies[] = { "Intel", "AMD", "ARM", "Apple",
"Marvell", "Qualcomm", "IBM", "Nvidia" };
static char *uarch[] = { "Willow Cove", "Zen 3", "A78", "A14",
"ThunderX2", "Kryo", "z15", "Ampere" };
int main(void) {
ENTRY e;
ENTRY *ep;
const size_t capacity = sizeof companies / sizeof companies[0];
hcreate(capacity);
for (size_t i = 0; i < capacity - 2; i++) {
e.key = companies[i];
e.data = (void *) uarch[i];
ep = hsearch(e, ENTER);
if (ep == NULL) {
fprintf(stderr, "entry failed\n");
exit(EXIT_FAILURE);
}
}
for (size_t i = 0; i < capacity; i++) {
e.key = companies[i];
ep = hsearch(e, FIND);
ep ? printf("%s -> %s\n", e.key, (char*)ep->data) :
printf("%s -> %s\n", e.key, "Entry not found");
}
hdestroy();
exit(EXIT_SUCCESS);
}
输出:
Intel -> Willow Cove
AMD -> Zen 3
ARM -> A78
Apple -> A14
Marvell -> ThunderX2
Qualcomm -> Kryo
IBM -> Entry not found
Nvidia -> Entry not found
相关文章
在 Python 中对字典列表进行排序
发布时间:2023/04/25 浏览次数:192 分类:Python
-
列表是 Python 中的线性集合对象,它可以通过将每个元素存储在特定索引处来模拟数组。 列表还可以存储其他对象,例如包含键值对的字典。本教程说明了如何在 Python 中对字典列表进行排序。
python 如何将字典转换为数据类
发布时间:2023/04/25 浏览次数:200 分类:Python
-
本文的主要目的是介绍 Python 中如何将嵌套字典转换为数据类。 介绍了三种不同类型的方法及其解释。
如何在 Python 中获取字典交集
发布时间:2023/04/24 浏览次数:131 分类:Python
-
本文讨论了在 Python 中对两个字典或多个字典执行交集以轻松高效地创建新字典的不同方法。
如何从 Python 字典中删除元素
发布时间:2023/04/22 浏览次数:74 分类:Python
-
在 Python 中,字典(Dictionary)是一种用于存储键值对的数据类型。有时候我们需要从字典中删除一个或多个元素,本文将介绍如何在 Python 中删除字典中的元素。 使用 del 语句删除字典
从 Python 中的字典列表中删除空字典
发布时间:2023/01/25 浏览次数:163 分类:Python
-
使用列表推导从字典列表中删除空字典,例如 new_list = [item for item in list_of_dicts if item] 。 列表推导将返回一个不包含任何空字典的新列表。 # ✅ 从列表中删除空字典(使用列表推导)
在 Python 中逐行打印字典的项目
发布时间:2023/01/25 浏览次数:130 分类:Python
-
Python 中逐行打印字典的项目: 使用 dict.items() 方法获取字典项目的视图。 使用 for 循环遍历视图。 使用 print() 函数逐行打印字典的项目。 my_dict = { id : 1 , name : jiyik , age : 30 } for key, v
Python 中在字典中查找出现次数最多的值
发布时间:2023/01/25 浏览次数:186 分类:Python
-
Python 中要在字典中查找最频繁的值: 使用 dict.values() 方法获取字典值的视图。 使用 collections.Counter() 类创建一个计数器对象。 使用 most_common() 方法获取字典中出现次数最多的值。 fr