迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > C语言 >

在 C 语言中实现字典

作者:迹忆客 最近更新:2023/05/05 浏览次数:

本文将演示关于如何在 C 语言中实现字典的多种方法。


使用 hcreatehsearchhdestroy 在 C 语言中实现字典功能

一般来说,C 标准库不包含内置的字典数据结构,但 POSIX 标准规定了哈希表管理例程,可以利用这些例程来实现字典功能。即:hcreatehsearchhdestroy 提供了创建哈希表、在表中插入项、在表中搜索项以及对整个数据结构进行重新分配等功能。尽管实现的功能是最基本的,但它可以解决很多问题场景。

首先,需要调用 hcreate 函数来创建一个给定最大元素数的哈希表,该表作为唯一的参数传递。需要注意的是,在 hcreate 调用后,容量是不能修改的,因此,用户需要在代码结构中考虑这个问题。一旦创建了表,就可以调用 hsearch 函数向其中添加元素。它需要 2 个参数;第一个参数的类型是 ENTRY,定义为 struct,其中 char*为键,void*为对应的数据。第二个参数的类型是 ACTION,本质上是一个 enum,由 FINDENTER 两个元素组成。后面的值用来指示对表进行什么操作。

#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

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

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 中的字典以键值对的形式构成一组元素。列表可以在一个公共名称和特定索引下存储不同类型的元素。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便