您的位置:首页 > 理论基础 > 数据结构算法

数据结构与算法分析之哈希表(HashTable,又称散列表)--代码篇

2017-08-03 17:49 288 查看
本篇文章是继上一篇对于哈希表理论的介绍,进行一个代码上的书写工整,可以加深对哈希表的理解,本段代码主要分为以下几个部分:

1、哈希表的结构

2、哈希表的建立

3、哈希函数

4、哈希表插入元素

5、哈希表的查找元素

代码如下:

//头文件,后面申请空间需要用到的
#include "stdafx.h"
#include <stdlib.h>

//宏定义,不能有分号
#define HASHSIZEE 12
#define InitKey 32768

//哈希表的结构体
typedef struct HashTable
{
int* elem;//表示键值
int count;//表示元素个数
}

//哈希表的建立
int InitHashTable(HashTable *H)
{
H->count=HASHSIZE;
//给元素申请数组空间
H->elem=(int*)malloc(HASHSIZE*sizeof(int));
//因为有返回值,所以需要考虑失败情况
if(!H->elem)
{
return -1;
}
//初始化每个元素
for(int i=0;i<HASHSIZE;i++)
{
H->elem[i]=InitKey;
}
return 0;
}

//哈希函数--本案例使用除留余数法
int Hash(int key)
{
return key%HASHSIZE;
}

//哈希表数据的插入
void InsertHash (HashTable *H ,int key)
{
int* addr;
*addr=Hash(key);
//注意散列冲突的处理--开放定址法的线性探测
while(H->elem[*addr]!= key)
{
*addr==(*addr+1)%HASHSIZE;
}
H->elem[addr]=key;
}

//哈希表的查找操作
int SearchHash(HashTable H ,int key)
{
int* addr;
*addr=Hash(key);
while(H->elem[*addr]!=key)
{
*addr=(*addr+1)%HASHSIZE;
//查找中发现下个是空值或两个地址上的键值相同,跳出循环
if(H->elem[*addr]=InitKey|| *addr=Hash(key))
return -1;
}
return *addr;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  数据结构