当前位置: 首页 > news >正文

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的数据结构&#xff0c;实现以下功能&#xff1a; 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&#xff1a;链表反转&#xff1a;给你单链表的头节点 head &#xff0c;请你反转链表&#xff0c;并返回反转后的链表。 class Solution { public:ListNode* reverseList(ListNode* head) {if(headnullptr||!head->next)return head…...

极狐GitLab 17.4 重点功能解读【三】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

【unity进阶知识4】封装unity协程工具,避免 GC(垃圾回收)

文章目录 前言封装协程工具类&#xff0c;避免 GC&#xff08;垃圾回收&#xff09;使用1.使用默认方式使用协程2.使用自定义的 CoroutineTool 工具类来等待不同的时间 完结 前言 在 Unity 中&#xff0c;使用 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框架&#xff0c;欢迎stargolang应用级os框架使用案例&#xff0c;欢迎star案例&#xff1a;基于golang开发的一款超有个性的旅游计划app经历golang实战大纲golang优秀开发常用开源库汇总想学习更多golang知识&#xff0c;这里有免费的golang学习笔…...

Netty源码解析-锁机制

Netty基本介绍&#xff0c;参考 Netty与网络编程 为了提高性能&#xff0c;Netty对锁也做了大量优化 1、锁优化技术 Netty大量使用了锁优化技术&#xff1a; 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服务器部署产品应用&#xff0c;但是考虑到Windows的安全性至关重要。护卫神防火墙无疑是守护Windows系统安全的得力助手。 华为云以其强大的性能和稳定的服务&#xff0c;为众多企业和开发者提供了可靠的云端基础设施。在网络环境日益复…...

最新的iOS 18版本和Android 15版本系统分别升级了哪些功能?

iOS 18 推出了多项激动人心的新功能和改进。以下是一些亮点&#xff1a; 日记应用&#xff1a;一款全新的日记应用&#xff0c;旨在帮助用户记录日常经历、想法和活动&#xff0c;利用设备内置智能功能建议主题&#xff0c;并根据照片、位置和其他数据组织条目。 眼动追踪导航…...

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首页&#xff0c;点击自己的头像 2.在个人主页界面&#xff0c;按F12打开控制台&#xff0c;并找到network&#xff0c;找到get-business开头的请求&#xff0c;右键copy他的url 3.选择console,输入一下代码&#xff0c;其中fetch里面的url是你刚…...

计算机组成原理(笔记5原码和补码的乘法以及直接补码阵列乘法器 )

原码一位乘法 手算&#xff1a;过程 令x′|x|0.x1x2…xn-1xn&#xff0c;y′|y|0.y1y2…yn-1yn 同时令乘积P′ |P| x′ y′&#xff0c;有&#xff1a; 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中&#xff0c;所有内容都抽象成资源&#xff0c;用户需要通过操作资源来管理k8s k8s本身就是一个集群系统&#xff0c;用户可以在集群中部署服务&#xff0c;在k8s集群中运行一个个的容器&#xff0c;将指定的程序部署到容器中 k8s最小的管理单元是pod&…...

操作简单 地检编码器 武汉正向科技售后优质

武汉正向科技的地检编码器以导轨式安装方式&#xff0c;方便拆卸&#xff0c;立体结构造型&#xff0c;节约空间。 格雷母线定位系统由格雷母线&#xff0c;天线箱&#xff0c;解码器&#xff0c;编码器等部件构成。 用途 地上检测方式地址信号的编码、功率放大&#xff0c;与…...

2024中国新能源汽车零部件交易会,开源网安展示了什么?

近日&#xff0c;2024中国新能源汽车零部件交易会在十堰国际会展中心举行。开源网安车联网安全实验室携车联网安全相关产品及解决方案亮相本次交易会&#xff0c;保障智能网联汽车“车、路、云、网、图、边”安全&#xff0c;推动智能网联汽车技术突破与产业化发展。 中国新能源…...

Java解析嵌套jar中class文件

一、简述 Maven项目通过package打成jar包后&#xff0c;jar包中包含所有依赖lib文件。本文介绍了两种方式解析嵌套jar中的class文件&#xff0c;一种是通过spring-boot-loader包JarFileArchive&#xff0c;另一种是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.视频演示地址 系统定义了三个…...

vscode里如何用git

打开vs终端执行如下&#xff1a; 1 初始化 Git 仓库&#xff08;如果尚未初始化&#xff09; git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件&#xff1a;-&#xff08;纯文本文件&#xff0c;二进制文件&#xff0c;数据格式文件&#xff09; 如文本文件、图片、程序文件等。 目录文件&#xff1a;d&#xff08;directory&#xff09; 用来存放其他文件或子目录。 设备…...

DAY 47

三、通道注意力 3.1 通道注意力的定义 # 新增&#xff1a;通道注意力模块&#xff08;SE模块&#xff09; class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

10-Oracle 23 ai Vector Search 概述和参数

一、Oracle AI Vector Search 概述 企业和个人都在尝试各种AI&#xff0c;使用客户端或是内部自己搭建集成大模型的终端&#xff0c;加速与大型语言模型&#xff08;LLM&#xff09;的结合&#xff0c;同时使用检索增强生成&#xff08;Retrieval Augmented Generation &#…...

初探Service服务发现机制

1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能&#xff1a;服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源&#xf…...

视觉slam十四讲实践部分记录——ch2、ch3

ch2 一、使用g++编译.cpp为可执行文件并运行(P30) g++ helloSLAM.cpp ./a.out运行 二、使用cmake编译 mkdir build cd build cmake .. makeCMakeCache.txt 文件仍然指向旧的目录。这表明在源代码目录中可能还存在旧的 CMakeCache.txt 文件,或者在构建过程中仍然引用了旧的路…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式

今天是关于AI如何在教学中增强学生的学习体验&#xff0c;我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育&#xff0c;这并非炒作&#xff0c;而是已经发生的巨大变革。教育机构和教育者不能忽视它&#xff0c;试图简单地禁止学生使…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点&#xff1a; 多级缓存&#xff0c;先查本地缓存&#xff0c;再查Redis&#xff0c;最后才查数据库热点数据重建逻辑使用分布式锁&#xff0c;二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...