哈希存储
***重要知识点
哈希表:根据关键码值(Key value)而直接进行访问的数据结构。
哈希存储: 在记录的存储位置和它的关键字之间建立一种确定的对应关系,使得每个关键字key对应一个存储位置;
关键字: key = 记录的存储位置;我们把这种关系key称为哈希函数(散列函数);查找时,可根据确定的对应关系,找到给定的key的映射。
哈希存储的特性:
<1>存储时,通过散列函数计算出记录的散列地址;
<2>查找时,根据同样的散列函数计算记录的散列地址,并按此散列地址访问记录。
***代码示例
利用哈希存储方法存储10行数字第i行存储的是从小到大对10取余为i的所有数字//以下函数中使用的交互协议
typedef int DataType;
typedef struct node
{
DataType data;
struct node * pNext;
}LinkNode;
#define HASH_TABLE_SIZE 10
//全局变量为:
LinkNode * HashTable[HASH_TABLE_SIZE] = {0};
往哈希表中插入数据
int insertHashTable(int num) //num为存入的数据
{
int idx = getKeyValue(num); //(此函数在该函数的下面)
LinkNode ** ppTmpNode = &HashTable[idx];
LinkNode * NextNode = malloc(sizeof(LinkNode));
if(NextNode == NULL)
{
perror("fail to malloc");
return 0;
}
NextNode->data = num;
NextNode->pNext = NULL;
while(*ppTmpNode != NULL && num > (*ppTmpNode)->data)
{
ppTmpNode = &((*ppTmpNode)->pNext);
}
NextNode->pNext = *ppTmpNode;
*ppTmpNode = NextNode;
return 0;
}
int getKeyValue(int num) //传入要存储的数据返回唯一对应key值
{
return num % 10;
}
遍历哈希表
int ShowHashTable()
{
int i = 0;
for(i = 0;i<HASH_TABLE_SIZE;i++)
{
LinkNode * TmpNode = HashTable[i];
printf("%d行的数据有:",i);
while(TmpNode != NULL)
{
printf("%d ",TmpNode->data);
TmpNode = TmpNode->pNext;
}
printf("\n");
}
return 0;
}
在哈希表中查看数据是否存在
int findHashTable(int num)
{
int idx = getKeyValue(num);
LinkNode * pTmpNode = HashTable[idx];
int cnt = 0; //计算查询数据所在的列数
while(pTmpNode != NULL)
{
if(pTmpNode->data == num)
{
cnt++;
printf("%d在表的第%d行%d列\n",num.idx,cnt);
return 0;
}
else
{
pTmpNode = pTmpNode->pNext;
cnt++;
}
}
printf("%d这个数不存在\n",num);
return 0;
}