目录:

  • 代码:
  • 分析:

代码:

BSTree.h
BSTree.c
二叉排序树(Binary Sort Tree) 又称为二叉查找树(Binary Search Tree)

Hash.h

#ifndef _HASH_H_
#define _HASH_H_typedef void Hash;//定义哈希表类型
typedef void HashKey;//定义哈希表键类型
typedef void HashValue;//定义定义哈希表值类型typedef int (Hash_Compare)(HashKey*, HashKey*);//定义参数为两个哈希表键类型指针返回值是整形的函数类型Hash* Hash_Create();//声明创建哈希表函数
void Hash_Destroy(Hash* hash);//声明销毁哈希表函数
void Hash_Clear(Hash* hash);//声明清空哈希表函数
int Hash_Add(Hash* hash, HashKey* key, HashValue* value, Hash_Compare* compare);//声明添加值函数
HashValue* Hash_Remove (Hash* hash, HashKey* key, Hash_Compare* compare);//声明移除值函数
HashValue* Hash_Get(Hash* hash, HashKey* key, Hash_Compare* compare);//声明获取值函数
int Hash_Count(Hash* hash);//声明获取数量函数#endif

Hash.c

#include <stdio.h>
#include <malloc.h>
#include "Hash.h"
#include "BSTree.h"typedef struct _tag_HashNode HashNode;//定义哈希表节点类型
struct _tag_HashNode
{BSTreeNode header;HashValue* value;
};
//定义递归释放节点函数
void recursive_clear(BSTreeNode* node)
{if( node != NULL ){recursive_clear(node->left);recursive_clear(node->right);free(node);}
}Hash* Hash_Create()//定义创建哈希表函数
{return BSTree_Create();//创建一个树
}void Hash_Destroy(Hash* hash)//定义销毁哈希表函数
{Hash_Clear(hash);//清空哈希表BSTree_Destroy(hash);//再销毁树
}void Hash_Clear(Hash* hash)//定义清空哈希表函数
{//先清除释放节点的空间。这释放的其实是HashNode类型的空间//是在Hash_Add新建的node节点,因为转换类型成树的节点,但还是那块内存开头//所以会释放HashNode中的Value.recursive_clear(BSTree_Root(hash));BSTree_Clear(hash);//再将树清空重置
}
//定义添加值函数
int Hash_Add(Hash* hash, HashKey* key, HashValue* value, Hash_Compare* compare)
{int ret = 0;HashNode* node = (HashNode*)malloc(sizeof(HashNode));//新建节点if( ret = (node != NULL) )//创建成功{node->header.key = key;//将新建的键赋给树点的键node->value = value;//将新建的值赋给哈希节点的值ret = BSTree_Insert(hash, (BSTreeNode*)node, compare);//将哈希转换插入到树if( !ret )//如果不成功释放新建节点{free(node);}}return ret;
}
//定义移除值函数
HashValue* Hash_Remove(Hash* hash, HashKey* key, Hash_Compare* compare)
{HashValue* ret = NULL;HashNode* node = (HashNode*)BSTree_Delete(hash, key, compare);//从树中删除节点,并返回删除节点if( node != NULL )//如果有该节点{ret = node->value;//取得节点内的值free(node);//释放该节点}return ret;//返回值
}
//定义获取值函数
HashValue* Hash_Get(Hash* hash, HashKey* key, Hash_Compare* compare)
{HashValue* ret = NULL;HashNode* node = (HashNode*)BSTree_Get(hash, key, compare);//从树中获取节点if( node != NULL )//如果有该节点{ret = node->value;//取得值}return ret;//返回值
}int Hash_Count(Hash* hash)//定义获取数量函数
{return BSTree_Count(hash);
}

main.c

#include <stdio.h>
#include <stdlib.h>
#include "Hash.h"struct Student
{char* id;char* name;int age;
};int compare_id(HashKey* k1, HashKey* k2)//比较字符串
{return strcmp((char*)k1, (char*)k2);
}int main(int argc, char *argv[])
{Hash* hash = Hash_Create();struct Student s1 = {"9001201", "Delphi", 30};struct Student s2 = {"0xABCDE", "Java", 20};struct Student s3 = {"koabc", "C++", 40};struct Student s4 = {"!@#$%^", "C#", 10};struct Student s5 = {"Python", "Python", 10};struct Student* ps = NULL;Hash_Add(hash, s1.id, &s1, compare_id);Hash_Add(hash, s2.id, &s2, compare_id);Hash_Add(hash, s3.id, &s3, compare_id);Hash_Add(hash, s4.id, &s4, compare_id);Hash_Add(hash, s5.id, &s5, compare_id);ps = Hash_Get(hash, "koabc", compare_id);printf("ID: %s\n", ps->id);printf("Name: %s\n", ps->name);printf("Age: %d\n", ps->age);Hash_Destroy(hash);return 0;
}

