0.定义
哈希表是一种高效用来搜索的数据结构,传统查找方式每次查找都需要进行元素比较,性能高低取决于元素比较次数;理想搜索方法,可以不经过任何比较,一次直接从表中得到要搜索的数据。
构造一种存储结构,通过某种函数使元素的存储位置与它的关键码之间能够建立一对一映射的关系,那么查找时通过该函数就可以很快找到该元素。
1.除余法哈希表
1.1关键结构体
键值对结构体以及哈希表管理结构体
cpp
// 键值对结构体
typedef struct pair{
int key;
char element[20];
}DATA,*LPDATA;//-> DATA = struct pair / LPDATA = struct pair*
// 哈希表管理结构体
typedef struct hashTable{
LPDATA* table;
int divisor; // 哈希表除数,哈希表长度
int curSize;// 当前已插入多少有效元素
}HASH,*LPHASH;
1.2创建哈希表
1.创建哈希表,申请内存空间
2.键值对结构体分配内存空间
3.为开辟内存空间的键值对空间指向NULL
cpp
LPHASH createHashTable(int p){
LPHASH hash = (LPHASH)malloc(sizeof(HASH));// hash表内存分配
assert(hash);
hash->curSize = 0;
hash->divisor = p;
hash->table = (LPDATA*)malloc(sizeof(LPDATA)*hash->divisor);// 键值对内存分配
assert(hash->table);
for (int i = 0; i < hash->divisor; i++){
hash->table[i] = NULL;
}
return hash;
}
1.3查找 key 应该存放的下标
1.确定待插入数据键在哈希表中的余数位置
2.到哈希表中确认位置,确认位置条件:2.1当前槽为空;2.2待插入数据键值与哈希表中当前位置键值相同,如果键值相同会进行覆盖
cpp
int search(LPHASH hash,int key){
int pos = key % hash->divisor;
int curPos = pos;
do{
// 槽位为空 或者 当前槽位key 与 查找 key 相等,返回下标
if (hash->table[curPos] == NULL || hash->table[curPos]->key == key){
return curPos;
}
curPos = (curPos + 1) % hash->divisor;
}while (curPos != pos);
return curPos;
}
1.4插入数据
1.确认当前插入元素的下标
2.对当前哈希表下标位置进行判断:2.1如果为空哈希表当前位置开辟内存空间将待插入数据拷贝进去;2.2如果不为空判断哈希表中当前键值是否等于待插入数据键值,如果等于就覆盖,如果不等于说明表满了
cpp
void insertData(LPHASH hash,DATA data){
int pos = search(hash,data.key);
if (hash->table[pos] == NULL){
hash->table[pos] = (LPDATA)malloc(sizeof(DATA));
memcpy(hash->table[pos],&data,sizeof(DATA));
hash->curSize++;
} else {
if (hash->table[pos]->key == data.key){
strcpy(hash->table[pos]->element,data.element);
} else {
printf("hash 表满了,无法插入\n");
return;
}
}
}
1.5打印哈希表
遍历从第一个位置到除数个位置,打印哈希表中每一个位置的数据,如果没有数据就输出NULL
cpp
void printHash(LPHASH hash){
for (int i = 0; i < hash->divisor; i++){
if (hash->table[i] == NULL){
printf("NULL\n");
} else {
printf("%d:%s\n",hash->table[i]->key,hash->table[i]->element);
}
}
}
1.6哈希表测试demo
1.创建哈希表
2.向哈希表中插入数据
3.打印哈希表
cpp
void task_hash_demo(void){
LPHASH hash = createHashTable(10);
DATA array[5] = {
{1,"雷电"},
{11,"春雨"},
{23,"四月"},
{44,"baby"},
{56,"virtual"},
};
int num = sizeof(array) / sizeof(array[0]);
for (int i = 0; i < num; i++){
insertData(hash,array[i]);
}
printHash(hash);
}