数据结构DAY4--哈希表

哈希表

概念:相当于字典,可以根据数据的关键字来寻找相关数据的查找表。

步骤:建立->插入->遍历->查找->销毁

建立

建立数据,形式随意,但一般为结构体(储存的数据量大);建立表结构体,包括储存数据的数据为和表结构体类型的指针(用于指向下一位)。

cpp 复制代码
typedef struct hsnode
{
	DATA_TYPE data;
	struct hsnode *pnext;
}HASH_NODE;

接着用该结构体定义出一个大小为HASN_SIZE的哈希表:

cpp 复制代码
HASH_NODE *hash_table[HASN_SIZE] = {NULL};

建立查找方法:根据具体的数据使用不同的方法,如汉字拼音可用拼音首子母来查找,将拼音转化为数字,根据数字来搜寻所需的数据域所对应的其余数据。

cpp 复制代码
int hash_fun(char ch)
{
	if (ch >= 'a' && ch <= 'z')
	{
		return ch-'a';
	}
	else if (ch >= 'A' && ch <= 'Z')
	{
		return ch-'A';
	}
	else
	{
		return HASN_SIZE-1;
	}
}
插入

用表结构体定义一个大小为结构体大小的指针结点,使其数据域为输入的数据,后驱指针指向空,用建立的查找方法获得该结构体的角标,然后使后驱指针指向角标为获得的角标的哈希表,并使该表值为带新数据的表头。

cpp 复制代码
int insert_hash_table(DATA_TYPE data)
{
	HASH_NODE *pnode = malloc(sizeof(HASH_NODE));
	if (NULL == pnode)
	{
		perror("fail malloc");
		return -1;
	}
	pnode->data = data;
	pnode->pnext = NULL;

	
	int addr = hash_fun(data.name[0]);

	pnode->pnext = hash_table[addr];
	hash_table[addr] = pnode;

	return 0;
}
遍历

用循环来遍历表头,在循环内,建立一个指针,指向哈希表,再建立一个循环,若哈希表不指向空,就遍历该表,并打印表的内容。

cpp 复制代码
void hash_for_each()
{
	for (int i = 0; i < HASN_SIZE; i++)
	{
		HASH_NODE *ptmp = hash_table[i];
		while (ptmp != NULL)
		{
			printf("%s %s %s %d\n", ptmp->data.name, ptmp->data.tel, ptmp->data.addr, ptmp->data.age);
			ptmp = ptmp->pnext;
		}
		printf("\n");
	}
}
查找

用表结构体定义一个指针,其值为角标为自定义的哈希函数的返回值的哈希表,只要其表结点不为空,就对比输入的搜索条件与表数据域相关内容,相同则返回,不同则使指针指向后驱结点继续对比

cpp 复制代码
HASH_NODE *find_hash_table(char *name)
{
	int addr = hash_fun(name[0]);

	HASH_NODE *ptmp = hash_table[addr];
	
	while (ptmp != NULL)
	{
		if (!strcmp(name, ptmp->data.name))
		{
			return ptmp;
		}
		ptmp = ptmp->pnext;
	}
	
	return NULL;
}
销毁

用表结构体定义一个指针,设置一个循环次数为哈希表长度的循环,再嵌套一个循环,若角标为循环次数的哈希表不为空(循环条件),则使指针等于角标为循环次数的哈希表,并使该哈希表值为指针的后驱结点,最后释放指针即可

cpp 复制代码
void destroy_hash_table()
{
	HASH_NODE *ptmp = NULL;
	for (int i = 0; i < HASN_SIZE; i++)
	{
		while(hash_table[i] != NULL)
		{
			ptmp = hash_table[i];
			hash_table[i] = ptmp->pnext;
			free(ptmp);
		}
	}
	
}
相关推荐
CSharp精选营4 天前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假7 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠8 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦15 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
小小工匠16 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
玖玥拾16 天前
C/C++ 数据结构(七)栈、容器适配器
c语言·数据结构·c++··容器适配器
Qres82116 天前
算法复键——树状数组
数据结构·算法
牛油果子哥q16 天前
并查集(DSU)超精讲,路径压缩、按秩合并、万能模板、连通性判定、最小生成树与刷题实战全解
数据结构·c++·最小生成树·并查集
凌波粒16 天前
LeetCode--491.递增子序列(回溯算法)
数据结构·算法·leetcode
WL学习笔记16 天前
单项不带头不循环链表
数据结构·链表