数据结构之哈希表(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;
}

 

 

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)
blank

相关推荐

  • eclipse中svn_git打补丁解决冲突

    eclipse中svn_git打补丁解决冲突1.为什么会出现冲突&lt;1&gt;两个开发人员,Harry和Sally,分别从服务器端下载了文件A。&lt;2&gt;Harry修改之后,A变成了A’,Sally修改之后,A变成了A”。&lt;3&gt;Harry先一步提交,使服务器端文件的版本也变成了A’&lt;4&gt;Sally本地的文件A”已经过时了,此时她已无法提交文件,服务器会要求她先进行一次更新操作。&lt;…

    2022年10月14日
  • 三角不等式_三角函数基本不等式公式

    三角不等式_三角函数基本不等式公式1.关于三角形边的不等式关于三角形有一个常用的不等式,以下面的三角形为例:$$a+b>c\\a+c>b\\b+c>a$$上面的三个不等式很容易理解

  • 【翻译】.NET 5中的性能改进

    【翻译】.NET 5中的性能改进在.NETCore之前的版本中,其实已经在博客中介绍了在该版本中发现的重大性能改进。从.NETCore2.0到.NETCore2.1到.NETCore3.0的每一篇文章,发…

  • information_schema.schemata_information theory

    information_schema.schemata_information theory1.INFORMATION_SCHEMA简介INFORMATION_SCHEMA提供对数据库元数据的访问,有关MySQL服务器信息,例如数据库或表的名称,列的数据类型或访问权限。INFORMATION_SCHEMA使用说明字符集注意事项INFORMATION_SCHEMA作为SHOW语句的替代INFORMATION_SCHEMA和特权性能注意事项1.1INFOR…

  • Android uvc_文明6行星探索

    Android uvc_文明6行星探索文章选取android下linux-3.10作为分析对象,具体的UVC初始化过程可以参考csdn大神写的博客,地址是:http://blog.csdn.net/orz415678659。uvc加载摄像头的过程无非是初始化设备,加载设备,获取设备相关参数并加载相关参数到buffer,此时就已经将视频和控制参数加载到buffer了,这篇文章主要关注的是控制相关的参数。需要关注的两个核心文件是:…

    2022年10月30日
  • navicat for mysql注册码激活_navicat注册激活

    navicat for mysql注册码激活_navicat注册激活打开navicatformysql接着打开帮助,选中注册,把下面的复制上去就可以了NAVH-WK6A-DMVK-DKW3 

    2022年10月10日

发表回复

您的电子邮箱地址不会被公开。

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