哈希顺序表的结构:
先建立一个数据,它用来存放数据和键值。
再建立一个顺序表,里面存放数据和该顺序表的大小
最后建立哈希表,哈希表中有指向数组表的指针(哈希桶)和组的多少
typedef struct sq{
int key;
int shu;
}Data;
typedef struct sq_list {
Data *data;
int length;
}sq_List;
typedef struct HASH {
int size;
sq_List* List;
}Hash;
初始化:
先给指向顺序表的指针分配空间
再给每个顺序表分配空间。
并且将商都设置为0
bool init(Hash& hash, int size) {
hash.size = size;
hash.List = new sq_List[size];
for (int i = 0;i < size;i++) {
hash.List[i].data = new Data[30];
if (hash.List[i].data == NULL)
return false;
hash.List[i].length = 0;
}
return true;
}
哈希函数:
int HashF(int key, Hash& hash) {
return (key%hash.size);
}
查找:
bool Find(Hash& hash, int key) {
int n = HashF(key, hash);
for (int i = 0;i < hash.List[n].length;i++) {
if (key == hash.List[n].data[i].shu)
return false;
}
return true;
}
插入:
先判断是否有该key的数据,如果没有,根据哈希函数,判断在哪一个顺序表中,将它插入到顺序表的最后。
bool insert(Hash& hash, int key, int e) {
int n = HashF(key,hash);
if (Find(hash, key)) {
Data D;
D.key = key;
D.shu = e;
hash.List[n].data[hash.List[n].length] = D;
hash.List[n].length++;
}
else {
return false;
}
}
删除:
先根据key找到是哪一个顺序表的,再在这个表中查找有没有这个数据,如果有那么就通过覆盖法,将其删除
bool Delete(Hash& hash, int key) {
int n = HashF(key,hash);
int index = -1;
for (int i = 0;i < hash.List[n].length;i++) {
if (key == hash.List[n].data[i].key)
index = i;
}
if (index != -1) {
for (int i = 0;i < hash.List[n].length - 1;i++) {
hash.List[n].data[i] = hash.List[n].data[i + 1];
}
hash.List[n].length--;
}
return true;
}
全部代码:
#include<iostream>
#include<Windows.h>
using namespace std;
typedef struct sq{
int key;
int shu;
}Data;
typedef struct sq_list {
Data *data;
int length;
}sq_List;
typedef struct HASH {
int size;
sq_List* List;
}Hash;
bool init(Hash &hash,int size);
bool insert(Hash &hash,int key,int e);
int HashF(int key, Hash& hash);
bool Find(Hash& hash, int key);
bool Delete(Hash &hash,int key);
bool Destory(Hash &hash);
int main(){
Hash hash;
int size = 5;
init(hash, size);
insert(hash,1,3);
insert(hash,2, 4);
insert(hash,3, 5);
insert(hash,4, 6);
insert(hash,5, 7);
Delete(hash, 5);
for (int i = 0;i < hash.size;i++) {
for (int j = 0;j < hash.List[i].length;j++) {
cout << hash.List[i].data[j].shu << " ";
}
cout << endl;
}
Destory(hash);
system("pause");
return 0;
}
bool Destory(Hash& hash) {
for (int i = 0;i < hash.size;i++) {
delete (hash.List[i].data);
}
delete (hash.List);
return true;
}
bool init(Hash& hash, int size) {
hash.size = size;
hash.List = new sq_List[size];
for (int i = 0;i < size;i++) {
hash.List[i].data = new Data[30];
if (hash.List[i].data == NULL)
return false;
hash.List[i].length = 0;
}
return true;
}
int HashF(int key, Hash& hash) {
return (key%hash.size);
}
bool Delete(Hash& hash, int key) {
int n = HashF(key,hash);
int index = -1;
for (int i = 0;i < hash.List[n].length;i++) {
if (key == hash.List[n].data[i].key)
index = i;
}
if (index != -1) {
for (int i = 0;i < hash.List[n].length - 1;i++) {
hash.List[n].data[i] = hash.List[n].data[i + 1];
}
hash.List[n].length--;
}
return true;
}
bool Find(Hash& hash, int key) {
int n = HashF(key, hash);
for (int i = 0;i < hash.List[n].length;i++) {
if (key == hash.List[n].data[i].shu)
return false;
}
return true;
}
bool insert(Hash& hash, int key, int e) {
int n = HashF(key,hash);
if (Find(hash, key)) {
Data D;
D.key = key;
D.shu = e;
hash.List[n].data[hash.List[n].length] = D;
hash.List[n].length++;
}
else {
return false;
}
}