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)申请内存,然后将kv保存在这个内存中。为了让该函数只能在我们的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_itemht_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)相关推荐

  1. [译]C语言实现一个简易的Hash table(3)

    上一章,我们讲了hash表的数据结构,并简单实现了hash表的初始化与删除操作,这一章我们会讲解Hash函数和实现算法,并手动实现一个Hash函数. Hash函数 本教程中我们实现的Hash函数将会实 ...

  2. 十位数连加 c语言,用C语言编写一个简易计算器可实现加减乘除,连加连减,连乖连除....

    用C语言编写一个简易计算器可实现加减乘除,连加连减,连乖连除. 用C语言编写一个简易计算器可实现加减乘除,连加连减,连乖连除. 人气:435 ℃时间:2020-04-10 06:55:13 优质解答 ...

  3. 用go语言撸一个简易版的区块链

    用go撸一个简易版的区块链 引言 这个最初的版本时多年以前学习go的时候,自己撸的一个简易版本的区块链.不过麻雀虽小,五脏俱全.通过这个代码你了解区块链内部的大概运行机制时没有问题的. 比特币底层区块 ...

  4. C语言-实现一个简易的银行排号叫号系统

    这两天在网上看到这个题目,感觉挺有意思,就做了一下.我在网上看到其他人都是用C++做的,因为不懂C++语言,没看懂,尝试着用C语言做了该题.希望能来看该题的大神指点指点,估计还有些bug没找出来. 本 ...

  5. 使用java语言编写一个简易的计算器(完整代码与详细步骤都有哦!)

    [案例介绍] 1.案例描述 本案例要求利用Java Swing 图形组件开发一个可以进行简单的算术运算的图形化计算器. 2.运行结果 运行结果 [案例目标] 学会分析"简易计算器" ...

  6. 用C语言设计一个简易的选择题答题系统

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.设计简易的答题系统 二.使用步骤 1.引入库 2.读入数据 总结:应用随机数,getchar以及if else 前 ...

  7. 用java编写一个简易功能画板_用Java语言编写一个简易画板

    讲了三篇概博客的概念,今天,我们来一点实际的东西.我们来探讨一下如何用Java语言,编写一块简易的画图板. 一.需求分析 无论我们使用什么语言,去编写一个什么样的项目,我们的第一步,总是去分析这个项目 ...

  8. 使用Java语言搭建一个简易的局域网直播(live)系统

    演示一下 局域网直播系统,顾名思义是运行在局域网中的系统,整个直播系统由两部分构成:录制和播放,核心思路是推拉流和流转码. 录制直播 录制直播使用的是自己电脑的摄像头和麦克风,使用Java自带的JFr ...

  9. 用c语言编写一个简易的编译器,面向教学的简易c语言编译器的设计与实现(54页)-原创力文档...

    目录 TOC \o "1-5" \h \z \o "Current Document" 摘要I ABSTRACTII \o "Current Docu ...

  10. C语言编写一个简易的网络词典

    摘要:电子辞典是指将传统的辞典中的内容转换为数字格式存储的文件,并且将它们保存在存储器中.用户使用时只需要通过键盘输入需要查询的条目,电子辞典通过自身携带的处理器,按照一定的编码查询方式便可以找到相关 ...

最新文章

  1. 基于FPGA的LED点阵系统开发
  2. python 字典处理_python 字典的处理
  3. 好吧,关于nginx
  4. 分布式系统的面试题7
  5. 向webServices请求失败
  6. matlab 多径 时变 信道 冲击响应,无线信道—时变冲激响应
  7. Python-02-基础知识
  8. 怎么查看服务器系统内存,怎么查看服务器系统内存
  9. linux获取windows的主机名,获取网络许可主机名和主机 ID 的步骤
  10. 药房管理(信息学奥赛一本通-T1075)
  11. .net Core 介绍
  12. DataGridView导出到Excel的三个方法
  13. 分智- 招聘,公司评论,晒工资,薪水
  14. XHTML 和 DOCTYPE 切换(MSDN)
  15. ai作文批改_有道词典上线AI作文批改功能,可自动批改雅思、四六级作文
  16. [笔记]Unity粒子特效1初次了解
  17. JS基础—选项卡套选项卡(函数传参)
  18. (predicted == labels).sum().item()作用
  19. linux shell脚本攻略 第三章 以文件之名 find,chmod,touch,head,tail,tree,wc
  20. (五)JMeter 断言

热门文章

  1. 长沙理工大学第十二届ACM大赛L 选择困难症 (剪枝暴搜)
  2. Centos7 Zabbix3.2安装(yum)
  3. Java笔记(14):常用对象--正则表达式、GC
  4. vb.net加密解密方法
  5. 在地图上点击一下,在图层上画一个点,并显示相关的信息
  6. Kotlin的魔能机甲——KtArmor插件篇(二)
  7. mybatis 中collection中需要 open close separator
  8. OPENWRT安装配置指南之 17.01.4 LEDE
  9. An internal error occurred during: Launching web on MyEclipse Tomcat
  10. 进阶之路(基础篇) - 009 通过底层AVR方法实现SPI数据传输