首页 > 其他分享 >哈希表——创建,查找结点——C语言描述

哈希表——创建,查找结点——C语言描述

时间:2023-05-13 22:44:17浏览次数:45  
标签:结点 HASH int HTable C语言 哈希 HashNum Table TABLE

哈希表——创建,查找结点——C语言描述

目录

0 测试用例框架

https://blog.csdn.net/m0_59469991/article/details/127137119?csdn_share_tail=%7B%22type%22%3A%22blog%22%2C%22rType%22%3A%22article%22%2C%22rId%22%3A%22127137119%22%2C%22source%22%3A%22m0_59469991%22%7D

1 定义

​ 先把key值存到表里面去,存的过程哈希表Hashkey与表里面的值(Key)一一对应,存表冲突时使用开放地址法解决。时间复杂度为O(1),空间复杂度为O(n).

2 数据结构

​ 增加平衡因子,表示为左子树减右子树的差值。

#define EMPTY_FLAG           (-1)
#pragma pack(1)
typedef struct _HASH_TABLE {
	int *Table;
	int Num;
}HASH_TABLE;
#pragma pack()

2 初始化哈希表与查找

(1)代码

void HashTableInit(HASH_TABLE **HTable, int Num) {
	int i = 0;

	if (HTable == NULL) {
		return;
	}

	*HTable = (HASH_TABLE *)malloc(sizeof(HASH_TABLE));
	if (*HTable == NULL) {
		return;
	}

	(*HTable)->Num = Num;
	(*HTable)->Table = (int *)malloc(sizeof(int) * Num);
	if ((*HTable)->Table == NULL) {
		return;
	}

	for (i = 0; i < (*HTable)->Num; i++) {
		(*HTable)->Table[i] = EMPTY_FLAG;
	}
}


int Hash(HASH_TABLE *HTable, int Key) {
	return Key % (HTable->Num);
}


void InsertKey(HASH_TABLE *HTable, int Key) {
	int HashNum;

	HashNum = Hash(HTable, Key);
	while (HTable->Table[HashNum] != EMPTY_FLAG) {
		HashNum = (HashNum + 1) % HTable->Num;
	}

	HTable->Table[HashNum] = Key;
}

void InsertHash(HASH_TABLE *HTable, int *Arr, int Num) {
	int i = 0;

	for (i = 0; i < Num; i++) {
		InsertKey(HTable, Arr[i]);
	}
}


int SearchHash(HASH_TABLE *HTable, int Key) {
	int HashNum;

	if (HTable == NULL) {
		return -1;
	}

	HashNum = Hash(HTable, Key);

	while (HTable->Table[HashNum] != Key) {
		HashNum = (HashNum + 1) % HTable->Num;
		if ((HashNum == (HTable->Num - 1)) || (HTable->Table[HashNum] == EMPTY_FLAG)) {
			return -1;
		}
	}

	return HTable->Table[HashNum];
}

(2)测试用例

void PrintHashTable(HASH_TABLE *HTable) {
	int i = 0;

	for (i = 0; i < HTable->Num; i++) {
		printf("HTable->Table[%d] = %d\n", i, HTable->Table[i]);
	}
}

/*TestSearchHash*/
void TestSearchHash(void) {
	/*Test01*/
	// {5, 1, 2, 3, 4}
	HASH_TABLE *HTable01 = NULL;
	int Arr01[] = { 1, 3, 5, 2, 4 };
	int Num01 = 5;
	int Key01 = 3;
	int Res01;
	int CmpRes01 = 3;

	/*Test02*/
	// {5, 1, 10, 3, 8}
	HASH_TABLE *HTable02 = NULL;
	int Arr02[] = { 1, 3, 5, 10, 8 };
	int Num02 = 5;
	int Key02 = 10;
	int Res02;
	int CmpRes02 = 10;

	/*Test03*/
	// {5, 1, 10, 3, 8}
	HASH_TABLE *HTable03 = NULL;
	int Arr03[] = { 1, 3, 5, 10, 8 };
	int Num03 = 5;
	int Key03 = 4;
	int Res03;
	int CmpRes03 = -1;

	printf("-------Test start----------\n");
	InitNum();

	/*Test01*/
	printf("\n-------Test 01----------\n");
	HashTableInit(&HTable01, Num01);
	InsertHash(HTable01, Arr01, Num01);
	PrintHashTable(HTable01);
	Res01 = SearchHash(HTable01, Key01);
	TestCmpRes(CmpRes01, Res01);

	/*Test02*/
	printf("\n-------Test 02----------\n");
	HashTableInit(&HTable02, Num02);
	InsertHash(HTable02, Arr02, Num02);
	PrintHashTable(HTable02);
	Res02 = SearchHash(HTable02, Key02);
	TestCmpRes(CmpRes02, Res02);

	/*Test03*/
	printf("\n-------Test 03----------\n");
	HashTableInit(&HTable03, Num03);
	InsertHash(HTable03, Arr03, Num03);
	PrintHashTable(HTable03);
	Res03 = SearchHash(HTable03, Key03);
	TestCmpRes(CmpRes03, Res03);

	/*Test Result*/
	printf("\n-------Test result----------\n");
	TestResult();
}

