c语言实现通用数据结构:通用映射(HashMap)

用C语言实现哈希表HashMap 用C语言,基于动态数组+链表的形式实现的的HashMap 阅读详情
AI摘要

本文介绍了一个自定义的HashMap实现,该实现基于通用链表,并详细解释了如何为不同类型的键值对提供自定义的HashCode和Equal函数。此外,还提供了完整的源代码和一个测试用例。

这是在通用链表的基础上实现的映射,关于链表的实现参见:http://blog.youkuaiyun.com/swwlqw/article/details/22498833。

注意映射中只存储了key和value的指针,没有储存实际的数据。

对于新的key类型来说,需要自定义HashCode函数和equal函数。

在HashSet的实现中给出了几个常见的hashCode函数和equal函数。参见:http://blog.youkuaiyun.com/swwlqw/article/details/22664129。


头文件:myHashMap.h

[cpp]  view plain  copy
  1. #ifndef MYHASHMAP_H_INCLUDED  
  2. #define MYHASHMAP_H_INCLUDED  
  3. #include "myList.h"  
  4.   
  5. #define DEFAULT_INITIAL_CAPACITY 16  
  6. #define DEFAULT_LOAD_FACTOR 0.75f  
  7.   
  8. typedef struct entry  
  9. {  
  10.     void * key;  
  11.     void * value;  
  12. } Entry;  
  13.   
  14. typedef struct myHashMap  
  15. {  
  16.     int size;   //大小  
  17.     int initialCapacity; //初始容量  
  18.     float loadFactor;   //加载因子  
  19.     int (*hashCode)(void *key);  
  20.     int (*equal)(void *key1,void *key2);  
  21.     MyList ** entryList;  
  22. } MyHashMap;  
  23.   
  24. typedef struct myHashMapEntryIterator  
  25. {  
  26.     int index;       //第几个链表  
  27.     MyHashMap *map;  
  28.     MyNode *current;  
  29.     int count;        //第几个数据  
  30. } MyHashMapEntryIterator;  
  31.   
  32. //创建HashMap  
  33. MyHashMap *createMyHashMap(int (*hashCode)(void *key),int (*equal)(void *key1,void *key2));  
  34.   
  35. //使用全部参数创建HashMap  
  36. MyHashMap *createMyHashMapForAll(int initialCapacity,float loadFactor,int (*hashCode)(void *key),int (*equal)(void *key1,void *key2));  
  37.   
  38. //释放HashMap  
  39. void freeMyHashMap(MyHashMap * map);  
  40.   
  41. //是否包含某个key  
  42. int myHashMapContainsKey(MyHashMap *const map,void * const key);  
  43.   
  44. //增加一条映射  
  45. void myHashMapPutData(MyHashMap *const map,void * const key,void * const value);  
  46.   
  47. //通过key得到数据,如果没有数据则返回null  
  48. void* myHashMapGetDataByKey(MyHashMap * const map,void *const key);  
  49.   
  50. //数据的容量  
  51. int myHashMapGetSize(const MyHashMap * const map);  
  52.   
  53. //创建Entry迭代器  
  54. MyHashMapEntryIterator* createMyHashMapEntryIterator( MyHashMap *const map);  
  55.   
  56. //释放Entry迭代器  
  57. void freeMyHashMapEntryIterator(MyHashMapEntryIterator* iterator);  
  58.   
  59. //Entry迭代器是否有下一个  
  60. int myHashMapEntryIteratorHasNext(MyHashMapEntryIterator* iterator);  
  61.   
  62. //遍历下一个Entry元素  
  63. Entry* myHashMapEntryIteratorNext(MyHashMapEntryIterator* iterator);  
  64.   
  65. //删除一条数据,返回是否删除成功  
  66. int myHashMapRemoveDataByKey(MyHashMap *const map,void * const key);  
  67.   
  68. //遍历  
  69. void myHashMapOutput(MyHashMap *map, void(*pt)(Entry*));  
  70.   
  71. #endif // MYHASHMAP_H_INCLUDED  

