在 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 字典转换为 Pandas DataFrame
发布时间:2024/04/20 浏览次数:73 分类:Python
-
本教程演示如何将 python 字典转换为 Pandas DataFrame,例如使用 Pandas DataFrame 构造函数或 from_dict 方法。
C# 中的字典与哈希表
发布时间:2024/01/19 浏览次数:176 分类:编程语言
-
本指南将讨论 C# 中 Dictionary 和 Hashtable 之间的区别。你应该更喜欢哪一个?本指南将讨论 C# 中 Dictionary 和 Hashtable 之间的区别。
在 C# 中将字典转换为列表集合
发布时间:2024/01/19 浏览次数:218 分类:编程语言
-
本教程将演示如何在 C# 中将字典转换为列表集合。在 C# 中,可以使用作为 System.Linq 扩展的一部分的 ToList() 方法将字典转换为列表。
在 Python 字典中按值查找键
发布时间:2023/12/23 浏览次数:128 分类:Python
-
本教程演示了如何在 Python 字典中按值获取键。字典是一个键值对中的元素集合。字典中存储的元素是无序的。
按键值顺序绘制 Python 字典
发布时间:2023/12/23 浏览次数:91 分类:Python
-
本教程介绍了如何在 python 中绘制一个字典。本教程介绍了如何使用 Python 的 matplotlib 库中的 pyplot 模块在 Python 中绘制一个字典。
Python 获取字典中的第一个键
发布时间:2023/12/23 浏览次数:154 分类:Python
-
本教程说明了如何在 python 中获取字典的第一键。本教程介绍了我们如何在 Python 字典中获取首键。所谓首键,是指保存在字典第一个索引中的键。
初始化 Python 字典
发布时间:2023/12/23 浏览次数:155 分类:Python
-
本教程演示如何在 python 中初始化字典。Python 字典是有序且可变的。字典不允许存储重复项。在 Python 3.6 及以下版本中,字典曾经是无序的。
在 Python 字典中寻找最大值
发布时间:2023/12/23 浏览次数:130 分类:Python
-
本教程介绍了如何在 Python 中获取字典中具有最大值的键。本教程介绍了如何在 Python 中获取一个具有最大值的键。由于该方法与以前的 Python 版本相比已经发生了变化,因此它还列出了一些示例
Python 中的字典数组或列表
发布时间:2023/12/18 浏览次数:144 分类:Python
-
本教程演示了如何在 Python 中创建字典数组。Python 中的字典以键值对的形式构成一组元素。列表可以在一个公共名称和特定索引下存储不同类型的元素。