哈希表 - (代码、分析 )

目录:

    • 代码:
    • 分析:

代码:

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;
}

分析:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/379127.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scala spark 数据对比_IT大牛耗时三个月总结出大数据领域学习路线,网友评论:炸锅了...

大数据不是某个专业或一门编程语言&#xff0c;实际上它是一系列技术的组合运用。有人通过下方的等式给出了大数据的定义。大数据 编程技巧 数据结构和算法 分析能力 数据库技能 数学 机器学习 NLP OS 密码学 并行编程虽然这个等式看起来很长&#xff0c;需要学习的东…

Python---实验九作业

1&#xff0c;使用tkinter实现计算器程序。实现效果如下&#xff1a; from tkinter import * from tkinter.ttk import *def frame(master):"""将共同的属性作为默认值, 以简化Frame创建过程"""w Frame(master)w.pack(sideTOP, expandYES, fill…

用pv操作描述如下前驱图_LinkedList实现分析(二)——常用操作

上一篇文章LinkedList实现分析(一)——LinkedList初探与对象创建介绍了LinkedList中的一些重要属性和构造方法&#xff0c;下面我们将详细介绍一下LinkedList提高的常用方法的实现原理元素添加###add(E e)方法往LinkedList添加元素&#xff0c;LinkedList提供了多重方式&#x…

C++多重继承与虚基类及与.NET的比较

多重继承前面我们介绍的派生类只有一个基类&#xff0c;称为单基派生或单一继承。在实际运用中&#xff0c;我们经常需要派生类同时具有多个基类&#xff0c;这种方法称为多基派生或多重继承。2.1 多重继承的声明&#xff1a;在 C 中&#xff0c;声明具有两个以上基类的派生类与…

平院实训门禁系统导入

这是我的配置&#xff08;如果是Win10最好每一步都管理员身份运行&#xff09; win7 SQLServer2008 VS2012 切记&#xff1a;注意&#xff1a;当你SQLserver创建数据库和VS连接数据库的时候得用同一种方式&#xff0c;要么都用window&#xff08;主机名&#xff09;&#xff0…

北京中信银行总行地址_中信银行拉萨分行举行“存款保险标识”启用和存款保险条例宣传活动...

11月NOV中信银行拉萨分行举行“存款保险标识”启用和《存款保险条例》宣传活动揭牌启用仪式111月Jul根据人民银行和总行关于“存款保险标识”启用工作相关要求&#xff0c;分行行领导高度重视“存款保险标识”启用和《存款保险条例》宣传活动工作&#xff0c;按照统一工作部署、…

转整型_156.Ruby烘焙大理石豆沙吐司解锁大理石花纹整型

好看又好吃的大理石豆沙面包。红豆馅均匀分布在松软细腻的面包体里&#xff0c;手撕着吃&#xff0c;一层层的甜美与温柔&#xff5e;关于吐司面包&#xff0c;我公众号里写过白吐司(基础款牛奶吐司&#xff0c;超绵鲜奶油吐司)和全麦吐司(基础款50%全麦吐司&#xff0c;经典燕…

VS2010 快捷键 (空格显示 绿点, Tab 显示箭头)

VS2010 有用的快捷键 &#xff1a; Ctrl r, ctrl w, 切换空格示。 转载于:https://www.cnblogs.com/fengye87626/archive/2012/11/21/2780716.html

分析一下mp4格式的trak -> mdia -> minf -> stbl -> stts、stsc 这两个box信息

分析一下mp4格式的trak -> mdia -> minf -> stbl -> stts、stsc 这两个box信息 &#xff08;因为这两个box在音频trak和视频trak 下都有的&#xff0c;而且都有一个数组的值是比较绕的&#xff09; 目录&#xff1a;stts&#xff1a;记录时间戳的&#xff0c;每个s…

Python---爬虫案例