(3)打印结果

-------Test start----------

-------Test 01----------

HTable->Table[0] = 5

HTable->Table[1] = 1

HTable->Table[2] = 2

HTable->Table[3] = 3

HTable->Table[4] = 4

-------Test 02----------

HTable->Table[0] = 5

HTable->Table[1] = 1

HTable->Table[2] = 10

HTable->Table[3] = 3

HTable->Table[4] = 8

-------Test 03----------

HTable->Table[0] = 5

HTable->Table[1] = 1

HTable->Table[2] = 10

HTable->Table[3] = 3

HTable->Table[4] = 8

-------Test result----------

Print test result;

TestNum = 3, PassNum = 3, FaildNum = 0

标签:结点,HASH,int,HTable,C语言,哈希,HashNum,Table,TABLE
From: https://www.cnblogs.com/meditatorss/p/17398416.html

相关文章

  • C语言程序设计(第四版)谭浩强版 课后答案 第五章
    2、#include<stdio.h>#include<math.h>intmain(){intsign=1,count=0;doublepi=0.0,n=1.0,term=1.0;while(fabs(term)>=pow(10,-6)){pi=pi+term;n=n+2;si......
  • c语言
    c语言命令:int摘要:C/C++编程语言中,int表示整型变量,是一种数据类型,用于定义一个整型变量,在不同编译环境有不同的大小,不同编译运行环境大小不同。在32/64位系统中都是32位,范围为-2147483648~+2147483647,无符号情况下表示为0~4294967295。c语言命令:scanf摘要:scanf是C语言中的输入......
  • C语言刷leetcode——贪心
    目录贪心刷题252.会议室(P)253.会议室II(P)1353.最多可以参加的会议数目贪心找到贪心策略,使得:局部最优解-->整体最优解刷题252.会议室(P)253.会议室II(P)#defineMAX1000001intminMeetingRooms(int**intervals,intintervalsSize,int*intervalsColSize){......
  • 关于C语言getchar()的作用理解
    让我们先看一个程序#include<stdio.h>intmain(){charch[100];fgets(ch,10,stdin);//用标准输入设备输入fputs(ch,stdout);//用标准输出设备输出return0;}这个时候,我们输入超过10个字符,只读前十个字符;不超过10个字符,输入字符时,输出会多输出一行,说明\n也......
  • 初始c语言的学习
    1、计算机的发展历史,C语言是与计算机沟通的语言,计算机只能够识别二进制,也即正负电(1,0)。2、空项目->源文件,右键新建项目->创建一个新的项目。3、头文件#include<stdio.h>主函数intmain(){(这里开始你的代码)return0;}4、第一个库函数printf("%d\n",xxx);在此介绍我所了解的库函......
  • 双向链表_C语言
    2023年5月12日22:35:371.数据结构普通节点:数据域*data,指针域*prev、*next头结点:size+普通节点其中:头结点data为NULL,size是指定data空间大小,data数据类型未定,也就是说头结点不同于普通节点本文想要实现的额外功能:data数据无论是多大,无论是什么类型,都能直接存放进去代码......
  • C语言--字符操作库函数1
    strtok 字符串分割char*strtok(char*str,constchar*sep);strerror返回错误码,所对应的错误信息char*strerror(errno)errno--errno.h 是一个全局错误码的变量当C语言的库函数在执行过程中,发生了错误,就会把对应错误吗复制到errno中。字符分类函数引用<ctyoe.h>intret=iscntrl......
  • c语言环境配置
    1.先从百度搜索Windows下MinGW-w64的安装2.在从链接https://pan.baidu.com/s/1aMyeF4iUl0Bfn-P8ILGliQ3.在此电脑属性打开高级系统设置4.打开环境变量,再编辑用户变量中的Pith  5.新建浏览自己文件mingw64中的bin文件 一直确定退出 6.Win加R键输入cmd,输入gcc-v后有......
  • 打卡 c语言趣味编程 最佳存款问题
    假设银行一年整存零取的月息为0.63%。现在某人手中有一笔钱,他打算在今后的5年中的每年年底取出1000元,到第5年时刚好取完,请算出他存钱时应存入多少。思路:计算储蓄金额的数学公式为:储蓄金额=每年取出金额×(1+月息)^(存款年限×12)定义每年取出金额和存款年......
  • 一致性哈希(哈希环)解决数据分布问题
    哈希算法是程序开发过程中最广泛接触到的的算法之一,典型的应用有安全加密、数据校验、唯一标识、散列函数、负载均衡、数据分片、分布式存储。前些天遇到用一致性哈希(哈希环)的场景,不过我细想一下,对这个知识点好像了解过,但是又没太深印象,说不出具体是什么原理,怎么用,有哪些注意的地......