HashMap哈希表练习
一、练习要求
使用顺序表和单链表通过C语言实现一个HashMap的数据结构,实现以下功能:
1、PHashMap createHashMap(int size);
2、int putValue(PHashMap map, int key, EleType value);
3、EleType getValue(PHashMap map, int key);
4、printHashMap(PHashMap map);
5、int destroyHashMap(PHashMap map);
6、int hashCode(PHashMap map, int key);
二、关键结构体的定义
hash.h
typedef struct{int id;//学号char name[20];//姓名float score;//分数
}Stu, *PStu;typedef struct n{Stu stu;struct n *next;
}Node, *PNode;typedef struct{PNode* pTable;//指针数组int tableSize;//顺序表的大小int len;//元素数量
}HashMap, *PHashMap;PHashMap createHashMap(int tableSize);
int putValue(PHashMap map, int id, Stu stu);
int hashCode(int id, int tableSize);//计算hashcode
void printHashMap(PHashMap map);
void getValue(PHashMap map,int id);
void destroyHashMap(PHashMap map);
三、函数的实现
hash.c
#include "hash.h"PHashMap createHashMap(int tableSize){PHashMap map=(PHashMap)malloc(sizeof(HashMap));map->len=0;map->tableSize=tableSize;//PNode *p=(PNode*)malloc(sizeof(PNode)*tableSize);map->pTable=p;//清空新分配的数组空间for(int i=0;i<tableSize;i++){*(p+i)=NULL;}printf("HashMap创建成功\n");return map;
}int putValue(PHashMap map, int id, Stu stu){int index = hashCode(id, map->tableSize);//单链表头插法map->pTable[index];//PNode p=(PNode)malloc(sizeof(Node));memcpy(&p->stu, &stu, sizeof(stu));p->next=map->pTable[index];map->pTable[index]=p;map->len++;printf("[%d]数据存储成功,hashcode=[%d]\n", p->stu.id, index);return 1;
}int hashCode(int id, int tableSize){return id%tableSize;
}void printHashMap(PHashMap map){PNode *table=map->pTable;for(int i=0;i<map->tableSize;i++){printf("第[%d]行:\n", i);if(table[i] == NULL){printf("\tNULL:\n");continue;}//遍历单链表PNode p=table[i];while(p){printf("\tid=[%d],name=[%s],score=[%.1f]\n",p->stu.id, p->stu.name, p->stu.score);p=p->next;}}
}void getValue(PHashMap map, int id){int hashcode = hashCode(id, map->tableSize); PNode p = map->pTable[hashcode];while(p){if(p->stu.id == id){printf("SUCCESS:找到了元素:id=[%d],name=[%s],score=[%.1f]\n",p->stu.id,p->stu.name,p->stu.score);return;}p=p->next;}printf("ERROR:没有找到id为[%d]的元素\n", id);
}void destroyHashMap(PHashMap map){//先销毁链表for(int i=0;i<map->tableSize;i++){PNode p = map->pTable[i];while(p){PNode temp=p;p=p->next;free(temp);}}//再销毁顺序表free(map);printf("销毁成功!\n");}
四、测试代码
main.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include "hash.h"int main(int argc, const char *argv[])
{Stu a[]={{1,"aaa",1.1},{2,"bbb",2.2},{3,"ccc",3.3},{4,"ddd",4.4},{5,"eee",5.5},{6,"fff",6.6},{7,"ggg",7.7},{8,"hhh",8.8},{9,"iii",9.9},{10,"jjj",10.1}};int len=sizeof(a)/sizeof(Stu);//tableSize故意设置小一点,让hashcode碰撞printf(">>创建HashMap:\n");PHashMap map = createHashMap(5);//通过put往map里面存值printf(">>putValue:\n");for(int i=0;i<len;i++){putValue(map, a[i].id, a[i]);}//打印printf(">>打印HashMap:\n");printHashMap(map);//执行查找操作printf("\n>>执行查找id为8的元素\n");getValue(map, 8);printf("\n>>执行查找id为100的元素\n");getValue(map, 100);//销毁hashMapprintf("\n>>执行HashMap销毁\n");destroyHashMap(map);return 0;
}
五、运行结果
>>创建HashMap:
HashMap创建成功
>>putValue:
[1]数据存储成功,hashcode=[1]
[2]数据存储成功,hashcode=[2]
[3]数据存储成功,hashcode=[3]
[4]数据存储成功,hashcode=[4]
[5]数据存储成功,hashcode=[0]
[6]数据存储成功,hashcode=[1]
[7]数据存储成功,hashcode=[2]
[8]数据存储成功,hashcode=[3]
[9]数据存储成功,hashcode=[4]
[10]数据存储成功,hashcode=[0]
>>打印HashMap:
第[0]行:id=[10],name=[jjj],score=[10.1]id=[5],name=[eee],score=[5.5]
第[1]行:id=[6],name=[fff],score=[6.6]id=[1],name=[aaa],score=[1.1]
第[2]行:id=[7],name=[ggg],score=[7.7]id=[2],name=[bbb],score=[2.2]
第[3]行:id=[8],name=[hhh],score=[8.8]id=[3],name=[ccc],score=[3.3]
第[4]行:id=[9],name=[iii],score=[9.9]id=[4],name=[ddd],score=[4.4]>>执行查找id为8的元素
SUCCESS:找到了元素:id=[8],name=[hhh],score=[8.8]>>执行查找id为100的元素
ERROR:没有找到id为[100]的元素>>执行HashMap销毁
销毁成功!
六、需要继续研究的问题
1、hashcode的算法有哪些, 如果key是字符串如何预算,对比java里的hashcode的实现。
2、hashcode在代码中,对应的指针数组的下标,实际的应用中也是如此吗,我怎么记得java语言中的hashcode得到的是一个很长的字符串;
3、解决hashcode碰撞的常用方法有哪些,代码中运用到的是链表的方法;
4、当数据量不断地提升,hashmap本身怎么做动态的扩展;
5、在某些高级应用中,如果能预知或者通过统计知道某些key的查询率特别高,在发生hashcode碰撞的时候,如何把这些元素节点放在离根节点更近的地方,这样也可以提升查询效率。
也欢迎感兴趣的朋友一起讨论呀。
相关文章:
HashMap哈希表练习
一、练习要求 使用顺序表和单链表通过C语言实现一个HashMap的数据结构,实现以下功能: 1、PHashMap createHashMap(int size); 2、int putValue(PHashMap map, int key, EleType value); 3、EleType getValue(PHashMap map, int key); 4、printHashMap(PH…...

字节豆包C++一面-面经总结
talk is cheap show me the code lc206:链表反转:给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。 class Solution { public:ListNode* reverseList(ListNode* head) {if(headnullptr||!head->next)return head…...
极狐GitLab 17.4 重点功能解读【三】
GitLab 是一个全球知名的一体化 DevOps 平台,很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版,专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料: 极狐GitLab 官网极狐…...

【unity进阶知识4】封装unity协程工具,避免 GC(垃圾回收)
文章目录 前言封装协程工具类,避免 GC(垃圾回收)使用1.使用默认方式使用协程2.使用自定义的 CoroutineTool 工具类来等待不同的时间 完结 前言 在 Unity 中,使用 yield return null 、yield return new WaitForEndOfFrame()等会导…...

Source insight安装使用笔记
Source insight安装使用笔记 1.安装包下载2.安装记录3. 使用教程1.安装包下载 官网下载 可修改 C:\ProgramData\Source Insight\4.0\si4.lic 将Expiration=”2017-XX-XX”中的2017修改为2030。 本地下载 2.安装记录...
golang学习笔记29——golang 中如何将 GitHub 最新提交的版本设置为 v1.0.0
推荐学习文档 golang应用级os框架,欢迎stargolang应用级os框架使用案例,欢迎star案例:基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识,这里有免费的golang学习笔…...

Netty源码解析-锁机制
Netty基本介绍,参考 Netty与网络编程 为了提高性能,Netty对锁也做了大量优化 1、锁优化技术 Netty大量使用了锁优化技术: 1.1 减小锁粒度1.2 减少锁对象的空间占用1.3 提高锁的性能1.4 根据不同业务场景选择合适锁1.5 能不用锁则不用锁 …...
【C/C++】initializer_list
initializer_list 1 构造函数场景 class P { public:P(int a, int b) {std::cout << "int, int" << std::endl;}P(std::initializer_list<int> initList) {std::cout << "initializer_list" << std::endl;} };调用&#x…...
不要再混淆啦!一文带你学会原型链继承、构造函数继承、寄生组合继承、ES6继承
JS继承目录 一、原型链继承2、构造函数继承3、组合继承4、寄生组合继承5、ES6继承 js有几种经典的继承方式。比如 原型链继承、 构造函数继承、 组合继承、 寄生组合继承、 ES6继承。让我们一一分析并实现。同时了解每种方案的优缺点。 其实js的继承本质上是通过原型链机制…...

828华为云征文|华为云Flexus X实例Windows Server 2019安装护卫神防火墙——为企业运维安全发挥重要作用!!!
前言 公司最近需要选购一台华为云Windows服务器部署产品应用,但是考虑到Windows的安全性至关重要。护卫神防火墙无疑是守护Windows系统安全的得力助手。 华为云以其强大的性能和稳定的服务,为众多企业和开发者提供了可靠的云端基础设施。在网络环境日益复…...
最新的iOS 18版本和Android 15版本系统分别升级了哪些功能?
iOS 18 推出了多项激动人心的新功能和改进。以下是一些亮点: 日记应用:一款全新的日记应用,旨在帮助用户记录日常经历、想法和活动,利用设备内置智能功能建议主题,并根据照片、位置和其他数据组织条目。 眼动追踪导航…...

window系统DockerDesktop 部署windows容器
目录 参考文献1、安装Docker Desktop1.1 下载安装包1.2 安装教程1.3 异常解决 2、安装windows容器2.1 先启动DockerDesktop 软件界面2.2 检查docker版本2.3 拉取windows镜像2.4 网盘下载windows镜像 参考文献 windows容器docker中文官网 Docker: windows下跑windows镜像 1、安…...

CSDN文章导出md并迁移至博客园
一、获取所有文章地址 1.进csdn首页,点击自己的头像 2.在个人主页界面,按F12打开控制台,并找到network,找到get-business开头的请求,右键copy他的url 3.选择console,输入一下代码,其中fetch里面的url是你刚…...

计算机组成原理(笔记5原码和补码的乘法以及直接补码阵列乘法器 )
原码一位乘法 手算:过程 令x′|x|0.x1x2…xn-1xn,y′|y|0.y1y2…yn-1yn 同时令乘积P′ |P| x′ y′,有: x′ y′ x′(0.y1y2…yn-1yn) x′ (y12-1y22-2…yn-12-(n-1)yn2-n) 2-1(y1x′2-1(y2x′…2-1(yn-1x′2-1(ynx′0))…))…...

【hot100-java】【括号生成】
R9-回溯篇 枚举填左括号 class Solution {private int n;private char[] path;private final List<String> retnew ArrayList<>();public List<String> generateParenthesis(int n) {this.nn;//所有括号长度都是n*2pathnew char [n*2];dfs(0,0);return ret;…...

k8s_资源管理介绍
资源管理介绍 在k8s中,所有内容都抽象成资源,用户需要通过操作资源来管理k8s k8s本身就是一个集群系统,用户可以在集群中部署服务,在k8s集群中运行一个个的容器,将指定的程序部署到容器中 k8s最小的管理单元是pod&…...
操作简单 地检编码器 武汉正向科技售后优质
武汉正向科技的地检编码器以导轨式安装方式,方便拆卸,立体结构造型,节约空间。 格雷母线定位系统由格雷母线,天线箱,解码器,编码器等部件构成。 用途 地上检测方式地址信号的编码、功率放大,与…...

2024中国新能源汽车零部件交易会,开源网安展示了什么?
近日,2024中国新能源汽车零部件交易会在十堰国际会展中心举行。开源网安车联网安全实验室携车联网安全相关产品及解决方案亮相本次交易会,保障智能网联汽车“车、路、云、网、图、边”安全,推动智能网联汽车技术突破与产业化发展。 中国新能源…...
Java解析嵌套jar中class文件
一、简述 Maven项目通过package打成jar包后,jar包中包含所有依赖lib文件。本文介绍了两种方式解析嵌套jar中的class文件,一种是通过spring-boot-loader包JarFileArchive,另一种是util包中JarFile。 二、JarFileArchive方式 1.spring-boot-…...

【含文档】基于Springboot+Vue的高校竞赛管理系统(含源码+数据库+lw)
1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 系统定义了三个…...

19c补丁后oracle属主变化,导致不能识别磁盘组
补丁后服务器重启,数据库再次无法启动 ORA01017: invalid username/password; logon denied Oracle 19c 在打上 19.23 或以上补丁版本后,存在与用户组权限相关的问题。具体表现为,Oracle 实例的运行用户(oracle)和集…...

超短脉冲激光自聚焦效应
前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应,这是一种非线性光学现象,主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场,对材料产生非线性响应,可能…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...
【Web 进阶篇】优雅的接口设计:统一响应、全局异常处理与参数校验
系列回顾: 在上一篇中,我们成功地为应用集成了数据库,并使用 Spring Data JPA 实现了基本的 CRUD API。我们的应用现在能“记忆”数据了!但是,如果你仔细审视那些 API,会发现它们还很“粗糙”:有…...
工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配
AI3D视觉的工业赋能者 迁移科技成立于2017年,作为行业领先的3D工业相机及视觉系统供应商,累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成,通过稳定、易用、高回报的AI3D视觉系统,为汽车、新能源、金属制造等行…...

项目部署到Linux上时遇到的错误(Redis,MySQL,无法正确连接,地址占用问题)
Redis无法正确连接 在运行jar包时出现了这样的错误 查询得知问题核心在于Redis连接失败,具体原因是客户端发送了密码认证请求,但Redis服务器未设置密码 1.为Redis设置密码(匹配客户端配置) 步骤: 1).修…...

算法岗面试经验分享-大模型篇
文章目录 A 基础语言模型A.1 TransformerA.2 Bert B 大语言模型结构B.1 GPTB.2 LLamaB.3 ChatGLMB.4 Qwen C 大语言模型微调C.1 Fine-tuningC.2 Adapter-tuningC.3 Prefix-tuningC.4 P-tuningC.5 LoRA A 基础语言模型 A.1 Transformer (1)资源 论文&a…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
怎么让Comfyui导出的图像不包含工作流信息,
为了数据安全,让Comfyui导出的图像不包含工作流信息,导出的图像就不会拖到comfyui中加载出来工作流。 ComfyUI的目录下node.py 直接移除 pnginfo(推荐) 在 save_images 方法中,删除或注释掉所有与 metadata …...