分析:






哈希表 - (代码、分析 )相关推荐

  1. 哈希桶 entry_哈希表代码实现

    哈希表的主要用处:快速的数据存储和查找.例如,在我们日常上网过程中搜索某条信息的时候,信息的存储方式决定了查找该信息的速度,哈希表结合了数组的便捷访问和链表的便捷查找和删除的特点. 实现方式:通过哈希 ...

  2. 【算法导论】简单哈希表的除法实现

    哈希表,又名散列表.hashtable. .. 云云,看似非常高大上,事实上只是是直接寻址的延伸而已.直接寻址为何物,看一个数组:a[10],那么取当中一个元素a[1],这就是直接寻址,直接去这个a+ ...

  3. 哈希表(HashMap)的学习与实现

    目录 1.哈希表的起源? 2.哈希函数(hashcode()) 3.哈希冲突 4.负载因子 5.基于开散列的哈希表代码实现 1.哈希表的起源? 首先我们来分析一下从一组数据中查找某个元素的效率: 如果 ...

  4. 【数据结构与算法篇】 哈希表原理、底层实现剖析

    一个在校大二学生,在CSDN记录自我成长!!!最近在自学数据结构和算法时,学到了哈希表,有很多地方都不明白.如何使用哈希表?原理是什么?如何工作的?我们如何设计哈希表?等等,所以就在网络上查了相关博客 ...

  5. 【数据结构】哈希表的原理及实现

    1.什么是哈希表 哈希表又称为散列表,它是一种以键值对形式来存储数据的结构,只要输入待查找的key,就可以通过该key寻找到对应的值.对应函数:y = f(key) 通过把关键码映射到表中的对应位置来 ...

  6. 【哈希表】554. 砖墙

    目录 Python collection模块 哈希表 代码 554. 砖墙 难度中等 你的面前有一堵矩形的.由 n 行砖块组成的砖墙.这些砖块高度相同(也就是一个单位高)但是宽度不同.每一行砖块的宽度 ...

  7. 二十四、哈希表的原理分析及代码实现

    一.哈希表的基本介绍 散列表(Hash table,也叫哈希表),是根据关键码值(key value)而直接进行访问的数据结构.也就是说,它通过把关键码值映射到表中的一个位置来访问记录,以加快查找的速 ...

  8. 数据结构 链式哈希表(Hash Table)的接口定义与实现分析(完整代码)

    链式哈希表的接口定义 关于哈希表与链式哈希表的描述可以参阅:http://www.cnblogs.com/idreamo/p/7990860.html 链式哈希表的操作与属性有:初始化.销毁.插入元素 ...

  9. 哈希表(HashMap)分析及实现(JAVA)

    转自:http://www.java3z.com/cwbwebhome/article/article8/83560.html?id=4649 ---------------------------- ...

最新文章

  1. 第八周项目二-用对象数组操作长方柱类
  2. 解锁设备_无师自通解锁新设备抗击疫情
  3. 案例解析丨Spark Hive自定义函数应用
  4. zabbix-将业务机器加入到监控中
  5. Java核心类笔记(字符串方法、StringBuilder(Joiner)、包装、JavaBean、枚举、Math、随机数)
  6. 好男人是这样爱老婆的
  7. mfc mfc100ud.dll丢失问题
  8. c++ 返回引用_【Excel必知必会】引用(链接)小专题
  9. MTK平台修改分区大小之后,通过fastboot工具烧录的说明
  10. Email - 搭建自定义邮件服务器
  11. wireshark保存文件集-解决pcap文件过大,打开极慢的问题
  12. 世界坐标系和相机坐标系,图像坐标系的关系
  13. C语言项目-后宫选妃系统-第二天
  14. 《编译与反编译技术》—第3章3.1语 法 分 析
  15. matlab转化成c语言,matlab转化成c语言的有关问题不会了
  16. 力扣:121. 买卖股票的最佳时机 题解
  17. Java岗大厂面试百日冲刺 - 日积月累,每日三题【Day22】—— 并发编程2
  18. UVA 1665 Islands
  19. 【我的渲染技术进阶之旅】基于Filament渲染引擎绘制一个不停旋转的彩色矩形
  20. Android端实现多人音视频聊天应用(二):多人视频通话

热门文章

  1. 一张正方形图片,伴随我一年半,敢问情绪的使用方法
  2. 课时55.详情和概要标签(理解)
  3. DS博客作业06--图
  4. CentOS 7 Flannel的安装与配置
  5. Java环境变量的设置
  6. js 递归函数的使用及常用函数
  7. mysql查询优化之一:mysql查询优化常用方式
  8. WINFORM應用程式的主進入點和清除資源
  9. java 判断闰年和月份_java----根据输入的年月判断闰年和打印日历
  10. 连接mysql超时时间设置多少_怎么设置数据库的连接数和连接超时时间