数据结构---哈希顺序表

哈希顺序表的结构:
先建立一个数据,它用来存放数据和键值。
再建立一个顺序表,里面存放数据和该顺序表的大小
最后建立哈希表,哈希表中有指向数组表的指针(哈希桶)和组的多少

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;
	}
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值