源文件:  myHashMap.c

[cpp]  view plain  copy
  1. #include "myHashMap.h"  
  2. #include <stdlib.h>  
  3.   
  4. //某条Entry链表上是否包含某个key值。  
  5. Entry* listContainsEntry(MyList * list, void * key,  
  6.         int(*equal)(void *key1, void *key2)) {  
  7.     MyListIterator* it = createMyListIterator(list);  
  8.     while (myListIteratorHasNext(it)) {  
  9.         Entry * entry = (Entry *) (myListIteratorNext(it));  
  10.         if (entry->key == key || (equal != NULL && (*equal)(entry->key, key))) {  
  11.             return entry;  
  12.         }  
  13.     }  
  14.     freeMyListIterator(it);  
  15.     return NULL;  
  16. }  
  17.   
  18. void rebuildMyHashMap(MyHashMap * map) {  
  19.     int newSize = map->initialCapacity * 2;  
  20.     MyList **newentryList = (MyList **) malloc(sizeof(MyList*) * newSize);  
  21.     for (int i = 0; i < newSize; i++) {  
  22.         newentryList[i] = createMyList();  
  23.     }  
  24.     MyHashMapEntryIterator* it = createMyHashMapEntryIterator(map);  
  25.     while (myHashMapEntryIteratorHasNext(it)) {  
  26.         Entry * entry = myHashMapEntryIteratorNext(it);  
  27.         int hasCode = (*(map->hashCode))(entry->key);  
  28.         hasCode %= newSize;  
  29.         if (hasCode < 0)  
  30.             hasCode += newSize;  
  31.         myListInsertDataAtLast(newentryList[hasCode], entry);  
  32.     }  
  33.     freeMyHashMapEntryIterator(it);  
  34.     for (int i = 0; i < map->initialCapacity; i++) {  
  35.         freeMyList(map->entryList[i]);  
  36.     }  
  37.     free(map->entryList);  
  38.     map->entryList = newentryList;  
  39.     map->initialCapacity = newSize;  
  40. }  
  41.   
  42. //创建HashMap  
  43. MyHashMap *createMyHashMap(int(*hashCode)(void *key),  
  44.         int(*equal)(void *key1, void *key2)) {  
  45.     MyHashMap *re = (MyHashMap *) malloc(sizeof(MyHashMap));  
  46.     re->size = 0;  
  47.     re->loadFactor = DEFAULT_LOAD_FACTOR;  
  48.     re->initialCapacity = DEFAULT_INITIAL_CAPACITY;  
  49.     re->entryList = (MyList **) malloc(sizeof(MyList*) * re->initialCapacity);  
  50.     re->hashCode = hashCode;  
  51.     re->equal = equal;  
  52.     for (int i = 0; i < re->initialCapacity; i++) {  
  53.         re->entryList[i] = createMyList();  
  54.     }  
  55.     return re;  
  56. }  
  57.   
  58. //使用全部参数创建HashMap  
  59. MyHashMap *createMyHashMapForAll(int initialCapacity, float loadFactor,  
  60.         int(*hashCode)(void *key), int(*equal)(void *key1, void *key2)) {  
  61.     MyHashMap *re = createMyHashMap(hashCode, equal);  
  62.     re->initialCapacity = initialCapacity;  
  63.     re->loadFactor = loadFactor;  
  64.     return re;  
  65. }  
  66.   
  67. //是否包含某个key  
  68. int myHashMapContainsKey(MyHashMap * const map, void * const key) {  
  69.     int hasCode = (*(map->hashCode))(key);  
  70.     hasCode %= map->initialCapacity;  
  71.     if (hasCode < 0)  
  72.         hasCode += map->initialCapacity;  
  73.     Entry * re = listContainsEntry(map->entryList[hasCode], key, map->equal);  
  74.     return re != NULL;  
  75. }  
  76.   
  77. //增加一条映射  
  78. void myHashMapPutData(MyHashMap * const map, void * const key,  
  79.         void * const value) {  
  80.     int hasCode = (*(map->hashCode))(key);  
  81.     hasCode %= map->initialCapacity;  
  82.     if (hasCode < 0)  
  83.         hasCode += map->initialCapacity;  
  84.     Entry * re = listContainsEntry(map->entryList[hasCode], key, map->equal);  
  85.     if (re == NULL) {  
  86.         Entry * entry = (Entry*) malloc(sizeof(Entry));  
  87.         entry->key = key;  
  88.         entry->value = value;  
  89.         myListInsertDataAtLast(map->entryList[hasCode], entry);  
  90.         (map->size)++;  
  91.         if (map->size > map->initialCapacity * map->loadFactor) {  
  92.             rebuildMyHashMap(map);  
  93.         }  
  94.     } else {  
  95.         re->value = value;  
  96.     }  
  97. }  
  98.   
  99. //通过key得到数据,如果没有数据则返回null  
  100. void* myHashMapGetDataByKey(MyHashMap * const map, void * const key) {  
  101.     int hasCode = (*(map->hashCode))(key);  
  102.     hasCode %= map->initialCapacity;  
  103.     if (hasCode < 0)  
  104.         hasCode += map->initialCapacity;  
  105.     Entry * re = listContainsEntry(map->entryList[hasCode], key, map->equal);  
  106.     if (re == NULL) {  
  107.         return NULL;  
  108.     }  
  109.     return re->value;  
  110. }  
  111.   
  112. //数据的容量  
  113. int myHashMapGetSize(const MyHashMap * const map) {  
  114.     return map->size;  
  115. }  
  116.   
  117. //创建Entry迭代器  
  118. MyHashMapEntryIterator* createMyHashMapEntryIterator(MyHashMap * const map) {  
  119.     MyHashMapEntryIterator* re = (MyHashMapEntryIterator*) malloc(  
  120.             sizeof(MyHashMapEntryIterator));  
  121.     re->count = 0;  
  122.     re->index = 0;  
  123.     re->map = map;  
  124.     re->current = map->entryList[0]->first;  
  125.     return re;  
  126. }  
  127.   
  128. //释放Entry迭代器  
  129. void freeMyHashMapEntryIterator(MyHashMapEntryIterator* iterator) {  
  130.     free(iterator);  
  131. }  
  132.   
  133. //Entry迭代器是否有下一个  
  134. int myHashMapEntryIteratorHasNext(MyHashMapEntryIterator* iterator) {  
  135.     return iterator->count < iterator->map->size;  
  136. }  
  137.   
  138. //遍历下一个Entry元素  
  139. Entry* myHashMapEntryIteratorNext(MyHashMapEntryIterator* iterator) {  
  140.     (iterator->count)++;  
  141.     while (!(iterator->current)) {  
  142.         (iterator->index)++;  
  143.         iterator->current = iterator->map->entryList[iterator->index]->first;  
  144.     }  
  145.     Entry * re = (Entry *) iterator->current->data;  
  146.     iterator->current = iterator->current->next;  
  147.     return re;  
  148. }  
  149.   
  150. //删除一条数据,返回是否删除成功  
  151. int myHashMapRemoveDataByKey(MyHashMap * const map, void * const key) {  
  152.     int hasCode = (*(map->hashCode))(key);  
  153.     hasCode %= map->initialCapacity;  
  154.     if (hasCode < 0)  
  155.         hasCode += map->initialCapacity;  
  156.     MyListIterator* it = createMyListIterator(map->entryList[hasCode]);  
  157.     int re = 0;  
  158.     while (myListIteratorHasNext(it)) {  
  159.         Entry * entry = (Entry *) (myListIteratorNext(it));  
  160.         if ((*(map->equal))(entry->key, key)) {  
  161.             myListRemoveDataAt(map->entryList[hasCode], it->count - 1);  
  162.             re = 1;  
  163.             (map->size)--;  
  164.             break;  
  165.         }  
  166.     }  
  167.     freeMyListIterator(it);  
  168.     return re;  
  169. }  
  170.   
  171. void myFree(Entry * p){  
  172.     free(p);  
  173. }  
  174.   
  175. //释放HashMap  
  176. void freeMyHashMap(MyHashMap * map) {  
  177.     myHashMapOutput(map, myFree);  
  178.     for (int i = 0; i < map->initialCapacity; i++) {  
  179.         freeMyList(map->entryList[i]);  
  180.     }  
  181.     free(map->entryList);  
  182.     free(map);  
  183. }  
  184.   
  185. //遍历  
  186. void myHashMapOutput(MyHashMap *map, void(*pt)(Entry*)) {  
  187.     MyHashMapEntryIterator* iterator = createMyHashMapEntryIterator(map);  
  188.     while (myHashMapEntryIteratorHasNext(iterator)) {  
  189.         pt(myHashMapEntryIteratorNext(iterator));  
  190.     }  
  191.     freeMyHashMapEntryIterator(iterator);  
  192. }  

