哈希表

简介:    来源:http://www.cnblogs.com/JCSU/articles/2028813.html   /****************************************************************************...

 

 

 来源: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 
* =  ChainHash[i] -> next;
            
while  (p)
            {
                printf(
"  %d  " , p -> data.key); p  =  p -> next;
            }
        }
        printf(
" \n " );
    }
}
复制代码

 

 

【参考】

 

img_e00999465d1c2c1b02df587a3ec9c13d.jpg
微信公众号: 猿人谷
如果您认为阅读这篇博客让您有些收获,不妨点击一下右下角的【推荐】
如果您希望与我交流互动,欢迎关注微信公众号
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接。

目录
相关文章
|
4月前
|
存储 算法 Java
【算法系列篇】哈希表
【算法系列篇】哈希表
|
1月前
|
存储 算法 Java
算法系列--哈希表
算法系列--哈希表
15 0
|
7月前
|
存储 算法 Serverless
|
4月前
|
存储 Serverless
哈希及哈希表的实现
哈希及哈希表的实现
31 0
|
10月前
|
存储 缓存 算法
趣味算法——探索哈希表的神秘世界
前言: 在编程世界中,数据存储和检索的效率常常是我们关注的重点。对于这个问题,哈希表提供了一个既高效又实用的解决方案。哈希表是一种通过哈希函数将键转化为数组索引,以实现快速查找的数据结构。在大多数情况下,哈希表能够在常数时间内完成查找,插入和删除操作,因此在许多应用场景中得到了广泛使用。
48 0
|
11月前
|
存储 算法 Java
哈希表(散列表)详解
什么是哈希表,以及如何使用哈希表
|
11月前
|
存储 算法 JavaScript
关于散列表(哈希表)我所知道的
关于散列表(哈希表)我所知道的
45 0
|
存储 Java Serverless
哈希表以及哈希冲突
哈希表以及哈希冲突
98 0
哈希表以及哈希冲突
|
存储 算法 C++
C++:哈希:闭散列哈希表
讲解了哈希的概念以及哈希函数,简单实现了闭散列哈希。闭散列哈希的重点之一是取模操作。
C++:哈希:闭散列哈希表
哈希表
哈希表简单操作