哈希表原理:用哈希函数把不同key分配在哈希桶(指针数组)的不同索引里,以达到不同的键值对分组效果
哈希表的组成:元素:键值对,哈希桶:实际就是指针数组(每个索引指向每组首元素);哈希函数
hashStruct.h
#include <string>
#include<iostream>
#define HASH_MAX 5
typedef struct Element {
int key;
const char* value;
}Ele;
typedef struct List {
Element element;
List* nextList;
List() {
element.key = 0;
element.value = '\0';
nextList = nullptr;
}
}HeadNode;
typedef struct HashBucket {
size_t maxSize;
List** hashBucketArray;
}HB;
int hashFunc(int key) {
if (key<0) {
std::cout << "key不能小于0";
return -1;
}
return key % HASH_MAX;
}
bool initHashBucket(HashBucket* hashBucket) {
if (NULL==hashBucket) {
std::cout << "哈希桶为空";
return 0;
}
hashBucket->maxSize = HASH_MAX;
hashBucket->hashBucketArray = (List**)malloc(sizeof(List*) * hashBucket->maxSize);//返回哈希桶的地址
if (NULL== hashBucket->hashBucketArray) {
std::cout << "哈希桶分配内存失败";
free(hashBucket->hashBucketArray);
return 0;
}
List** initHashBucket = hashBucket->hashBucketArray;
for (size_t i = 0; i < hashBucket->maxSize; ++i) {
initHashBucket[i] = new List();//每个分配头节点
}return 1;
}
bool addListNode(List* listNode, HashBucket* hashBucket) {
if (!listNode||!hashBucket) {
std::cout << "无法添加元素,其中一个参数为空"<<std::endl;
return 0;
}
int postion=hashFunc(listNode->element.key);
hashBucket->hashBucketArray[postion]->nextList = listNode;
return 1;
}
hash_main.c
测试demo:
#include"hashStruct.h"
//using namespace std;
int main() {
HashBucket hashBucket;
initHashBucket(&hashBucket);
List list;
list.element.key = 1;
list.element.value = "凤姐";
addListNode(&list, &hashBucket);
std::cout << hashBucket.hashBucketArray[1]->nextList->element.key;
system("pause");
return 0;
}