[译]C语言实现一个简易的Hash table(2)
2019独角兽企业重金招聘Python工程师标准>>>
上一章,简单介绍了Hash Table
,并提出了本教程中要实现的几个Hash Table
的方法,有search(a, k)
、insert(a, k, v)
和delete(a, k)
,本章将介绍Hash table
使用的数据结构。
Hash table
数据结构
hash表中存储的每一项key-value
的数据结构:
// hash_table.h
typedef struct {char* key;char* value;
} ht_item;
我们的hash表中保存着一个指向每一项的指针数组,里面还包括hash表的大小,结构如下:
// hash_table.h
typedef struct {int size;int count;ht_item** items;
} ht_hash_table;
初始化与删除
在hash表
中,我们需要定义一个函数来初始化一条记录(ht_item
),这个函数会为每一条记录(ht_item
)申请内存,然后将k
和v
保存在这个内存中。为了让该函数只能在我们的hash table
中使用,我们用static
来修饰。
// hash_table.c
#include <stdlib.h>
#include <string.h>#include "hash_table.h"static ht_item* ht_new_item(const char* k, const char* v) {ht_item* i = malloc(sizeof(ht_item));i->key = strdup(k); // 复制操作i->value = strdup(v);return i;
}
ht_new
初始化一个新的hash表
,size
表示这个hash表
可以存储多少条记录,现在是固定的53条。我们将在后面讲解如何扩充这个hash表
,我们使用calloc
函数来初始化一条记录(如果对calloc
不熟悉,可以看看我这篇文章:https://my.oschina.net/simonWang/blog/2998978),calloc
会申请一片空间并用NULL
来填充,记录为NULL
就代表空的。
// hash_table.c
ht_hash_table* ht_new() {ht_hash_table* ht = malloc(sizeof(ht_hash_table));ht->size = 53;ht->count = 0;ht->items = calloc((size_t)ht->size, sizeof(ht_item*));return ht;
}
我们还需要额外的函数来删除ht_item
和ht_hash_table
,这个函数会释放(free
)我们之前申请的内存空间,以至于不会造成内存泄漏:
// hash_table.c
static void ht_del_item(ht_item* i) {free(i->key);free(I->value);free(i);
}void ht_delete_hash_table(ht_hash_table* ht) {for (int i = 0; i < ht->size; ++i) {ht_item* item = ht_items[I];if (item != NULL) {ht_del_item(item);}}free(ht->items);free(ht);
}
现在,我们已经完成定义一个hash表
,现在我们可以试着创建一个hash表
并试着销毁它,尽管现在并没有做太多东西。
// main.c
#include hash_table.hint main() {ht_hash_table* ht = ht_new();ht_del_hash_table(ht);
}
上一章:hash表介绍 下一章:hash函数
转载于:https://my.oschina.net/simonWang/blog/2999934
[译]C语言实现一个简易的Hash table(2)相关推荐
- [译]C语言实现一个简易的Hash table(3)
上一章,我们讲了hash表的数据结构,并简单实现了hash表的初始化与删除操作,这一章我们会讲解Hash函数和实现算法,并手动实现一个Hash函数. Hash函数 本教程中我们实现的Hash函数将会实 ...
- 十位数连加 c语言,用C语言编写一个简易计算器可实现加减乘除,连加连减,连乖连除....
用C语言编写一个简易计算器可实现加减乘除,连加连减,连乖连除. 用C语言编写一个简易计算器可实现加减乘除,连加连减,连乖连除. 人气:435 ℃时间:2020-04-10 06:55:13 优质解答 ...
- 用go语言撸一个简易版的区块链
用go撸一个简易版的区块链 引言 这个最初的版本时多年以前学习go的时候,自己撸的一个简易版本的区块链.不过麻雀虽小,五脏俱全.通过这个代码你了解区块链内部的大概运行机制时没有问题的. 比特币底层区块 ...
- C语言-实现一个简易的银行排号叫号系统
这两天在网上看到这个题目,感觉挺有意思,就做了一下.我在网上看到其他人都是用C++做的,因为不懂C++语言,没看懂,尝试着用C语言做了该题.希望能来看该题的大神指点指点,估计还有些bug没找出来. 本 ...
- 使用java语言编写一个简易的计算器(完整代码与详细步骤都有哦!)
[案例介绍] 1.案例描述 本案例要求利用Java Swing 图形组件开发一个可以进行简单的算术运算的图形化计算器. 2.运行结果 运行结果 [案例目标] 学会分析"简易计算器" ...
- 用C语言设计一个简易的选择题答题系统
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.设计简易的答题系统 二.使用步骤 1.引入库 2.读入数据 总结:应用随机数,getchar以及if else 前 ...
- 用java编写一个简易功能画板_用Java语言编写一个简易画板
讲了三篇概博客的概念,今天,我们来一点实际的东西.我们来探讨一下如何用Java语言,编写一块简易的画图板. 一.需求分析 无论我们使用什么语言,去编写一个什么样的项目,我们的第一步,总是去分析这个项目 ...
- 使用Java语言搭建一个简易的局域网直播(live)系统
演示一下 局域网直播系统,顾名思义是运行在局域网中的系统,整个直播系统由两部分构成:录制和播放,核心思路是推拉流和流转码. 录制直播 录制直播使用的是自己电脑的摄像头和麦克风,使用Java自带的JFr ...
- 用c语言编写一个简易的编译器,面向教学的简易c语言编译器的设计与实现(54页)-原创力文档...
目录 TOC \o "1-5" \h \z \o "Current Document" 摘要I ABSTRACTII \o "Current Docu ...
- C语言编写一个简易的网络词典
摘要:电子辞典是指将传统的辞典中的内容转换为数字格式存储的文件,并且将它们保存在存储器中.用户使用时只需要通过键盘输入需要查询的条目,电子辞典通过自身携带的处理器,按照一定的编码查询方式便可以找到相关 ...
最新文章
- 基于FPGA的LED点阵系统开发
- python 字典处理_python 字典的处理
- 好吧,关于nginx
- 分布式系统的面试题7
- 向webServices请求失败
- matlab 多径 时变 信道 冲击响应,无线信道—时变冲激响应
- Python-02-基础知识
- 怎么查看服务器系统内存,怎么查看服务器系统内存
- linux获取windows的主机名,获取网络许可主机名和主机 ID 的步骤
- 药房管理(信息学奥赛一本通-T1075)
- .net Core 介绍
- DataGridView导出到Excel的三个方法
- 分智- 招聘,公司评论,晒工资,薪水
- XHTML 和 DOCTYPE 切换(MSDN)
- ai作文批改_有道词典上线AI作文批改功能,可自动批改雅思、四六级作文
- [笔记]Unity粒子特效1初次了解
- JS基础—选项卡套选项卡(函数传参)
- (predicted == labels).sum().item()作用
- linux shell脚本攻略 第三章 以文件之名 find,chmod,touch,head,tail,tree,wc
- (五)JMeter 断言
热门文章
- 长沙理工大学第十二届ACM大赛L	选择困难症 (剪枝暴搜)
- Centos7 Zabbix3.2安装(yum)
- Java笔记(14):常用对象--正则表达式、GC
- vb.net加密解密方法
- 在地图上点击一下,在图层上画一个点,并显示相关的信息
- Kotlin的魔能机甲——KtArmor插件篇(二)
- mybatis 中collection中需要 open close separator
- OPENWRT安装配置指南之 17.01.4 LEDE
- An internal error occurred during: Launching web on MyEclipse Tomcat
- 进阶之路(基础篇) - 009 通过底层AVR方法实现SPI数据传输