实现极小一部分PHP的HASHMAP
又修改了一下,实现了resize
#include <stdlib.h>#include <stdio.h>#include <string.h>#include <malloc.h>#include <math.h>typedef struct bucket{ int h; char* key; void* pData; struct bucket* pNext; struct bucket* pLast;}Bucket;typedef struct hashtable{ int size; int elementsNum; int mask; Bucket** arBuckets; //这是一个存放buckets的array }HashTable;/** ** 这是一个计算HASH值的算法 **/int time33(char* arKey,int arlength){ int h = 0; int i; for(i=0;i<arlength;i++){ h = h*33 + (int)*arKey++; } return h; }/** ** 初始化一个大小是1的HASHTABLE **/int _init_hash_table(HashTable** ht){ *ht = (HashTable*)malloc(sizeof(HashTable)); (*ht)->size = 1; (*ht)->mask = (*ht)->size - 1; (*ht)->elementsNum = 1; (*ht)->arBuckets = (Bucket**)malloc(sizeof(Bucket*)*(*ht)->size); memset((*ht)->arBuckets,0,sizeof(Bucket*)*(*ht)->size); return 1; } int _hash_link_bucket_to_bucket_head(Bucket** newBucket,Bucket** bucketHead){ if(*bucketHead==NULL){ *bucketHead = *newBucket; }else{ (*newBucket)->pNext = (*bucketHead)->pNext; (*newBucket)->pLast = (*bucketHead); if((*bucketHead)->pNext != NULL){ (*bucketHead)->pNext->pLast = *newBucket; } (*bucketHead)->pNext = *newBucket; } return 1;}int _hash_new_bucket(Bucket** newBucket,int hash,char* arkey,void* pData){ (*newBucket) = (Bucket*)malloc(sizeof(Bucket)); (*newBucket)->h = hash; (*newBucket)->key = arkey; (*newBucket)->pData = pData; (*newBucket)->pNext = NULL; (*newBucket)->pLast = NULL; return 1;}int _hash_rehash(HashTable* ht){ int i = 0; //由于我没定义pListNext指针,所以只能这样rehash了。 for( ; i<ht->size ; i++){ if(ht->arBuckets[i] != NULL){ int index = ht->arBuckets[i]->h & ht->mask ; if(i != index){ _hash_link_bucket_to_bucket_head(&ht->arBuckets[i],&ht->arBuckets[index]); ht->arBuckets[i] = NULL; } } } return 1; }/** ** 将HASHTABLE的大小扩容1倍 **/int _hash_resize(HashTable* ht){ if(ht != NULL){ ht->size = ht->size << 1; ht->mask = ht->size - 1; realloc(&ht->arBuckets,sizeof(Bucket*) * ht->size); int i; for(i=ht->size>>1;i<ht->size;i++){ ht->arBuckets[i] = NULL; } //memset(ht->arBuckets[0],NULL,sizeof(Bucket*) * (ht->size >> 1)); printf("resize:%i\r\n", ht->size); _hash_rehash(ht); return 1; } return 0;}/** ** 往HASHTABLE中添加元素 **/int _hash_add_or_update(HashTable* ht,char* arKey,int arLength,void* pData){ int h = time33(arKey,arLength); int index = h & ht->mask; Bucket* p = ht->arBuckets[index]; while(p!=NULL){ if(strcmp(arKey,p->key)==0){ //这里应该执行更新操作 free(p->pData); p->pData = pData; return 1; } p = p->pNext; } Bucket* newBucket; _hash_new_bucket(&newBucket,h,arKey,pData); _hash_link_bucket_to_bucket_head(&newBucket,&ht->arBuckets[index]); ht->elementsNum++; if(ht->elementsNum = ht->size){ _hash_resize(ht); } return 0; }void* _hash_find(HashTable* ht,char* arKey,int arLength){ int h = time33(arKey,arLength); int index = h & ht->mask; Bucket* p = ht->arBuckets[index]; while(p!=NULL){ if(strcmp(arKey,p->key)==0){ return p->pData; } p = p->pNext; } return 0;}int PUT(HashTable* ht,void* key,void* value){ char* arKey = (char*)key; int len = strlen(arKey); return _hash_add_or_update(ht,arKey,len,value); }void* GET(HashTable* ht,void* key){ char* arKey = (char*)key; int len = strlen(arKey); return _hash_find(ht,arKey,len);}int main(){ printf("%s\r\n","这是一个hashtable的例子"); HashTable* ht; _init_hash_table(&ht); PUT(ht,"1","mengjun"); PUT(ht,"2","aaaaa"); PUT(ht,"3","fff"); PUT(ht,"24","eee"); PUT(ht,"25","ddd"); printf("%s\r\n",(char*)GET(ht,"1")); printf("%s\r\n",(char*)GET(ht,"2")); printf("%s\r\n",(char*)GET(ht,"3")); printf("%s\r\n",(char*)GET(ht,"24")); printf("%s\r\n",(char*)GET(ht,"25")); printf("HASHTABLE总共有元素%i个\r\n",ht->elementsNum); return 0;}