测试文件

[cpp]  view plain  copy
  1. /************************* 
  2. *** File main.c 
  3. *** test for MyHashMap 
  4. **************************/  
  5. #include <stdio.h>  
  6. #include <stdlib.h>  
  7. #include "myEqual.h"  
  8. #include "myHashCode.h"  
  9. #include "myHashMap.h"  
  10.   
  11. #define S 10  
  12.   
  13. char* strs[S]=  
  14. {  
  15.     "abc",  
  16.     "qq",  
  17.     "hello",  
  18.     "abc",  
  19.     "lmy",  
  20.     "ab",  
  21.     "qq",  
  22.     "lqw",  
  23.     "sww",  
  24.     "lqw"  
  25. };  
  26.   
  27.   
  28. int main()  
  29. {  
  30.   
  31.     int*  data = malloc(sizeof(int)* S);  
  32.     for (int i=0; i<S; i++)  
  33.     {  
  34.         data[i]=i;  
  35.     }  
  36.   
  37.     //创建映射需要指定两个函数,hashCode函数和equal函数。  
  38.     MyHashMap * map = createMyHashMap(myHashCodeString, myEqualString);  
  39.   
  40.     //插入数据  
  41.     for (int i=0; i<S; i++)  
  42.     {  
  43.         myHashMapPutData(map, strs[i], &data[i]);  
  44.     }  
  45.   
  46.     //输出大小  
  47.     printf("size=%d\n",myHashMapGetSize(map));  
  48.   
  49.     //测试删除  
  50.     myHashMapRemoveDataByKey(map,"qq");  
  51.     myHashMapRemoveDataByKey(map,"ab");  
  52.     myHashMapRemoveDataByKey(map,"qwert");  
  53.   
  54.     //输出大小  
  55.     printf("after remove size=%d\n",myHashMapGetSize(map));  
  56.   
  57.     //遍历  
  58.     MyHashMapEntryIterator * it = createMyHashMapEntryIterator(map);  
  59.     while(myHashMapEntryIteratorHasNext(it))  
  60.     {  
  61.         Entry * pp= myHashMapEntryIteratorNext(it);  
  62.         char * key = pp-> key;  
  63.         int * value = pp->value;  
  64.         printf("%s(%d)\n", key, *value);  
  65.     }  
  66.     //释放遍历器  
  67.     freeMyHashMapEntryIterator(it);  
  68.   
  69.     //释放映射  
  70.     freeMyHashMap(map);  
  71.   
  72.     //释放数据  
  73.     free(data);  
  74.     return 0;  
  75. }  




