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.视频演示地址 系统定义了三个…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
Spring数据访问模块设计
前面我们已经完成了IoC和web模块的设计,聪明的码友立马就知道了,该到数据访问模块了,要不就这俩玩个6啊,查库势在必行,至此,它来了。 一、核心设计理念 1、痛点在哪 应用离不开数据(数据库、No…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
使用Matplotlib创建炫酷的3D散点图:数据可视化的新维度
文章目录 基础实现代码代码解析进阶技巧1. 自定义点的大小和颜色2. 添加图例和样式美化3. 真实数据应用示例实用技巧与注意事项完整示例(带样式)应用场景在数据科学和可视化领域,三维图形能为我们提供更丰富的数据洞察。本文将手把手教你如何使用Python的Matplotlib库创建引…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
基于IDIG-GAN的小样本电机轴承故障诊断
目录 🔍 核心问题 一、IDIG-GAN模型原理 1. 整体架构 2. 核心创新点 (1) 梯度归一化(Gradient Normalization) (2) 判别器梯度间隙正则化(Discriminator Gradient Gap Regularization) (3) 自注意力机制(Self-Attention) 3. 完整损失函数 二…...
【 java 虚拟机知识 第一篇 】
目录 1.内存模型 1.1.JVM内存模型的介绍 1.2.堆和栈的区别 1.3.栈的存储细节 1.4.堆的部分 1.5.程序计数器的作用 1.6.方法区的内容 1.7.字符串池 1.8.引用类型 1.9.内存泄漏与内存溢出 1.10.会出现内存溢出的结构 1.内存模型 1.1.JVM内存模型的介绍 内存模型主要分…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
上位机开发过程中的设计模式体会(1):工厂方法模式、单例模式和生成器模式
简介 在我的 QT/C 开发工作中,合理运用设计模式极大地提高了代码的可维护性和可扩展性。本文将分享我在实际项目中应用的三种创造型模式:工厂方法模式、单例模式和生成器模式。 1. 工厂模式 (Factory Pattern) 应用场景 在我的 QT 项目中曾经有一个需…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
