当前位置:网站首页>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
边栏推荐
- 广州股票开户选择手机办理安全吗?
- 无线充U型超声波电动牙刷方案开发
- 软件工程最佳实践——项目需求分析
- 新出生的机器狗,打滚1小时后自己掌握走路,吴恩达开山大弟子最新成果
- 将 EMQX Cloud 数据通过公网桥接到 AWS IoT
- WordPress 博客使用火山引擎 veImageX 进行静态资源 CDN 加速(免费)
- MQ component (2022.5.16-5.22)
- 将秒数转换为**小时**分钟
- Task04: set operation - addition and subtraction of tables, join, etc. - learning notes of Tianchi Longzhu project SQL training camp
- VR云展厅如何给线下实体带来活力?有哪些功能?
猜你喜欢
随机推荐
WordPress 博客使用火山引擎 veImageX 进行静态资源 CDN 加速(免费)
将秒数转换为**小时**分钟
MQ advantages and disadvantages (2022.5.2-5.8)
composer
6-1漏洞利用-FTP漏洞利用
测试必备工具 —— Postman实战教程
There are three ways to create instances by reflection (2022.6.6-6.12)
History, selection strategy and in-depth evaluation of note taking software
matlab Delaunay 三角剖分内的查询点
pycharm有用快捷键
毕业季职场人
This morning, investors began to travel collectively
VR全景拍摄为什么要加盟?巧借资源实现共赢
实现各种效果和功能的按钮,读这篇文章就够了
盘点华为云GaussDB(for Redis)六大秒级能力
英语没学好到底能不能做coder,别再纠结了先学起来
杭州炒股开户选择手机办理安全吗?
Wechat applets - basics takes you to understand the life cycle of applets (2)
The project is configured with eslint. When the editor does not close the eslint function, the eslint does not take effect
VoIP Push 在海外音视频业务中的应用









