C语言实现对哈希表的操作:创建哈希表与扩容哈希表

一. 简介

前面文章简单了解了哈希表 这种数据结构,文章如下:

什么是哈希表-CSDN博客

本文来学习一下哈希表,具体学习一下C语言实现对哈希表的简单实现。

二. C语言实现对哈希表的操作

1. 哈希表

哈希表(Hash Table,又称散列表)是一种高效的数据结构,用于实现键值对(Key-Value)的存储和快速查找。其核心思想是通过哈希函数将键(Key)映射到数组的特定位置(称为“桶”或“槽”),从而在平均情况下实现接近常数时间复杂度(O(1))的插入、删除和查找操作。

2. C语言实现哈希表操作

(1) 定义哈希表节点结构体与哈希表结构体
#define  HASH_TABLE_LENGTH  20   //链表容量
#define  LOAD_FACTOR        0.85 //负载因子//哈希表节点结构
typedef struct hash_node {char *key; //键int value; //值struct hash_node* next; //下一个节点指针(用于解决冲突)
} hash_node;//哈希表结构
typedef struct hash_table {hash_node** buckets; //桶数组size_t size; //当前元素数量size_t capacity; //哈希表长度
} hash_table;

hash_node结构体表示每个键值对,hash_table表示每个桶,每个桶中存放一个链表。

(2) 创建哈希表,扩容哈希表容量
//创建哈希表
hash_table* create_hash_table(void) {hash_table* hash_tables = (hash_table*)malloc(sizeof(hash_table));if(!hash_tables) {printf("hash_table malloc failed!\n");return NULL;}hash_tables->size = 0;hash_tables->capacity = HASH_TABLE_LENGTH;hash_tables->buckets = (hash_node**)calloc(hash_tables->capacity, sizeof(hash_node*));if(!hash_tables->buckets) {printf("hash_tables->buckets calloc failed!\n");return NULL;}return hash_tables;
}//哈希函数的实现(djb2哈希算法)
unsigned long hash_func(const char* str) {unsigned long hash = 5381;int c;while((c = *str++)) {hash = ((hash << 5)+hash)+c;}return hash;
}//调节哈希表长度(扩容)
int resize_hash_table(hash_table* hash_tables, size_t new_capacity) {//分配新桶数组hash_node** new_buckets = (hash_node**)calloc(new_capacity, sizeof(hash_node*));if(!new_buckets) {printf("new_buckets calloc failed!\n");return -1;}int i = 0;//遍历原有桶数组,并重新哈希for(i = 0; i < hash_tables->capacity; i++) {hash_node* node = hash_tables->buckets[i];while(node != NULL) {hash_node* tmp_node = node->next;unsigned long new_index = hash_func(node->key)/ new_capacity;//采用头插入法,插入到新桶中node->next = new_buckets[new_index];new_buckets[new_index] = node;//遍历下一个元素node = tmp_node;}}hash_tables->buckets = new_buckets;hash_tables->capacity = new_capacity;free(hash_tables->buckets);return 0;
}

创建哈希表比较简单,这里不做说明。

调整哈希表容量接口这里进行一下说明:

首先,分配新哈希表的容量。

其次,遍历原来哈希表中所有元素(键值对),将旧的哈希表中元素插入到哈希表新桶中。由于哈希表的容量发生了改变,原有的键值对需要重新计算哈希值并插入到新的哈希表中。

node->next = new_buckets[new_index]; 
new_buckets[new_index] = node;

这两行代码的作用是将当前处理的哈希表节点 node 插入到新哈希表的对应桶(bucket)中,采用的是头插法。

node->next = new_buckets[new_index];
  • 含义:将当前节点 nodenext 指针指向新哈希表中对应桶的头节点。
  • 作用:这一步是为了把当前节点插入到新桶的头部。若新桶原本为空,new_buckets[new_index] 会是 NULL,那么 node->next 就会被设为 NULL;若新桶已经有节点存在,new_buckets[new_index] 就会指向桶中的头节点,此时 node->next 就会指向这个头节点。
new_buckets[new_index] = node;
  • 含义:把新哈希表中对应桶的头节点更新为当前节点 node
  • 作用:经过这一步,当前节点 node 就成为了新桶的头节点。原本新桶中的节点(如果有的话)就变成了 node 的后继节点。

