文章目录

  • 1 哈希链表的原理及算法实现
    • 1.1 哈希表的原理
    • 1.2 哈希链表的算法实现

1 哈希链表的原理及算法实现

1.1 哈希表的原理

哈希表:散列表,它是基于快速存取的角度设计的,是一种典型的“空间换时间”的做法。

有如下一些概念:

  • 键(key): 可以是编号 如, 1 、 5 、 19 。 。 。
  • 值(value): 存储的值。
  • 索引:数组的下标(0,1,2,3,4) ,用以快速定位和检索数据。
  • 哈希桶:保存索引的数组(链表或数组),数组成员为每一个索引值相同的多个元素。
  • 哈希函数:将组key映射到索引上,可以采用求余法。

1.2 哈希链表的算法实现

哈希链表数据结构的定义:

#define DEFAULT_SIZE 16typedef struct _ListNode
{struct _ListNode *next;int key;void *data;
}ListNode;typedef ListNode *List;
typedef ListNode *Element;typedef struct _HashTable
{int TableSize;List *Thelists;
}HashTable;

哈希函数:

/*根据 key 计算索引,定位 Hash 桶的位置*/
int Hash(int key, int TableSize)
{return (key%TableSize);
}

哈希链表初始化:

/*初始化哈希表*/
HashTable *InitHash(int TableSize)
{int i = 0;HashTable *hTable = NULL;if (TableSize <= 0) {TableSize = DEFAULT_SIZE;}hTable = (HashTable *)malloc(sizeof(HashTable));if (NULL == hTable){printf("HashTable malloc error.\n");return NULL;}hTable->TableSize = TableSize;//为 Hash 桶分配内存空间,其为一个指针数组hTable->Thelists = (List *)malloc(sizeof(List)*TableSize);if (NULL == hTable->Thelists){printf("HashTable malloc error\n");free(hTable);return NULL;}//为 Hash 桶对应的指针数组初始化链表节点for (i = 0; i < TableSize; i++){hTable->Thelists[i] = (ListNode *)malloc(sizeof(ListNode));if (NULL == hTable->Thelists[i]){printf("HashTable malloc error\n");free(hTable->Thelists);free(hTable);return NULL;}else{memset(hTable->Thelists[i], 0, sizeof(ListNode));}}return hTable;
}

哈希链表插入元素:

/*哈希表插入元素,元素为键值对*/
void Insert(HashTable *HashTable, int key, void *value )
{Element e=NULL, tmp=NULL;List L=NULL;e = Find(HashTable, key);if (NULL == e){tmp = (Element)malloc(sizeof(ListNode));if (NULL == tmp){printf("malloc error\n");return;}L = HashTable->Thelists[Hash(key, HashTable->TableSize)];tmp->data = value;tmp->key = key;tmp->next = L->next;L->next = tmp;}elseprintf("the key already exist\n");
}

哈希链表查找元素:

/*从哈希表中根据键值查找元素*/
Element Find(HashTable *HashTable, int key)
{int i = 0;List L = NULL;Element e = NULL;i = Hash(key, HashTable->TableSize);L = HashTable->Thelists[i];e = L->next;while (e != NULL && e->key != key)e = e->next;return e;
}

哈希链表删除元素:

/*哈希表删除元素,元素为键值对*/
void Delete(HashTable *HashTable, int key )
{Element e=NULL, last=NULL;List L=NULL;int i = Hash(key, HashTable->TableSize);L = HashTable->Thelists[i];last = L;e = L->next;while (e != NULL && e->key != key){last = e;e = e->next;}if(e){//如果键值对存在last->next = e->next;delete(e);}
}

哈希表元素中提取数据:

/*哈希表元素中提取数据*/
void *Retrieve(Element e)
{return e?e->data:NULL;
}

销毁哈希表:

/*销毁哈希表*/
void Destory(HashTable *HashTable)
{int i=0;List L = NULL;Element cur = NULL, next = NULL;for (i=0; i < HashTable->TableSize; i++){L = HashTable->Thelists[i];cur = L->next;while (cur != NULL){next = cur->next;free(cur);cur = next;}free(L);}free(HashTable->Thelists);free(HashTable);
}

测试代码:

void main(void)
{char *elems[] = { "翠花","小芳","苍老师" };int i = 0;HashTable *HashTable;HashTable = InitHash(31);Insert(HashTable, 1, elems[0]);Insert(HashTable, 2, elems[1]);Insert(HashTable, 3, elems[2]);Delete(HashTable, 1);for (i = 0; i < 4; i++) {Element e = Find(HashTable, i);if (e) {printf("%s\n", (const char *)Retrieve(e));}else {printf("Not found [key:%d]\n",i);}}system("pause");
}

参考资料:

  1. C/C++从入门到精通-高级程序员之路【奇牛学院】

哈希链表的原理及算法实现相关推荐

  1. 【转】HMAC哈希消息认证码及算法原理

    HMAC算法原理 HMAC算法是一种基于密钥的报文完整性的验证方法 ,其安全性是建立在Hash加密算法基础上的.它要求通信双方共享密钥.约定算法.对报文进行Hash运算,形成固定长度的认证码.通信双方 ...

  2. 【转载】哈希表的原理,真的很难弄懂么?

    [转载]哈希表的原理,真的很难弄懂么? 刘小爱v 发布时间:05-0909:06科技达人 转载路径: https://baijiahao.baidu.com/s?id=1666172942887109 ...

  3. LeetCode 146. LRU缓存机制(哈希链表)

    文章目录 1. 题目信息 2. 解题 2.1 手动实现list 2.2 使用内置list 1. 题目信息 运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制.它应该支持以下操作 ...

  4. java源码系列:HashMap底层存储原理详解——4、技术本质-原理过程-算法-取模具体解决什么问题

    目录 简介 取模具体解决什么问题? 通过数组特性,推导ascii码计算出来的下标值,创建数组非常占用空间 取模,可保证下标,在HashMap默认创建下标之内 简介 上一篇文章,我们讲到 哈希算法.哈希 ...

  5. 一篇读懂分布式架构下的负载均衡技术:分类、原理、算法、常见方案等

    1.引言 关于"负载均衡"的解释,百度词条里:负载均衡,英文叫Load Balance,意思就是将请求或者数据分摊到多个操作单元上进行执行,共同完成工作任务. 负载均衡(Load ...

  6. java遍历是什么意思_Java遍历集合方法分析(实现原理、算法性能、适用场合)...

    概述 Java语言中,提供了一套数据集合框架,其中定义了一些诸如List.Set等抽象数据类型,每个抽象数据类型的各个具体实现,底层又采用了不同的实现方式,比如ArrayList和LinkedList ...

  7. 免费送书啦!《3D计算机视觉:原理、算法及应用》一本全搞定

    1966年,人工智能学家Minsky在给学生布置的作业中,要求学生通过编写一个程序让计算机告诉我们它通过摄像头看到了什么,这也被认为是计算机视觉(Computer Vision,CV)最早的任务描述. ...

  8. 证明利用快慢指针寻找有环单链表中环的起点算法

    问题:给定一个有环单链表,找到链表中环的起点,也就是说,找到下图中的单链表中Join点: (本图来源于http://www.cnblogs.com/xudong-bupt/p/3667729.html ...

  9. 两个有序单链表的合并排序算法

    设计两个有序单链表的合并排序算法 ListList MergeList(LiskList La, LinkList Lb){Lnode *pa = La->next;Lnode *pb = Lb ...

最新文章

  1. 量子力学与机器学习相结合,预测高温下的化学反应
  2. [HDU 1427]速度计算24点(DFS暴力搜索)
  3. java基础系列:集合基础(3)
  4. python 数据结构包_Python Redistr包_程序模块 - PyPI - Python中文网
  5. gperf工具的使用
  6. Amazon S3和Swift鉴权机制分析
  7. c#中中读取嵌入和使用资源文件的方法
  8. Android平台RTMP推送端实现外部数据对接推送和录像
  9. 模式识别中的特征向量和矩阵的特征向量有什么关系
  10. mysql表数据量太大,达到了1亿多条数据,除了分库分表之外,还有没有其他的解决方式?
  11. 如何快速水一篇NLP论文?
  12. 《流畅的Python》读书笔记——Python一等函数
  13. json解析小冒号:出错
  14. 【竞品分析】腾讯QQ手机浏览器与UC手机浏览器产品对比
  15. 3月30日自走棋无限刷国外服务器,基础改动_逆水寒3月28日更新内容_自走棋全区服上线_3DM网游...
  16. 波浪下划线怎么设置_如何在word中的文字下面加波浪线
  17. python中arcsec_Python SciPy 常数(Constants)
  18. for循环不执行的小坑
  19. 大数据背后的神秘公式:贝叶斯公式(万字长文)
  20. 【单例深思】枚举实现单例原理

热门文章

  1. android自适应拉伸图片,Android 启动页-解决图片被拉伸和压缩问题,适配虚拟导航栏...
  2. 【控制】《多智能体系统一致性与复杂网络同步控制》郭凌老师-第9章-结论与展望
  3. 【数理知识】差分 差分方程
  4. 关于stm32 hal 库 iic 一直是 busy 问题
  5. SOPC第二课 新手易犯错误和小灯闪烁SOPC代码以及固化讲解
  6. 【问题解决】微软OneNote使用笔记,Ditto解决OneNote复制粘贴文本输出图片问题
  7. 【DIY】DIYarduino温湿度计视频图文教程
  8. PSO求解梯级水库优化调度
  9. 台湾大学林教授libsvm在matlab的安装
  10. 京瓷打印机几个常见密码