C语言实现哈希映射(HashMap)的编程 哈希映射(HashMap)是一种常用的数据结构,它提供了高效的键值对存储和检索能力。首先是哈希函数,它将接收一个键并返回一个在数组范围内的索引值。然后,我们实现获取操作函数,它将接收一个键,并返回对应的值。接下来,我们实现插入操作函数,它将接收一个键和一个值,并将它们插入到哈希映射中。接下来,我们定义哈希映射的结构体。它将包含一个指向存储节点的数组的指针,以及数组的大小。最后,我们实现删除操作函数,它将接收一个键,并从哈希映射中删除对应的节点。在上面的示例中,我们创建了一个哈希映射,并插入了一些键值对。 阅读详情

相关推荐

CMap:C语言中高效映射数据结构的实现

本文还有配套的精品资源,点击获取 简介:在IT领域,映射(Map)是一种重要的数据结构,尽管C语言标准库中没有直接提供,但开发者可以通过自定义数据结构来实现类似 std::map 的功能。本文详细介绍了使用C语言实现的CMap,它基于二叉搜索树(BST)来实现插入、删除和查找操作,以提供快速的键值对存储和检索能力。同时,介绍了内存管理、性能优化和错误处理等方面...

weixin_30598047的博客 1361

[C语言] 函数映射表应用于串口解析

