数据结构学习,哈希表链地址
各位小伙伴,新年快乐。
哈希表,本质上是数组,而链地址就是存放了链表的数组。
借用哈希函数对某个数进行适当运算求得该数的哈希值,在根据这个哈希值对哈希表进行查找插入删除操作。
假设这是一个哈希表H,容量为5,长度为0;五个指针全部为NULL;
首先我们有一个数:3;假设其求得的哈希值为2,如图所示:
然后再令3成为这个存放这五个链表的数组中,第三个链表的,第一个结点。
如图所示:
这就是插入,删除也可借鉴单链表的操作。
下面来看怎么实现的
目录
预先要引用的头文件以及宏定义
-
-
-
//
-
//using namespace std;
-
-
-
-
-
-
-
-
-
typedef int ElemType;
-
typedef int Status;
-
typedef int KeyType;
所使用哈希表的结构
-
//(链地址)
-
typedef struct {
-
KeyType Key;
-
//这里可以存放其他数据
-
}RecordType, RcdType;
-
typedef struct Node { //其实这个指针就是链表
-
RcdType r;
-
struct Node* next;
-
}Node;
-
typedef struct {
-
Node** rcd; //(指向指针的指针)存放指针的数组
-
int size; //哈希表的容量
-
int count; //当前表中含有的记录个数
-
int(*hash)(KeyType key, int hashSize); //函数指针变量,选取哈希函数
-
}HashTable;
所使用的哈希函数
-
int hash(int key, int hashSize)
-
{//哈希函数,hashSize为地址空间长度(哈希表的容量)
-
return (3 * key) % hashSize;
-
}
哈希函数可以有很多种
1,直接定址法,你这个数是98,那里就到H.rcd[98]里面去,直接。hash = 98
2,除留余数法,hash = 关键字%(某个你中意的数(一般是哈希表的容量))也是我选择的。
3,数字分析法,
4,折叠法,
5,平方取中法,
等。3,4,5大家有兴趣就搜一下,我不会讲。
其基本操作接口
-
Status InitHash(HashTable& H, int size, int(*hash)(KeyType, int)); //初始化哈希表
-
Status DestroyHash(HashTable& H); //销毁哈希表
-
Node* SearchHash(HashTable H, KeyType key); //查找
-
Status InsertHash(HashTable& H, RcdType e); //插入
-
Status DeleteHash(HashTable& H, KeyType key, RcdType& e); //删除
-
void HashTraverse(HashTable H); //遍历
初始化哈希表
-
Status InitHash(HashTable& H, int size, int(*hash)(KeyType, int))
-
{
-
H.rcd = (Node**)malloc(size*sizeof(Node*));
-
if (H.rcd != NULL)
-
{
-
for (int i = 0; i < size; i )
-
{
-
H.rcd[i] = NULL;
-
}
-
H.size = size;
-
H.hash = hash;
-
H.count = 0;
-
return OK;
-
}
-
else
-
{
-
return OVERFLOW;
-
}
-
}
销毁哈希表
-
Status DestroyHash(HashTable& H)
-
{
-
if (H.rcd != NULL)
-
{
-
Node* np, * nt;
-
for (int i = 0; i < H.size; i )
-
{
-
np = H.rcd[i];
-
while (np != NULL)
-
{
-
nt = np;
-
np = np->next;
-
free(nt);
-
}
-
}
-
H.size = 0;
-
H.count = 0;
-
H.hash = NULL;
-
return OK;
-
}
-
else
-
{
-
return OVERFLOW;
-
}
-
}
查找
-
Node* SearchHash(HashTable H, KeyType key)
-
{
-
int p = H.hash(key, H.size);
-
Node* np;
-
for (np = H.rcd[p]; np != NULL; np = np->next)
-
{
-
if (np->r.Key == key)return np;
-
}
-
return NULL;
-
}
插入
-
Status InsertHash(HashTable& H, RcdType e)
-
{
-
int p;
-
Node* np;
-
np = SearchHash(H, e.Key);
-
if (np == NULL)
-
{
-
p = H.hash(e.Key, H.size);
-
np = (Node*)malloc(sizeof(Node));
-
if (np != NULL)
-
{
-
np->r = e;
-
np->next = H.rcd[p];
-
H.rcd[p] = np;
-
H.count ;
-
return OK;
-
}
-
else
-
{
-
return OVERFLOW;
-
}
-
}
-
else
-
{
-
return ERROR;
-
}
-
}
删除
-
Status DeleteHash(HashTable& H, KeyType key, RcdType& e)
-
{
-
Node* n;
-
n = SearchHash(H, key);
-
if (n != NULL)
-
{
-
int p = H.hash(key, H.size);
-
Node* np, * nq;
-
np = H.rcd[p];
-
nq = NULL;
-
while (np != NULL)
-
{
-
if (np->r.Key != key)
-
{
-
nq = np;
-
np = np->next;
-
}
-
else
-
{
-
e = np->r;
-
if (nq == NULL)//表头
-
{
-
H.rcd[p] = np->next;
-
}
-
else//不是表头
-
{
-
nq->next = np->next;
-
}
-
break;
-
}
-
}
-
H.count--;
-
free(np);
-
return OK;
-
}
-
else
-
{
-
return ERROR;
-
}
-
}
遍历
-
void HashTraverse(HashTable H)
-
{
-
if (H.rcd != NULL)
-
{
-
Node* np, * nq;
-
for (int i = 0; i < H.size; i )
-
{
-
np = H.rcd[i];
-
if (np == NULL)
-
{
-
printf(" #");
-
}
-
else
-
{
-
while (np)
-
{
-
printf("=", np->r.Key);
-
np = np->next;
-
}
-
}
-
printf("\n");
-
}
-
}
-
}
一些接口的测试
-
int main()
-
{
-
HashTable H;
-
InitHash(H, 10, hash);
-
for (int i = 0; i < 12; i )
-
{
-
RcdType e;
-
e.Key = i;
-
InsertHash(H, e);
-
}
-
HashTraverse(H);
-
RcdType e1;
-
DeleteHash(H, 9, e1);
-
printf("被删数据%d\n", e1.Key);
-
HashTraverse(H);
-
DestroyHash(H);
-
}
其实想想看,如果他不是链表,是棵B树呢!!!,存放B树的数组,哈哈哈哈哈哈。
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhfieegg
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
photoshop蒙版画笔没反应怎么办
PHP中文网 06-24