例1、爬取公众号文章中的图片。 1&#xff0c;首先打开要获取公众号文章的地址 2&#xff0c;按下F12&#xff0c;再按Ctrl Shift C&#xff0c;然后鼠标移动到图片位置&#xff0c;然后观察控制台中显示图片对应的代码位置 3&#xff0c;分析该位置的代码段 代码段如下&…

Python---实验九

1、使用标准库urllib爬取“http://news.pdsu.edu.cn/info/1005/31269.htm”平顶山学院新闻网上的图片&#xff0c;要求:保存到F盘pic目录中&#xff0c;文件名称命名规则为“本人姓名” “_图片编号”&#xff0c;如姓名为张三的第一张图片命名为“张三_1.jpg”。 from re imp…

32接上拉5v_51单片机P0口上拉电阻的选择

作为I/O口输出的时候时&#xff0c;输出低电平为0 输出高电平为高组态(并非5V&#xff0c;相当于悬空状态&#xff0c;也就是说P0 口不能真正的输出高电平)。给所接的负载提供电流&#xff0c;因此必须接(一电阻连接到VCC)&#xff0c;由电源通过这个上拉电阻给负载提供电流。P…

[转载]FPGA/CPLD重要设计思想及工程应用(时序及同步设计)

来源&#xff1a;http://www.eetop.cn/blog/html/11/317611-13412.html 数字电路中,时钟是整个电路最重要、最特殊的信号。 第一, 系统内大部分器件的动作都是在时钟的跳变沿上进行, 这就要求时钟信号时延差要非常小, 否则就可能造成时序逻辑状态出错. 第二, 时钟信号通常是系统…

实验五 图形设计

每复制一个方法都要绑定Paint事件 一、创建Windows窗体应用程序&#xff0c;要求如下&#xff1a;&#xff08;源代码运行界面&#xff0c;缺少任一项为0分&#xff0c;源代码只需粘贴绘制图形代码所在的方法&#xff0c;不用粘贴太多&#xff09; 例如: &#xff08;1&…

ADO.NET与SQL Server数据库的交互

7.3.1 使用SqlConnection对象连接数据库 例如&#xff1a;建立与SQL Server数据库的连接。 string connstring"Data Sourceservername;uidusername;pwdpassword;Initial Catalogdbname";SqlConnection connnew SqlConnection(connstring);conn.Open(); 例如&#xf…

linux ftp日志_linux学习笔记(一)——Linux分区和目录结构

linux学习笔记&#xff08;一&#xff09;——Linux分区和目录结构安装Linux时&#xff0c;手动挂载分区的情况下&#xff0c;/ 和 swap 是必须要挂载的&#xff0c;其他/home、/boot 等可以根据需要自行挂载。一般来说&#xff0c;简单的话&#xff0c;建议挂载三个分区&#…

vc++ 6.0 堆栈_在C ++中使用链接列表实现堆栈

vc 6.0 堆栈To implement a stack using a linked list, basically we need to implement the push() and pop() operations of a stack using linked list. 要使用链接列表实现堆栈 &#xff0c;基本上&#xff0c;我们需要使用链接列表实现堆栈的push()和pop()操作。 Exampl…

协议地址结构_TCP/IP 协议 讲解

计算机网络体系结构分层太厉害了&#xff0c;终于有人能把TCP/IP 协议讲的明明白白了计算机网络体系结构分层不难看出&#xff0c;TCP/IP 与 OSI 在分层模块上稍有区别。OSI 参考模型注重“通信协议必要的功能是什么”&#xff0c;而 TCP/IP 则更强调“在计算机上实现协议应该开…

28335接两个spi设备_IIC和SPI如此流行,谁才是嵌入式工程师的必备工具?

IICvs SPI现今&#xff0c;在低端数字通信应用领域&#xff0c;我们随处可见 IIC (Inter-Integrated Circuit) 和 SPI (Serial Peripheral Interface)的身影。原因是这两种通信协议非常适合近距离低速芯片间通信。Philips(for IIC)和 Motorola(for SPI) 出于不同背景和市场需求…