Day16:hash表

一、基础概念

1.hash表:

        既是数据结构 又是算法   哈希法  散列表 散列法
        特点:查找效率非常高     

2.应用:

                编程语言的函数查找、加密解密、非对称加密    

                任何数据   生成  固定长度的一个串  sha1  md5

3.关键的三要素:

        ①数据范围
        ②合适的hash函数     查找数据的方式    返回数据存放地址
        ③解决冲突的办法
               不同数据 通过第二步的hash函数返回地址相同  要区分存储

 二、代码实例:

存储十进制整数:(可能出现的数字0-9999)
    三层数组   利用十进制数每个位上的数在 0-9之间 这种规律

①数据的范围:0-9999

②hash函数:数组下表的映射

③解决冲突的方法:

        最后一个节点变成一个链表去存储(依次去遍历即可.)。

 可能的冲突是,705和1705的冲突等等类似的

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//解决冲突 用链表
struct Node
{
	int		data;
	Node*	pNext;
};

//hash表结构
struct HashTable
{
	Node**** pArr;
};

//Node*  arr[10][10][10];

Node* createNode(int data);
//初始化hash表
void initHash(HashTable* pHash);
//往hash表中放数据
void push(HashTable* pHash, int data);
//hash函数
Node* findDataFromHash(HashTable* pHash, int data);

int main()
{
	HashTable hash;
	initHash(&hash);

	int n;
	int data;
	Node* pTemp;
	while (1)
    {
		printf("1 - 插入\n");
		printf("2 - 查找\n");
		printf("3 - 退出\n");
		scanf("%d", &n);
		switch (n)
        {
		case 1:
			printf("请输入插入数据:"); scanf("%d", &data);
			push(&hash, data);
			printf("插入完毕!\n");
			break;
		case 2:
			printf("请输入查找数据:"); scanf("%d", &data);
			pTemp = findDataFromHash(&hash, data);
			if (pTemp)
            {
				printf("找到了:%d!\n",pTemp->data);
			}
			else
            {
				printf("木有找到\n");
			}
			
			break;
		case 3:
			return 0;
			break;
		}
	}

	while (1);
	return 0;
}

//往hash表中放数据
void push(HashTable* pHash, int data)
{
	//1 创建节点
	Node* pNew = createNode(data);
	//2 寻址
	int bai = data / 100 % 10;
	int shi = data / 10 % 10;
	int ge = data % 10;


	Node* pTemp = pHash->pArr[bai][shi][ge];
	if (pTemp)
	{//3 解决冲突
		//3.1 找到最后一个节点
		while (pTemp->pNext) pTemp = pTemp->pNext;
		//3.2 新节点成为最后一个节点的下一个节点
		pTemp->pNext = pNew;
	}
	else
	{//本来为空,说明没有数据
		pHash->pArr[bai][shi][ge] = pNew;
	}
}

//hash函数
Node* findDataFromHash(HashTable* pHash, int data)
{
	int bai = data / 100 % 10;
	int shi = data / 10 % 10;
	int ge = data % 10;

	Node* pTemp = pHash->pArr[bai][shi][ge];

	while (pTemp)
    {
		if (data == pTemp->data) return pTemp;

		pTemp = pTemp->pNext;
	}
	return NULL;
}

//初始化hash表
void initHash(HashTable* pHash)
{
	pHash->pArr = (Node****)malloc(sizeof(Node***)* 10);//第一层
	for (int i = 0; i < 10; i++)
	{
		pHash->pArr[i] = (Node***)malloc(sizeof(Node**)* 10);//第二层
		for (int j = 0; j < 10; j++)
		{
			pHash->pArr[i][j] = (Node**)malloc(sizeof(Node*)* 10);//第三层
			memset(pHash->pArr[i][j], 0, sizeof(Node*)* 10);
		}
	}
}

Node* createNode(int data)
{
	Node* pNew = (Node*)malloc(sizeof(Node));
	pNew->data = data;
	pNew->pNext = NULL;
	return pNew;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_Ocean__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值