哈希表

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

相关文章
|
7月前
|
监控 JavaScript 前端开发
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
MutationObserver 是一个非常强大的 API,提供了一种高效、灵活的方式来监听和响应 DOM 变化。它解决了传统 DOM 事件监听器的诸多局限性,通过异步、批量的方式处理 DOM 变化,大大提高了性能和效率。在实际开发中,合理使用 MutationObserver 可以帮助我们更好地控制 DOM 操作,提高代码的健壮性和可维护性。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
MutationObserver详解+案例——深入理解 JavaScript 中的 MutationObserver:原理与实战案例
|
关系型数据库 数据库 PostgreSQL
【docker-compose】一键安装PostgreSQL数据库
【docker-compose】一键安装PostgreSQL数据库
5309 0
【docker-compose】一键安装PostgreSQL数据库
|
机器学习/深度学习 存储 算法
YOLOv5的Tricks | 【Trick7】指数移动平均(Exponential Moving Average,EMA)
这篇博客主要用于整理网上对EMA(指数移动平均)的介绍,在yolov5代码中也使用了这个技巧,现对其进行归纳。
2288 1
YOLOv5的Tricks | 【Trick7】指数移动平均(Exponential Moving Average,EMA)
|
Java 应用服务中间件 Linux
Tomcat安装之前为什么要安装JDK
Tomcat安装之前为什么要安装JDK
397 0
|
2天前
|
弹性计算 人工智能 安全
云上十五年——「弹性计算十五周年」系列客户故事(第二期)
阿里云弹性计算十五年深耕,以第九代ECS g9i实例引领算力革新。携手海尔三翼鸟、小鹏汽车、微帧科技等企业,实现性能跃升与成本优化,赋能AI、物联网、智能驾驶等前沿场景,共绘云端增长新图景。
|
8天前
|
存储 弹性计算 人工智能
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
2025年9月24日,阿里云弹性计算团队多位产品、技术专家及服务器团队技术专家共同在【2025云栖大会】现场带来了《通用计算产品发布与行业实践》的专场论坛,本论坛聚焦弹性计算多款通用算力产品发布。同时,ECS云服务器安全能力、资源售卖模式、计算AI助手等用户体验关键环节也宣布升级,让用云更简单、更智能。海尔三翼鸟云服务负责人刘建锋先生作为特邀嘉宾,莅临现场分享了关于阿里云ECS g9i推动AIoT平台的场景落地实践。
【2025云栖精华内容】 打造持续领先,全球覆盖的澎湃算力底座——通用计算产品发布与行业实践专场回顾
|
7天前
|
人工智能 自然语言处理 自动驾驶
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
关于举办首届全国大学生“启真问智”人工智能模型&智能体大赛决赛的通知
|
7天前
|
云安全 人工智能 自然语言处理
阿里云x硅基流动:AI安全护栏助力构建可信模型生态
阿里云AI安全护栏:大模型的“智能过滤系统”。