哈希表 - (代码、分析 )

目录:

    • 代码:
    • 分析:

代码:

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;需要学习的东…

Java IdentityHashMap equals()方法与示例

IdentityHashMap类equals()方法 (IdentityHashMap Class equals() method) equals() method is available in java.util package. equals()方法在java.util包中可用。 equals() method is used to check whether this IdentityHashMap object and the given object (ob) are eq…

jQuery中关于Ajax的详解

本文介绍如何使用jquery实现Ajax功能. 用于发送Ajax请求的相关函数如load, get, getJSON和post这些渐变Ajax方法, 对于核心的ajax 方法没有过多介绍, 主要是通过配置复杂的参数实现完全控制Ajax请求。 Ajax让用户页面丰富起来, 增强用户体验. Ajax是所有Web开发的必修课. 虽然A…

Python---实验九作业

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

分析FLV文件分析和解析器的开源代码

分析一下GitHub上一份FLV文件分析和解析器的开源代码 GitHub源码地址&#xff1a;功能强大的 FLV 文件分析和解析器 &#xff1a;可以将flv文件的视频tag中的h264类型数据和音频tag中的aac类型数据导出 &#xff08;只限h264和aac&#xff09; (这个代码不太适合用于大文件的分…

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

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

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

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

Javascript的IE和Firefox兼容性汇编

window.event现有问题&#xff1a;使用 window.event 无法在 FF 上运行解决方法&#xff1a;FF 的 event 只能在事件发生的现场使用&#xff0c;此问题暂无法解决。可以这样变通&#xff1a;原代码(可在IE中运行)&#xff1a;<input type"button" name"someB…

Java Double类compareTo()方法与示例

双类compareTo()方法 (Double class compareTo() method) compareTo() method is available in java.lang package. compareTo()方法在java.lang包中可用。 compareTo() method is used to check equality or inequality for this Double-object against the given Double-obje…

平院实训门禁系统导入

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

ffmpeg 解码音频(aac、mp3)输出pcm文件

ffmpeg 解码音频&#xff08;aac、mp3&#xff09;输出pcm文件 播放pcm可以参考&#xff1a; ffplay -ar 48000 -ac 2 -f f32le out.pcm main.c #include <stdio.h> #include <stdlib.h> #include <string.h>#include <libavutil/frame.h> #include …

Jquery getJSON()

getJSON与aspx 准备工作 Customer类 public class Customer{public int Unid { get; set; }public string CustomerName { get; set; }public string Memo { get; set; }public string Other { get; set; }}&#xff08;一&#xff09;ashx Customer customer new Customer { …

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

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

Java ClassLoader getPackage()方法与示例

ClassLoader类的getPackage()方法 (ClassLoader Class getPackage() method) getPackage() method is available in java.lang package. getPackage()方法在java.lang包中可用。 getPackage() method is used to return the package that has been defined in ClassLoader or t…

C---编写程序:求出1~1000之间能被7或12整除,但不能同时被二者整除的所有整数,将结果保存在数组中,要求程序数据的输入、计算和输出均使用函数实现。

编写程序&#xff1a;求出1~1000之间能被7或12整除&#xff0c;但不能同时被二者整除的所有整数&#xff0c;将结果保存在数组中&#xff0c;要求程序数据的输入、计算和输出均使用函数实现。 编程思路&#xff1a;分别编写函数input()、cal()、output()实现数据的输入、计算和…

报告称我国成最大移民输出国 将形成投资产业链(关注)

时代特有的现象&#xff0c;我们应该予以关注 “现在国内房价这么高&#xff0c;政策也看不清&#xff0c;还不如逢高卖掉之前买的几套房子&#xff0c;一两套房子的钱办个投资移民&#xff0c;趁还年轻&#xff0c;拿到绿卡后享受一下美国本国待遇的高等教育了。”广州&#x…

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

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

ffmpeg 解码视频(h264、mpeg2)输出yuv420p文件

ffmpeg 解码视频&#xff08;h264、mpeg2&#xff09;输出yuv420p文件 播放yuv可以参考&#xff1a;ffplay -pixel_format yuv420p -video_size 768x320 -framerate 25 out.yuv main.c #include <stdio.h> #include <stdlib.h> #include <string.h>#includ…

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

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

C---编写程序:实现一个随堂测试,能进行加减乘除运算。要求如下:(1)随机产生两个1~10的正整数,在屏幕上输出题目,如:5+3=?(2)学生输入答案,程序检查学生输入答案是否正确,若正确,

编写程序&#xff1a;实现一个随堂测试&#xff0c;能进行加减乘除运算。要求如下&#xff1a; 1&#xff09;随机产生两个1~10的正整数&#xff0c;在屏幕上输出题目&#xff0c;如&#xff1a;53&#xff1f; 2&#xff09;学生输入答案&#xff0c;程序检查学生输入答案是…