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


相关推荐

  • pycharm2022 2.3激活_在线激活2022.01.20

    (pycharm2022 2.3激活)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~IntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,下面是详细链接哦~https://javaforall.net/100143.html0H…

    2022年3月31日
  • Ubuntu 搭建opengrok 流程

    Ubuntu 搭建opengrok 流程opengrok平台搭建流程软件下载链接:https://pan.baidu.com/s/1kCeXNlj2l3FujyMza3rM0w提取码:iniy搭建前的准备电脑系统电脑系统推荐使用ubuntu16,这版系统较为稳定。细节未更新python环境推荐使用python2.7及以上版本,这一版本相对稳定,python安装细节未更新java环境推荐使用JDK1.8及以上版本,具体安装细节未更新通过java-version和javac-version可以查看版本。Ope

    2022年5月27日
  • pycharm安装模块方法

    pycharm安装模块方法一.打开pycharm二.点开file三.点击Settings,点击ProjectInterpreter,选择右上角+四.进入后,在搜索框搜索需要安装的模块,选中安装击ProjectInterpreter转载于:https://www.cnblogs.com/jinxf/p/9160645.html…

    2022年8月28日
  • 进程调度算法;先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法「建议收藏」

    进程调度算法;先来先服务调度算法、短作业优先调度算法、时间片轮转调度算法「建议收藏」一、实验目的和要求1.了解进程调度算法的特点2.掌握进程调度算法,如先来先服务调度算法(firstcomefirstserved,FCFS)、短作业优先调度算法(shotjobfirst,SJF)、时间片轮转调度算法。二、实验内容设计模拟实现FCFS、SJF、时间片轮转调度算法的C语言程序1.FCFS算法:按照作业/进程进入队列的先后顺序进行挑选,先进入的将先进行…

    2022年9月29日
  • Python学习–02输入和输出、运算符

    Python学习–02输入和输出、运算符

    2022年2月23日
  • Bilateral Filters(双边滤波算法)原理及实现

    Bilateral Filters(双边滤波算法)原理及实现双边滤波算法原理:双边滤波算法实现:双边滤波算法实例:参考:http://people.csail.mit.edu/sparis/bf/http://blog.csdn.net/fightingforcv/article/details/52723376http://blog.csdn.net/mumu

    2022年5月2日

发表回复

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

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