C语言实现hashmap的方式有很多,最简单的就是使用数组实现,个人原创,源码如下:
#include <stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct hashnode
{
char key[10]; //键
int value; //值
};
typedef struct
{
int size;
int length;
struct hashnode*Array;
}Hashmap;
Hashmap*hashmap;
unsigned int hash_33(char* key)//哈希算法
{
unsigned int hash = 0;
while (*key)
{
hash = (hash << 5) + hash + *key++;
}
return hash;
}
void init()//初始化哈希表
{
int i=0;
hashmap=(Hashmap*)calloc(10,sizeof(Hashmap));
for(i=0;i<10;i++)
{
hashmap[i].Array=(struct hashnode*)calloc(10,sizeof(struct hashnode));
hashmap[i].size=10;
hashmap[i].length=0;
}
}
void add(char* key,int value)//添加key-value
{
int hashcode=hash_33(key)%10;
Hashmap* hm=hashmap+hashcode;
int index=hm->length;
int i;
if (index>=hm->size)//数组扩容
{
int size=hm->size*2;
hm->Array=(struct hashnode*)realloc(hm->Array,size*sizeof(struct hashnode));
hm->size=size;
}
for(i=0;i<hm->size;i++)
{
if (strcmp(hm->Array[i].key,key)==0)//key相同就覆盖
{
hm->Array[i].value=value;
break;
}
else
{
strcpy(hm->Array[i].key,key);
hm->Array[i].value=value;
hm->length++;
break;
}
}
}
void print()//遍历哈希表
{
int i,j;
if (hashmap==NULL)
{
puts("hashmap为空");
return;
}
for (i=0;i<10;i++)
{
Hashmap sm=hashmap[i];
putchar('|');
for (j = 0; j < sm.length; j++)
{
printf("%s=%d",sm.Array[j].key,sm.Array[j].value);
}
printf("|\n");
}
}
void empty() //清空哈希表
{
int i,j;
for (i=0;i<10;i++)
{
Hashmap* sm=hashmap+i;
free(sm->Array);
sm->Array=NULL;
}
free(hashmap);
hashmap=NULL;
}
int main(void)
{
init();
add("a",1);
add("b",1);
add("a",2);
add("c",1);
add("d",10);
add("a",1);
add("b",1);
add("a",2);
add("c",1);
add("d",10);
print();
empty();
print();
getchar();
return 0;
}目前只支持增加、遍历、清空功能。
有兴趣的读者可以自行实现删除、查找、替换.......等功能。
运行结果如图:

欢迎交流
个人QQ:757368775
【注意】
添加好友时请注明“来自c语言网”
0.0分
0 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复