一、基础概念
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;
}