哈希表
来源:http://www.cnblogs.com/JCSU/articles/2028813.html
/*******************************************************************************
/* <PRE>
/* 版权所有 : -
/* 模块名 : 查找
/* 文件名 : hash.cpp
/* 功能描述 : 哈希表
/* 作者 : <xxx>
/* 版本 : 1.0
/* -----------------------------------------------------------------------------
/* 备注 : 用链地址法解决冲突
/* -----------------------------------------------------------------------------
/* 修改记录 :
/* 日 期 版本 修改人 修改内容
/* 2011/01/01 1.0 <xxx> 创建
/* </PRE>
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
/******************************************************************************
/* 数据类型和常量定义
/******************************************************************************/
#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1
typedef int Status;
typedef int KeyType;
#define EQ(a, b) ((a) == (b))
#define LT(a, b) ((a) < (b))
#define MAXSIZE 13 /* Hash表长 */
#define HASH(key) (key % MAXSIZE) /* Hash函数 */
/******************************************************************************
/* 数据结构定义
/******************************************************************************/
typedef struct {
KeyType key;
}ElemType;
/* 链结点 */
typedef struct ChainNode {
ElemType data;
ChainNode *next;
} ChainNode, *Chain;
Chain ChainHash[MAXSIZE] = { NULL };
/******************************************************************************
/* 函数原型声明
/******************************************************************************/
Status SearchHash(Chain ChainHash[], KeyType key, Chain &p);
Status InsertHash(Chain ChainHash[], ElemType e);
/*******************************************************************************
/* <FUNC>
/* 函数名 : SearchHash
/* 功能 : 查找Hash表
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status SearchHash(Chain ChainHash[], KeyType key, Chain &p)
{
ChainNode *tmp; p = ChainHash[HASH(key)];
if (!p) return UNSUCCESS;
tmp = p->next; p = tmp;
while (p && !EQ(key, p->data.key)) {
tmp = p;
p = p->next;
}
if (!p) {
p = tmp; return UNSUCCESS;
}
else return SUCCESS;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : InsertHash
/* 功能 : 插入元素到Hash表
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status InsertHash(Chain ChainHash[], ElemType e)
{
Chain p, q, r, pre;
if (SearchHash(ChainHash, e.key, p)) return DUPLICATE;
else {
q = (Chain)malloc(sizeof(ChainNode)); q->data = e; q->next = NULL;
if (!p) {
r = (Chain)malloc(sizeof(ChainNode));
r->data.key = 1;
r->next = q;
ChainHash[HASH(e.key)] = r;
}
else {
r = ChainHash[HASH(e.key)]; ++(r->data.key);
p = r->next; pre = r;
while (p && LT(p->data.key, e.key)) {
pre = p; p = p->next;
}
q->next = pre->next;
pre->next = q;
}
}
return SUCCESS;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : main
/* 功能 : 测试函数
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
void main()
{
char *rslt[3] = {
"duplicated!",
"unsuccess!",
"insert succeed!"
};
//插入数据到Hash表
ElemType e;
printf("\nInserting process: \n---------------------------------------------\n");
e.key = 19; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 19; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 14; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 23; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 01; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 68; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 20; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 84; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 27; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 55; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 11; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 10; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 79; printf("%d %s \n\n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
//输出Hash表
printf("Hash Table: \n---------------------------------------------\n");
for (int i = 0; i < MAXSIZE; i++) {
if (!ChainHash[i]) printf("index: %2d, elem_count (%2d )", i, 0);
else {
printf("index: %2d, elem_count (%2d ) ->", i, ChainHash[i]->data.key);
ChainNode *p = ChainHash[i]->next;
while (p)
{
printf(" %d ", p->data.key); p = p->next;
}
}
printf("\n");
}
}
/* <PRE>
/* 版权所有 : -
/* 模块名 : 查找
/* 文件名 : hash.cpp
/* 功能描述 : 哈希表
/* 作者 : <xxx>
/* 版本 : 1.0
/* -----------------------------------------------------------------------------
/* 备注 : 用链地址法解决冲突
/* -----------------------------------------------------------------------------
/* 修改记录 :
/* 日 期 版本 修改人 修改内容
/* 2011/01/01 1.0 <xxx> 创建
/* </PRE>
*******************************************************************************/
#include <stdio.h>
#include <stdlib.h>
/******************************************************************************
/* 数据类型和常量定义
/******************************************************************************/
#define SUCCESS 1
#define UNSUCCESS 0
#define DUPLICATE -1
typedef int Status;
typedef int KeyType;
#define EQ(a, b) ((a) == (b))
#define LT(a, b) ((a) < (b))
#define MAXSIZE 13 /* Hash表长 */
#define HASH(key) (key % MAXSIZE) /* Hash函数 */
/******************************************************************************
/* 数据结构定义
/******************************************************************************/
typedef struct {
KeyType key;
}ElemType;
/* 链结点 */
typedef struct ChainNode {
ElemType data;
ChainNode *next;
} ChainNode, *Chain;
Chain ChainHash[MAXSIZE] = { NULL };
/******************************************************************************
/* 函数原型声明
/******************************************************************************/
Status SearchHash(Chain ChainHash[], KeyType key, Chain &p);
Status InsertHash(Chain ChainHash[], ElemType e);
/*******************************************************************************
/* <FUNC>
/* 函数名 : SearchHash
/* 功能 : 查找Hash表
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status SearchHash(Chain ChainHash[], KeyType key, Chain &p)
{
ChainNode *tmp; p = ChainHash[HASH(key)];
if (!p) return UNSUCCESS;
tmp = p->next; p = tmp;
while (p && !EQ(key, p->data.key)) {
tmp = p;
p = p->next;
}
if (!p) {
p = tmp; return UNSUCCESS;
}
else return SUCCESS;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : InsertHash
/* 功能 : 插入元素到Hash表
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
Status InsertHash(Chain ChainHash[], ElemType e)
{
Chain p, q, r, pre;
if (SearchHash(ChainHash, e.key, p)) return DUPLICATE;
else {
q = (Chain)malloc(sizeof(ChainNode)); q->data = e; q->next = NULL;
if (!p) {
r = (Chain)malloc(sizeof(ChainNode));
r->data.key = 1;
r->next = q;
ChainHash[HASH(e.key)] = r;
}
else {
r = ChainHash[HASH(e.key)]; ++(r->data.key);
p = r->next; pre = r;
while (p && LT(p->data.key, e.key)) {
pre = p; p = p->next;
}
q->next = pre->next;
pre->next = q;
}
}
return SUCCESS;
}
/*******************************************************************************
/* <FUNC>
/* 函数名 : main
/* 功能 : 测试函数
/* 参数 : -
/* 返回值 : -
/* 备注 : -
/* 作者 : <xxx>
/* </FUNC>
*******************************************************************************/
void main()
{
char *rslt[3] = {
"duplicated!",
"unsuccess!",
"insert succeed!"
};
//插入数据到Hash表
ElemType e;
printf("\nInserting process: \n---------------------------------------------\n");
e.key = 19; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 19; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 14; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 23; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 01; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 68; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 20; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 84; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 27; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 55; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 11; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 10; printf("%d %s \n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
e.key = 79; printf("%d %s \n\n", e.key, rslt[InsertHash(ChainHash, e) + 1]);
//输出Hash表
printf("Hash Table: \n---------------------------------------------\n");
for (int i = 0; i < MAXSIZE; i++) {
if (!ChainHash[i]) printf("index: %2d, elem_count (%2d )", i, 0);
else {
printf("index: %2d, elem_count (%2d ) ->", i, ChainHash[i]->data.key);
ChainNode *p = ChainHash[i]->next;
while (p)
{
printf(" %d ", p->data.key); p = p->next;
}
}
printf("\n");
}
}
【参考】
微信公众号:
猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。