数据结构之哈希表(hash)代码

哈希的关键在于算法,呵呵,我这算法,不说了,见笑了。哈希在内核中用得非常之广,准确来说是链表,下面是一个相对简单的例子,希望能对大家理解hash有些帮助。/************************************************************************************************************** **文

大家好,又见面了,我是你们的朋友全栈君。

   哈希的关键在于算法,呵呵,我这算法,不说了,见笑了快哭了。哈希在内核中用得非常之广,准确来说是链表,下面是一个相对简单的例子,希望能对大家理解hash有些帮助。

/**************************************************************************************************************
 **文件:hash.c
 **编写者:huangminqiang
 **编写日期:2010年2月8号
 **简要描述:
 **修改者:
 **修改日期:
 **注:主要在于查找,算法也比较简单、单一。
 **************************************************************************************************************/
#include <stdio.h>
#include <malloc.h>

//测试数据
static int s_data[] = {4, 3, 2, 5, 1004};

#define MAX_HASH 100
#define HASH_GEN 1000//hash因子

typedef struct _node
{

 int elm;
 struct _node *next;
}node_t;

//HASH表数据结构
typedef struct 
{

 node_t *hash[MAX_HASH];
 int count;
}hash_t;

//定义一个HASH表,用于保存测试数据
static hash_t s_hash;

//HASH函数定义
int hash_code(int data)
{

 int index = 0;
 
 //取余法
 index = data % HASH_GEN; 
 
 return index;
}

//将元素插入HASH表
int insert_hash(hash_t *phash, int data)
{

 int index = 0;
 node_t *pnode = NULL;
 node_t *phead = NULL;

 //通过HASH函数计算表索引
 index = hash_code(data);

 //将data存入index位置链表的链表头
 {

  //为data新建节点
  pnode = (node_t*)malloc(sizeof(node_t));
  pnode->elm = data;
  pnode->next = NULL;

  //取得index位置链表头
  //phead = phash->hash[index];

  if (NULL == phash->hash[index])
  {

   //phead = pnode;
   phash->hash[index] = pnode;
  }
  else
  {

   pnode->next = phash->hash[index];
   phash->hash[index] = pnode;
  }
 } 

 //更新index位置值
 //phash->hash[index] = phead;

 phash->count++;

 return 0;
}

//从HASH表查找元素
int search_hash(hash_t *phash, int data)
{

 int index = 0;
 int elm = 0;
 node_t *phead = NULL;

 //通过HASH函数计算表索引
 index = hash_code(data);

 //取得链表头
 phead = phash->hash[index];

 //从链表phead中查找data
 {

  while(1)
  {

   if (NULL == phead)
   {

    return -1;
   }

   if (phead->elm == data)
   {

    return phead->elm;
   }
   else
   {

    phead = phead->next;
   }
  }
 }

 return elm;
}

int main (void)
{

 int i = 0;

 //将元素插入HASH表
 for (i = 0; i < sizeof(s_data)/sizeof(s_data[0]); i++)
  insert_hash(&s_hash, s_data[i]);

 //在HASH表中查询元素
 {

  int data = 4;
  int ret = 0;

  ret = search_hash(&s_hash, data);
 }
 return 0;
}

 

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126943.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • html格式转换word_html嵌入word

    html格式转换word_html嵌入word1基于wps直接将页面信息下载成word文档1publicvoidtest()2{34WPS.Applicationwps=null;5try6{7…

    2022年8月6日
    3
  • JAVA设计模式之代理模式

    【代理模式应用场景举例】比如在玩“极品飞车”这款游戏,如果游戏者手中的金钱达到了一定的数量就可以到车店买一部性能更高的赛车,那么这个卖车的“车店”就是一个典型的“汽车厂家”的“代理”,他为汽车厂家“提供卖车的服务”给有需求的人士。从面向对象的方面考虑,“销售汽车的代理”也是一个对象,那么这个对象也具有一定的状态,在软件项目中这个对象也具有管理财务进销存的基本功能,那么在设计时就要以面向OOP编

    2022年3月11日
    36
  • 拉格朗日乘数法求得的是最值还是极值_微观经济拉格朗日方程求极值

    拉格朗日乘数法求得的是最值还是极值_微观经济拉格朗日方程求极值一、拉格朗日乘数法简介在日常的生产生活中,当我们要要安排生产生活计划的时候,常常会在现实物理资源约束的条件下,计算得到收益最大或者损失最小的计划;像这种对自变量有附加条件的极值称为条件极值;拉格朗日乘数法是一种直接计算解决条件极值的方法;拉格朗日乘数法的定义如下:设有f(x,y),φ(x,y)f(x,y),\varphi(x,y)f(x,y),φ(x,y)两个函数,并且两者都有一阶连续偏导数,则做拉格朗日函数为F(x,y,λ)=f(x,y)+λφ(x,y)F(x,y,\lambda)

    2025年5月23日
    3
  • C# 解析 sln 文件

    C# 解析 sln 文件我的项目,编码工具需要检测打开一个工程,获取所有项目。但是发现原来的方法,如果存在文件夹,把项目放在文件夹中,那么是无法获得项目,于是我就找了一个方法去获得sln文件的所有项目。

    2022年4月28日
    40
  • vue生成二维码并保存图片_vue实现扫描二维码

    vue生成二维码并保存图片_vue实现扫描二维码一、生成简单的二维码(不带图片)1.引入插件npminstallqrcode–save2.页面中使用<divid=”qrcode”class=”erweima”></div>页面中引入importQRCodefrom”qrcodejs2″;methods:{qrcode(){this.$nextTick(()=>{letqrcode=newQRCode(“qrcode”,{

    2022年10月3日
    4
  • 锋利的jQuery系列<一>[通俗易懂]

    锋利的jQuery系列<一>[通俗易懂]1.简介jQuery是继Prototype之后又一个优秀的JavaScript库,是一个由JohnResig创建于06年1月的开源项目。现在的jQuery主要包括核心库、UI、插件和jQueryMobile这几大模块。2.配置jQuery环境进入jQuery的官网,下载最新的jQuery库文件。jQuery环境配置:jQuery不需要安装,把下载的jquery.js放到网站的一个公共的位

    2025年5月27日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号