数据结构之哈希表(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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 分析ICMP报文「建议收藏」

    分析ICMP报文「建议收藏」目录捕获准备:ICMP的相关知识:报文分析:捕获准备:启动wireshark录制数据包,打开命令行窗口输入pingwww.sina.com.cn。Wireshark已记录下报文,在过滤器输入ip.addr==120.192.83.125过滤报文。ICMP的相关知识:ICMP是(InternetControlMessage…

    2022年4月29日
    101
  • npm卸载安装

    npm卸载安装npm安装卸载命令利用npm安装xxx模块到当前命令行所在目录:npminstallxxx利用npm安装全局模块xxx:npminstall-gxxx安装但不写入package.json:npminstallxxx安装并写入package.json的”dependencies”中:npminstallxxx–save安装并写入package.json的”d…

    2025年7月27日
    3
  • 内点法[通俗易懂]

    内点法[通俗易懂]内点法属于约束优化算法。约束优化算法的基本思想是:通过引入效用函数的方法将约束优化问题转换成无约束问题,再利用优化迭代过程不断地更新效用函数,以使得算法收敛。内点法(罚函数法的一种)的主要思想是:

    2022年8月4日
    6
  • django models.py(python和django)

    本人java10年开发经验,现就职于电信,因工作需要学习python,记录自己的学习记录。后面也会持续分享真实工作经验,及项目。欢迎大家互关,一起学习!!文章有不严谨的地方请指出1.创建模型类打开pay应用的models.py创建模型类fromdatetimeimportdatetimefromdjango.dbimportmodels#Createyourmodelshere.#创建品牌的模型类classBrand(models.Model):#创建字段

    2022年4月13日
    55
  • CefSharp中文帮助文档「建议收藏」

    CefSharp中文帮助文档「建议收藏」CefSharp是围绕Chromium嵌入式框架(ChromiumEmbeddedFramework,CEF)的简单.Net包装器。CEF是一个基于GoogleChromium项目的开源项目。与Chromium项目本身(主要专注于GoogleChrome应用程序开发)不同,CEF专注于促进第三方应用程序中的嵌入式浏览器用例。CEF基于多进程ChromiumContentAPI,因此,当前仅存在Chromium的部分功能。例如,对扩展的支持是有限的,仅实现了一部分ExtensionAPI。..

    2022年9月19日
    4
  • 区块链–Arbitrum Rollup(Layer2)

    区块链–Arbitrum Rollup(Layer2)Arbitrum是OffchainLabs团队开发的以太坊Layer2层扩容方案,可以实现高吞吐量,让开发者以低成本部署、运营智能合约,同时可以保持无需信任的安全性总结:Rollup的主要特点是所有交易数据都记录在链上,也就是说,Arbitrum把关乎安全的部分放在以太坊链上,将实际计算和存储放在链下执行。

    2022年5月11日
    42

发表回复

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

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