【代码】[C语言] 函数映射表应用于串口解析。

wabil的专栏 705

避坑指南:C#用S7NetPlus读写西门子PLC字符串(String/WString)的完整方案

本文详细解析了C#通过S7NetPlus读写西门子PLC字符串(String/WString)的完整方案,包括内存布局、编码差异和字节序处理等关键技术细节。提供了实战优化的代码示例和常见问题排查指南,帮助开发者避免乱码、截断等常见陷阱,提升工业自动化项目的开发效率。

weixin_32956805的博客 320

C++ 函数映射(即回调函数)和 变量映射

C++ 编程中,经常会用到函数映射(即回调函数)和变量映射方法。如下分别介绍: 类中定义回调函数: 在类中定义回调函数参数类型:typedef void (*CALLBACKFUNCOM) (DWORD port); 定义回调函数:CALLBACKFUNCOM m_pFunReceive; 定义设置回调函数的方法:void SetCallBack(CALLBACKFUNCOM pFu...

Nick_H 的专栏 3555

Halcon阈值算子 -- 局部阈值之dyn_threshold

Halcon阈值算子 – dyn_threshold HALCON有很多阈值算子,接下来将一一介绍。本文先介绍dyn_threshold。 以下介绍主要参考HALCON帮助文档,并加上自己的体会。如有纰漏,欢迎留言指出 理论介绍 dyn_threshold算子的函数签名如下: dyn_threshold(OrigImage, ThresholdImage : RegionDynThresh : Offset, LightDark : ) 输入参数有: OrigImage:待处理图像 ThresholdIm

m0_47015717的博客 5384

【FPGA】DDR3调试总结

DDR3管脚根据不同的功能可以分为:数据组、地址组、控制组和电源组。如图上所示,共96个管脚。

m0_51679724的博客 4967

深入理解计算机系统(三)-- 建立C语言和机器级汇编语言的映射(跳转/函数调用)

前言 平时我们在写C代码的时候,经常用到的一些比如声明变量、定义函数和调用函数,使用条件语句和循环等等,我们往往认为很简单,但是又会有些困惑:这些C语言在计算机上是怎么实现功能的呢,以及在硬件级上实现这些功能由做了哪些优化呢? 这一章就是主要给我们在平时写的C语言和汇编语言以及真实的硬件实现上做一个映射,帮助我们从C语言的实现角度学习计算机。 这一章最开始介绍了数据格式,通用寄存器和一些常用的数据传送指令、算数和逻辑操作指令等。我个人更感兴趣的是后半部分的讲述,包括:控制类指令,过程调用,数组/struct

elenayangyang的博客 742

Zabbix 简介、优缺点、基础原理

(8条消息) Zabbix 的基础概念、原理和架构_Lee木木的博客-优快云博客_zabbix架构类型Zabbix 的基础概念、原理和架构_Lee木木的博客-优快云博客_zabbix架构类型 --------------------------------------------------------------------------------------------------------------------------- 一、Zabbix 简介 Zabbix是由A...

weixin_50196615的博客 2037

c语言中映射的用法,C语言编程中建立和解除内存映射的方法

C语言mmap()函数:建立内存映射头文件:#include #include 定义函数:void *mmap(void *start, size_t length, int prot, int flags, int fd, off_t offsize);函数说明:mmap()用来将某个文件内容映射到内存中,对该内存区域的存取即是直接对该文件内容的读写。参数说明:返回值:若映射成功则返回映射区...

weixin_42523792的博客 1863

出个AI8051U的PWM例程 | 3相互补SPWM变频驱动,PWMA-3个相位差120度的PWM互补输出

通道2输出: P2.2, PWMA2P输出, P2.3, PWMA2N输出, PWMA2相对PWMA1滞后120度相位.通道3输出: P2.4, PWMA3P输出, P2.5, PWMA3N输出, PWMA3相对PWMA1滞后240度相位.先别修改程序, 直接下载"Objects"里的"pwm.hex"测试, 下载时选择主频24MHz.主频32.768MHz, PWM周期1422, 刷新频率23040Hz,死区0.5us,通道1输出: P2.0, PWMA1P输出, P2.1, PWMA1N输出。

USB_CAN_8051的博客 690

让Claude连续写代码24小时会发生什么?揭秘长时运行”架构背后的工程逻辑与未来

AI长时运行实验揭示软件开发新范式 Claude Opus通过Harness框架24小时独立开发全栈应用的成功实验,展示了AI从辅助工具向异步协作者的进化。实验采用"上下文轮转"机制解决记忆管理难题,将任务拆解为微周期并通过文件系统同步进度。核心突破在于:1)TDD成为AI自治基石,200+测试用例确保开发不偏航;2)文件取代对话成为AI间高效沟通介质;3)开发者角色重构为需求定义和框架设计者。该实验证明,通过严谨的架构约束和验收标准,AI可完成复杂长周期任务,预示着软件开发将从手工作坊

