当前位置:网站首页>C语言:hashTable
C语言:hashTable
2022-06-30 19:20:00 【B!GGer.】
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef int (*Func)(int, int);
//拉链法
//链表节点,数据域存字符串
typedef struct Node{
Func func;
struct Node *next;
}Node;
typedef struct
{
char *funcName;
Func func;
}funcTable;
int add(int a, int b)
{
printf("add\n");
return a+b;
}
int sub(int a, int b)
{
printf("sub\n");
return a-b;
}
//顺序表(表头,大小)
typedef struct HashTable{
//链表首地址,是链表头结点的顺序表,由于头结点是Node *,顺序表示Node **
Node **data;
int size;
}HashTable;
//初始化链表,头插法,产生的新节点的next = 传入节点
Node *init_node(Func func, Node *head){
Node *p = (Node *)malloc(sizeof(Node));
p->func = func;
p->next = head;
return p;//虚拟头结点
}
HashTable *init_hashtable(int n){
HashTable *h = (HashTable *)malloc(sizeof(HashTable));
//h->size = n << 1;//若要使哈希表存储效率变高,存储空间扩大一倍??
h->size = n;
h->data = (Node **)calloc(h->size, sizeof(Node *));
return h;
}
void clear_node(Node *node){
if (node == NULL) return;
Node *p = node, *q;
while(p){
q = p->next;
free(p);
p = q;
}
free(q);//?
return;
}
void clear_hashtable(HashTable *h){
if (h == NULL) return;
for (int i = 0; i < h->size; i++){
clear_node(h->data[i]);
}
free(h->data);
free(h);
return;
}
int BKDRHash(char *str){
int seed = 31, hash = 0;
for (int i = 0; str[i]; i++) hash = hash * seed + str[i];
//保证正数
return hash & 0x7fffffff;
}
int insert(HashTable *h, char *str, Func func){
int hash = BKDRHash(str);
int ind = hash % h->size;
printf("ind:%d\n", ind);
h->data[ind] = init_node(func, h->data[ind]);
return 1;
}
Func search(HashTable *h, char *str){
int hash = BKDRHash(str);
int ind = hash % h->size;
Node *p = h->data[ind];
//while (p && strcmp(str, p->str)) p = p->next;
if (p != NULL)
{
return p->func;
}
return NULL;
}
static funcTable gfuncTable[] = {
{"func_add", add},
{"test1", NULL},
{"test2", NULL},
{"test3", NULL},
{"func_sub", sub},
{"test4", NULL},
{"test5", NULL},
{"test6", NULL},
};
int main(){
HashTable *h = init_hashtable(sizeof(gfuncTable)/sizeof(funcTable));
for (int i = 0; i < sizeof(gfuncTable)/sizeof(funcTable); i++)
{
insert(h, gfuncTable[i].funcName, gfuncTable[i].func);
}
Func funcAdd = search(h, "func_add");
printf("add:%d\n", funcAdd(1, 2));
Func funcSub = search(h, "func_sub");
printf("sub:%d\n", funcSub(7, 2));
return 0;
}
参考链接:https://blog.csdn.net/one_chow_chow/article/details/109561575
边栏推荐
猜你喜欢

S7-1500 PLC之间进行TCP通信的具体方法和步骤详解(图文)

腾讯会议应用市场正式上线,首批入驻超20款应用

4.3寸触控屏12路控制端口可编程网络中控支持5台中控主机相互备份

Wechat applets - basics takes you to understand the life cycle of applets (2)

Conditional compilation

说实话ThreadLocal真不是啥高级的东西

2022年高考都结束了,还有人真觉得程序员下班后不需要学习吗?

盘点华为云GaussDB(for Redis)六大秒级能力

昔日果汁大王,16个亿卖了

派尔特医疗在港交所招股书二次“失效”,上市计划实质性延迟
随机推荐
为什么数字化转型战略必须包括持续测试?
ABAQUS 2022最新版——完善的现实仿真解决方案
暑期实训21组第一周个人工作总结
The project is configured with eslint. When the editor does not close the eslint function, the eslint does not take effect
Unity 如何拖拉多个组件中的一个
[solved] how does Tiktok cancel paying attention to the cancelled account
线下门店为什么要做新零售?
MySQL billing Statistics (Part 1): MySQL installation and client dbeaver connection
昔日果汁大王,16个亿卖了
杭州炒股开户选择手机办理安全吗?
Abaqus 2022软件安装包和安装教程
Force deduction ----- count the string containing the given prefix
CV+Deep Learning——网络架构Pytorch复现系列——basenets(BackBones)(一)
matlab Delaunay 三角剖分内的查询点
Growth summer challenge is coming, exclusive community welfare is coming ~ get CSDN customized T-shirt for free
解决arm_release_ver of this libmali is ‘g2p0-01eac0‘,rk_so_ver is ‘4‘,libgl1-mesa-dev不会被安装,存在未满足的依赖关系
【已解决】抖音如何取消关注已注销的账户
Promise从认识到使用
VR全景添加对比功能,让差异化效果展示更直观!
QQmlApplicationEngine failed to load component qrc:/main.qml:-1 No such file or directory