[置顶] Hash查找,散列查找
//Hash.h #ifndef HASH_H
#define HASH_H
#define HASH_ARR_SIZE 100
#define FILL -1 #include <stdlib.h>
#include <stdio.h>
#include <string.h> struct _Node
{
int iFill;
int iValue;
struct _Node* pNext;
}; typedef _Node Node; typedef struct
{
Node* pHashArr;
int iArrSize;
int iSize;
}Hash; #endif
//Hash.c #include "Hash.h" Hash* CreateHashArr()
{
Hash* pHash = (Hash*)malloc( sizeof( Hash ) ); if( !pHash )
return NULL; pHash->iArrSize = HASH_ARR_SIZE;
pHash->iSize = 0;
pHash->pHashArr = (Node*)malloc( sizeof( Node ) * HASH_ARR_SIZE ); memset( pHash->pHashArr, 0, sizeof( Node ) * HASH_ARR_SIZE ); if( !pHash->pHashArr )
return NULL; return pHash;
} int GetIndex( int iValue )
{
return iValue % HASH_ARR_SIZE;
} Node* CreateNode( int iValue )
{
Node* pNode = (Node*)malloc( sizeof( Node ) ); if( !pNode )
return NULL; pNode->iValue = iValue;
pNode->pNext = NULL;
pNode->iFill = FILL; return pNode;
} int DoHash( Hash* pHash, int iValue )
{
if( !pHash )
return -1; int iIndex = GetIndex( iValue ); if( (pHash->pHashArr + iIndex)->iFill != FILL )
{
(pHash->pHashArr + iIndex)->iFill = FILL;
(pHash->pHashArr + iIndex)->iValue = iValue;
(pHash->pHashArr + iIndex)->pNext = NULL; pHash->iSize++;
}
else
{//collison
Node* pNode = (pHash->pHashArr + iIndex)->pNext; if( !pNode )
{
(pHash->pHashArr + iIndex)->pNext = CreateNode( iValue ); return 0;
} Node* pPrior = pNode; while( pNode )
{
pPrior = pNode;
pNode = pNode->pNext;
} pNode = CreateNode( iValue ); if( !pNode )
return -1; pPrior->pNext = pNode;
pHash->iSize++;
} return 0;
} Node* HashSearch( Hash* pHash, int iValue )
{
if( 0 == pHash->iSize )
return NULL; int iIndex = GetIndex( iValue ); if( (pHash->pHashArr + iIndex)->iFill != FILL )
return NULL;
else
{
if( (pHash->pHashArr + iIndex)->iValue == iValue )
return pHash->pHashArr + iIndex; Node* pNode = (pHash->pHashArr + iIndex)->pNext;
Node* pPrior = pNode; while( pNode && pPrior->iValue != iValue )
{
pPrior = pNode;
pNode = pNode->pNext;
} if( pNode->iValue == iValue )
return pNode; } return NULL;
} void PrintNode( Node* pNode )
{
if( pNode )
printf( "%d ", pNode->iValue );
} int main( int argc, char* argv[] )
{
Hash* pHash = CreateHashArr(); if( !pHash )
return -1; DoHash( pHash, 1 );
DoHash( pHash, 300 );
DoHash( pHash, 22 );
DoHash( pHash, 11 );
DoHash( pHash, 99 );
DoHash( pHash, 28 );
DoHash( pHash, 36 );
DoHash( pHash, 23 );
DoHash( pHash, 55 );
DoHash( pHash, 3 );
DoHash( pHash, 7 );
DoHash( pHash, 101 ); PrintNode( HashSearch( pHash, 1 ) );
PrintNode( HashSearch( pHash, 101 )); return 0;
}
[置顶] Hash查找,散列查找的更多相关文章
- 散列查找的C实现
概念 散列查找,类似与查英文字典的过程.如果我们要查找"zoo"(key)对应的释义(value),我们不会从第一页开始逐页查找(顺序查找),而是直接根据大致的推算(Hash函数) ...
- hash算法散列算法
Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是 ...
- 哈希--Hash,“散列”/“哈希”
哈希 Hash,翻译“散列”,音译为“哈希”,把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是散列值的空间通常远小于输入的空间,不同的输入可能会散 ...
- Hash开散列 拉链法
#include<iostream> #include<cstdio> using namespace std; const int maxn=1000007; struct ...
- 【知识强化】第六章 查找 6.4 散列(Hash)表
本节课我们来学习一种新的查找方式叫做散列查找.什么是散列查找呢?在学习散列查找之前,一定要介绍一个基本概念就是散列表.那么学习散列表之前我们先来回忆一下之前所学习过的所有查找方式,那么无论是顺序查找还 ...
- 数据结构(四十二)散列表查找(Hash Table)
一.散列表查找的基础知识 1.散列表查找的定义 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key).查找时,根据这个确定的对应关系找到 ...
- 数据结构---散列表查找(哈希表)概述和简单实现(Java)
散列表查找定义 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,是的每个关键字key对应一个存储位置f(key).查找时,根据这个确定的对应关系找到给定值的key的对应f(key) ...
- 密码学之Hash散列
一.简介 hash(散列.杂凑)函数,是将任意长度的数据映射到有限长度的域上. 直观解释起来,就是对一串数据m进行杂糅,输出另一段固定长度的数据h,作为这段数据的特征(指纹).也就是说,无论数据块m有 ...
- 散列之HashTable学习
1,什么是散列? 举个例子,在日常生活中,你将日常用品都放在固定的位置,当你下次需要该东西时,直接去该地方取它.这个过程就相当于散列查找. 若将它们随意杂乱无章地存放,当需要某件东西时,只能一个地方一 ...
随机推荐
- 各浏览器对 onbeforeunload 事件的支持与触发条件实现有差异
转载:http://www.w3help.org/zh-cn/causes/BX2047 标准参考 无. 问题描述 一般情况下,onbeforeunload 事件处理函数内会写入一些提示性语句,当用户 ...
- sql plus 和 pl/sql无法连接远程oracle数据库
前言:安装完oracle客户端后,可能会出现sql plus 和 pl/sql无法连接远程oracle数据库的情况,可能是以下原因: 针对sql plus连接不上: 1 可能原因:之前安装过oracl ...
- iPhone真机测试Crash信息分析
一.获取Crash Log的方式 在iOS开发过程,当应用已经打包,iPhone设备通过ipa的包安装应用后,在使用过程发现crash,那么如何获取crash日志呢,现提供如下四种获取crash日志的 ...
- thinkphp excel txt文件上传实现
<?php/************************************************************************************** *** ...
- linux内核学习之二:编译内核
在linux内核学习系列的第一课中讲述了搭建学习环境的过程(http://www.cnblogs.com/xiongyuanxiong/p/3523306.html),环境搭好后,马上就进入到下一环节 ...
- ionic list item-radio checked
<div class="list"> <label class="item item-radio" ng-repeat="k in ...
- Markdown和reStructuredText语法比较
reStructuredText在线编辑器 http://rst.ninjs.org/ ReST是Docutils的标记语法,Docutils是Python世界的文档工具集.也因为这样ReST在Pyt ...
- FFT多项式乘法加速
FFT基本操作...讲解请自己看大学信号转置系列... 15-5-30更新:改成结构体的,跪烂王学长啊啊啊啊机智的static... #include<iostream> #include ...
- 【最大流】XMU 1595 机器调度
题目链接: http://acm.xmu.edu.cn/JudgeOnline/problem.php?id=1595 题目大意: T组数据,n个任务,m个机器,对于每个任务:有一个处理时间p(表示这 ...
- SharePoint Server 2010安装图解
SharePoint Server 2010作为MOSS 2007的升级版本,自从2009年底发布Beta版本以来就备受关注,网络上已经出现了很多相关的文章,其中也不乏中文的信息. 最近SharePo ...