许多用户在选择智能手表的时候都会选择的华为的品牌,其中华为GT3pro和GT4都是非常热门的选择,不少用户都很好奇华为GT3pro和GT4有什么区别,下面就就给大家介绍一下二者。华为GT3pro和GT4有什么区别一、外观GT4:46mm和41mm,材质是玻璃表镜+不锈钢机身+高分纤维后壳。GT3pro:46.6mm和42.9mm,材质是蓝宝石玻璃表镜+钛金属机身/陶瓷机身+陶瓷后壳二、健康GT4:采用最新的华为Truseen5.5+算法,结果会更加的精准。GT3pro:多了ECG心电图和血管及安

为什么截图工具在Windows11上不起作用了解问题的根本原因有助于找到正确的解决方案。以下是截图工具可能无法正常工作的主要原因:对焦助手已打开:这可以防止截图工具打开。应用程序损坏:如果截图工具在启动时崩溃,则可能已损坏。过时的图形驱动程序:不兼容的驱动程序可能会干扰截图工具。来自其他应用程序的干扰:其他正在运行的应用程序可能与截图工具冲突。证书已过期:升级过程中的错误可能会导致此issu简单的解决方案这些适合大多数用户,不需要任何特殊的技术知识。1.更新窗口和Microsoft应用商店应用程

第1部分:初始故障排除步骤检查苹果的系统状态:在深入研究复杂的解决方案之前,让我们从基础知识开始。问题可能不在于您的设备;苹果的服务器可能会关闭。访问Apple的系统状态页面,查看AppStore是否正常工作。如果有问题,您所能做的就是等待Apple修复它。检查您的互联网连接:确保您拥有稳定的互联网连接,因为“无法连接到AppStore”问题有时可归因于连接不良。尝试在Wi-Fi和移动数据之间切换或重置网络设置(“常规”>“重置”>“重置网络设置”>设置)。更新您的iOS版本:

Java中使用Hashtable类的isEmpty()方法判断哈希表是否为空哈希表是Java集合框架中常用的数据结构之一,它实现了键值对的存储和检索。在Hashtable类中,isEmpty()方法用于判断哈希表是否为空。本文将介绍如何使用Hashtable类的isEmpty()方法,并提供相应的代码示例。首先,我们需要了解一下Hashtable类。Hash

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code<form name="myform"

Java中使用Hashtable类的containsKey()方法判断键是否存在于哈希表中在Java编程中,使用Hashtable类可以使用哈希表来存储和管理数据。哈希表是一种用于存储键值对的数据结构,通过将键映射到值来实现快速的数据访问。在实际的编程过程中,我们经常需要判断某个特定的键是否存在于哈希表中。为了实现这个功能,我们可以使用Hashtable类提

watch4pro和gt各自具有不用的特点和适用场景,如果注重功能的全面性、高性能和时尚外观,同时愿意承担较高的价格,那么Watch 4 Pro可能更适合。如果对功能要求不高,更注重电池续航和价格的合理性,那么GT系列可能更适合。最终的选择应根据个人需求、预算和喜好来决定,建议在购买前仔细考虑自己的需求,并参考各种产品的评测和比较,以做出更明智的选择。

HT币:火币平台币,潜力无限简介HT币是火币全球站的平台币,于2018年1月16日正式推出。总发行量为5亿枚,其中60%用于市场流通,剩下的40%则被分配给团队激励、生态建设和回购销毁等方面。用途HT币的主要用途包括:交易手续费减免:HT币持有者在火币全球站进行交易时,可以享受交易手续费减免。持有量越多,减免比例越高。参与IEO:HT币持有者可以优先参与火币全球站的IEO。抵押借贷:HT币可以在火币全球站进行抵押借贷。参与社区治理:HT币持有者可以参与火币全球站的社区治理,对平台的发展提出建议。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

WebStorm Mac版
好用的JavaScript开发工具

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

Dreamweaver CS6
视觉化网页开发工具

PhpStorm Mac 版本
最新(2018.2.1 )专业的PHP集成开发工具

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。