老孙 | Ethan Sun 的博客:AI 智能体与 AI 原生软件的工程实践 1091

c语言实现通用数据结构(五):通用映射(HashMap)

这是在通用链表的基础上实现的映射,关于链表的实现参见:http://blog.youkuaiyun.com/swwlqw/article/details/22498833。 注意映射中只存储了key和value的指针,没有储存实际的数据。 对于新的key类型来说,需要自定义HashCode函数和equal函数。 在HashSet的实现中给出了几个常见的hashCode函数和equal函数

2万+

R语言实战:三因素方差分析(ANOVA)从入门到精通(附完整代码解析)

本文详细介绍了如何使用R语言进行三因素方差分析(ANOVA),从数据准备、模型构建到结果解读与可视化,提供完整代码解析。通过实战案例,帮助读者掌握复杂交互效应的分析方法,适用于科研、教育等多个领域的数据分析需求。

weixin_29081101的博客 244

c语言自定义散列结构,c语言实现通用数据结构(五):通用映射(HashMap)

#include"myHashMap.h"#include//某条Entry链表上是否包含某个key值。Entry*listContainsEntry(MyList*list,void*key,int(*equal)(void*key1,void*key2)){MyListIterator*it=createMyListIterator(list);while(myListI...

weixin_30597089的博客 226

081、LLC谐振变换器的短路特性与保护

本文深入分析了LLC谐振变换器在短路工况下的特性与保护策略。作者通过实际案例指出,LLC在输出短路时会出现谐振电流失控、ZVS条件丧失等危险现象,导致MOS管炸毁。文章详细阐述了短路保护的三大难点:响应速度、频率与电流的耦合、重启策略,并提出了硬件级快速保护、频率快速拉升、打嗝模式等实用解决方案。作者分享了关键参数设计经验,包括电流检测阈值设置、最高频率限制和保护响应时间控制,并通过实测波形验证了保护效果。最后总结出五点重要经验,强调硬件保护的必要性和系统设计的注意事项,为LLC变换器的短路保护设计提供了有