(3) 向哈希表中插入新的键值对

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/902888.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

UML 活动图详解:以机票预订系统用户注册为例

目录 一、UML 活动图的基本元素 二、题目原型 三、机票预订系统用户注册的活动图分析 四、活动图绘画 五、总结 在软件开发过程中&#xff0c;UML&#xff08;统一建模语言&#xff09;活动图是一种非常重要的工具&#xff0c;它能够帮助我们清晰地理解系统的业务流程和工…

FX10(CYUSB4014)USB3.2(10Gbps)开发笔记分享(1):硬件设计与开发环境搭建

作者&#xff1a;Hello&#xff0c;Panda 大家早上好&#xff0c;中午好&#xff0c;下午好&#xff0c;晚上好&#xff0c;熊猫君又来了。这次计划做一个连载&#xff0c;大概6期左右&#xff0c;主要介绍英飞凌最新的FX5/10/20的器件应用。目前&#xff0c;熊猫君手上调试的…

前端项目部署

一、本地服务器部署&#xff1a; 解决页面刷新404问题&#xff1a; 1、使用 hash 模式 2、当路径不匹配的时候&#xff0c;直接访问 index.html 3、使用插件&#xff1a;connect-history-api-fallback https://www.npmjs.com/package/connect-history-api-fallback npm ins…

观测云数据在Grafana展示的最佳实践

背景 在当今的数据驱动世界中&#xff0c;组织越来越依赖于实时数据来做出决策。数据可视化是理解和分析这些数据的关键工具&#xff0c;它帮助用户将复杂的数据集转换成直观的图表和仪表板&#xff0c;从而更容易识别趋势、模式和异常。Grafana&#xff0c;作为一个功能强大的…

架构师面试(三十六):广播消息

题目 在像 IM、短视频、游戏等实时在线类的业务系统中&#xff0c;一般会有【广播消息】业务&#xff0c;这类业务具有瞬时高流量的特点。 在对【广播消息】业务实现时通常需要同时写 “系统消息库” 和更新用户的 “联系人库” 的操作&#xff0c;用户的联系人表中会有未读数…

大模型微调 - transformer架构

什么是Transformer Transformer 架构是由 Vaswani 等人在 2017 年提出的一种深度学习模型架构&#xff0c;首次发表于论文《Attention is All You Need》中 Transformer 的结构 Transformer 编码器&#xff08;Encoder&#xff09; 解码器&#xff08;Decoder&#xff09; …

基于华为云 ModelArts 的在线服务应用开发(Requests 模块)

基于华为云 ModelArts 的在线服务应用开发&#xff08;Requests 模块&#xff09; 一、本节目标 了解并掌握 Requests 模块的特点与用法学会通过 PythonRequests 访问华为云 ModelArts 在线推理服务熟悉 JSON 模块在 Python 中的数据序列化与反序列化掌握 Python 文件 I/O 的基…

python pymysql如何保证数据库更新成功

python pymysql如何保证数据库更新成功 在使用Python的PyMySQL库与MySQL数据库交互时,确保数据库更新操作成功执行,可以通过以下几种方式: 使用execute()和commit() 当执行一个更新(UPDATE)、插入(INSERT)或删除(DELETE)操作时,你需要调用execute()方法来执行SQL语句…

【数据可视化-30】Netflix电影和电视节目数据集可视化分析

&#x1f9d1; 博主简介&#xff1a;曾任某智慧城市类企业算法总监&#xff0c;目前在美国市场的物流公司从事高级算法工程师一职&#xff0c;深耕人工智能领域&#xff0c;精通python数据挖掘、可视化、机器学习等&#xff0c;发表过AI相关的专利并多次在AI类比赛中获奖。CSDN…

【深度强化学习 DRL 快速实践】逆向强化学习算法 (IRL)

Inverse Reinforcement Learning (IRL) 详解 什么是 Inverse Reinforcement Learning&#xff1f; 在传统的强化学习 (Reinforcement Learning, RL) 中&#xff0c;奖励函数是已知的&#xff0c;智能体的任务是学习一个策略来最大化奖励 而在逆向强化学习 (Inverse Reinforc…