Jack010169的博客 75

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

hashmap C语言实现

hashmap C语言实现cheungmine源代码(适合Linux和Windows)包括:    hashmap.c    hashmap.hMSVC测试文件:     main.c下面是源代码,最初来自github,我改写了几个地方,并重写了全部测试代码.没有内存泄露,请放心使用./** * hashmap.h */ #ifndef _HASHMAP_H_INCLUDED #define

恒 9551

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

一个简单的HashMap C语言实现

一个简单的HashMap C语言实现cheungmine 用C语言实现一个简单实用的hashmap,具有一定的实际意义。尤其我们不想使用STL里面的map类的时候。我实现的这个hashmap,用来做key---value的映射,key必须是有效的字符串,value是调用者分配的任意类型的数据。这个hashmap适合在一些简单的场合下,消耗极少的资源。首先定义头文件如下: /

恒 3万+

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

c语言链表的数据结构,c语言实现通用数据结构(一):通用链表

忽然想起来,大概在两年之前学习C语言的时候,曾经用C语言写过一些通用的数据结构。主要也就实现了链表、队列、椎、HashSet,还有HashMap。当时只是知道标准的C语言中没有这方面的类库,后来才知道有很多第三方的类似这样的类库。废话不多说,先把代码粘过来。下面实现的是通用链表,注意链表中只存储了指针,没有储存实际的数据。头文件/**************************** File ...

weixin_42527178的博客 232

C语言实现hashmap(附带源码)

C语言实现hashmap(附带源码)

欢迎来到我的博客!这里是一个专注于计算机技术的分享平台,涵盖编程开发、算法研究、系统架构、软件工程等多个领域。无论你是初学者还是资深开发者,都能在这里找到有价值的内容。 832

C语言实现hashMap

https://blog.youkuaiyun.com/sxf1061700625/article/details/109594495 图中,紫色部分即代表哈希表,也称为哈希数组,数组的每个元素都是一个单链表的头节点,链表是用来解决冲突的,如果不同的key映射到了数组的同一位置处,就将其放入单链表中。 下载链接:https://download.youkuaiyun.com/download/sxf1061700625/13101710 供参考学习 hashMap.h #ifndef _H..

mengzhengjie的专栏 2672

使用C语言实现一个简单的哈希表HashMap

HashMap是一种常用的哈希表实现,它将键(key)映射到值(value)上。它使用哈希函数将键映射到哈希表中的索引,以便快速查找键值对。HashMap的实现基于数组和链表或红黑树,它通过散列函数来确定每个键值对在数组中的位置。

jackiendsc的博客 705

hashmap哈希map是什么?什么时候需要使用hashmap?C实现hashmap示例

对于C程序员,尤其是嵌入式C程序员,hashmap使用的相对较少,所以会略显陌生,hashmap其实涉及到2个概念,分别是哈希(hash)、map。哈希hash:是把任意长度输入通过蓝列算法变换成固定长度的输出,这种转换是一种压缩映射,一般不可逆。这是专业的解释,我们常说的crc16、crc32、lrc、md5、sha256等,本质上都是哈希hash,只不过散列算法不同而已。

猪哥的专栏 2779

推荐项目:高效安全的C语言哈希表实现 —— hashmap

推荐项目:高效安全的C语言哈希表实现 —— hashmap 在C语言的世界里,灵活且易用的数据结构一直是开发者追求的目标。David Leeds 开发的 hashmap 正是为了解决这一痛点而生。这个项目采用开放寻址法和线性探测处理冲突,提供了类型安全的模板化哈希表实现,填补了C语言中高效类型安全数据结构的空白。 项目技术解析 hashmap 的核心在于其精妙的设计:通过预处理器宏HASHMAP(...

gitblog_00603的博客 518
上一篇: 面试问题什么是异步非阻塞
下一篇: c语言实现通用数据结构(一):通用链表
hxpjava1
博客等级 码龄19年 1365粉丝 511原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值