入侵检测系统(IDS)与入侵防御系统(IPS):功能对比与部署实践

入侵检测系统&#xff08;IDS&#xff09;与入侵防御系统&#xff08;IPS&#xff09;&#xff1a;功能对比与部署实践 在网络安全防御体系中&#xff0c;入侵检测系统&#xff08;Intrusion Detection System, IDS&#xff09;与入侵防御系统&#xff08;Intrusion Preventio…

P12167 [蓝桥杯 2025 省 C/Python A] 倒水

P12167 [蓝桥杯 2025 省 C/Python A] 倒水 题目描述 小蓝有 n n n 个装了水的瓶子&#xff0c;从左到右摆放&#xff0c;第 i i i 个瓶子里装有 a i a_i ai​ 单位的水。为了美观&#xff0c;小蓝将水循环染成了 k k k 种颜色&#xff0c;也就是说&#xff0c;第 i i i …

短视频矩阵系统可视化剪辑功能开发,支持OEM

在短视频营销与内容创作竞争日益激烈的当下&#xff0c;矩阵系统中的可视化剪辑功能成为提升内容产出效率与质量的关键模块。它以直观的操作界面和强大的编辑能力&#xff0c;帮助创作者快速将创意转化为优质视频。本文将结合实际开发经验&#xff0c;从需求分析、技术选型到核…

制作一款打飞机游戏22:表格导出

编辑器功能扩展 今天&#xff0c;我想让编辑器能够处理一个数组&#xff0c;这是编辑器将要编辑的东西&#xff0c;它只编辑数组。这些区域在后续的不同版本的编辑器中会有不同的含义&#xff0c;但现在我想创建一个模板&#xff0c;能够加载一个二维数组&#xff0c;并将二维…

AI数据分析的利器:解锁BI工具的无限潜力

在数字化浪潮席卷全球的今天&#xff0c;数据已成为企业最宝贵的资产之一。如何高效、准确地分析这些数据&#xff0c;挖掘其中的价值&#xff0c;成为企业决策的关键。AI数据分析&#xff0c;作为新时代的数据分析利器&#xff0c;正逐渐改变着企业的决策方式。而BI&#xff0…

【每天一个知识点】IPv4(互联网协议版本4)和IPv6(互联网协议版本6)

IPv4&#xff08;互联网协议版本4&#xff09;和IPv6&#xff08;互联网协议版本6&#xff09;是用于在互联网上标识和定位设备的两种主要协议。它们的主要区别在于地址空间、结构、以及一些附加功能。以下是两者的对比&#xff1a; 1. 地址长度 IPv4: 地址长度为32位&#xf…

numpy.random.normal与numpy.random.randn的区别与联系

先说结论&#xff1a; numpy.random.normal 对应的是 正态分布&#xff0c;numpy.random.randn 对应的是标准正态分布&#xff0c;所以 numpy.random.randn 是 numpy.random.normal 的一个特例。 1. numpy.random.normal 从正态&#xff08;高斯&#xff09;分布中抽取随机样…

基于 EFISH-SBC-RK3588 的无人机智能巡检终端方案‌

一、硬件架构设计‌ ‌核心算力平台&#xff08;EFISH-SBC-RK3588&#xff09;‌ ‌异构计算能力‌&#xff1a;搭载 8 核 ARM 架构&#xff08;4Cortex-A762.4GHz 4Cortex-A551.8GHz&#xff09;&#xff0c;集成 6 TOPS NPU 与 Mali-G610 GPU&#xff0c;支持多传感器数据并…

软测面经(私)

测试流程 分析需求——>制定测试计划——>设计测试用例——>执行测试——>编写测试报告 黑盒测试 等价类划分、边界值分析法、猜错法、随机数法、因果图。 白盒测试 代码检查法、程序变异、静态结构分析法、静态质量度量法、符号测试法、逻辑覆盖法、域测试、…

那些年踩过的坑之Arrays.asList

一、前言 熟悉开发的兄弟都知道&#xff0c;在写新增和删除功能的时候&#xff0c;大多数时候会写成批量的&#xff0c;原因也很简单&#xff0c;批量既支持单个也支持多个对象的操作&#xff0c;事情也是发生在这个批量方法的调用上&#xff0c;下面我简单说一下这个事情。 二…