[置顶] 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,什么是散列? 举个例子,在日常生活中,你将日常用品都放在固定的位置,当你下次需要该东西时,直接去该地方取它.这个过程就相当于散列查找. 若将它们随意杂乱无章地存放,当需要某件东西时,只能一个地方一 ...
随机推荐
- dede织梦后台页面及功能修改及精简操作方法
先让我们来看看都有哪些页面控制着后台的功能和显示.下方为系统默认的后台界面图,为了便于下面的说明我对各个部分进行了一些标示.共A.B.C.D.E五个区域. 常用:A区域[顶部LOGO行]对应文件:/d ...
- ios 中的UI控件学习总结(1)
UIKit框架提供了非常多功能强大又易用的UI控件 下面列举一些在开发中可能用得上的UI控件 UIButton 按钮 UILabel 文本标签 UITextField 文本输入框 UIImageVie ...
- CoreLocation+MapKit系统定位(含坐标以及详细地址)
iOS8 之后出现一些新的配置 [self.manager requestWhenInUseAuthorization]; 并且在info.plist文件中增加 NSLocationWhenInUse ...
- Java基础--多线程的方方面面
1,什么是线程?线程和进程的区别是什么? 2,什么是多线程?为什么设计多线程? 3,Java种多线程的实现方式是什么?有什么区别? 4,线程的状态控制有哪些方法? 5,线程安全.死锁和生产者--消费者 ...
- Shell 脚本编程笔记(一) Hello Shell
最近不断在接触Linux操作系统,对它一个终端走天下的特性感到十分新奇和伟大.同时也被各种命令折磨的死去活来...公司的一个老同事给我讲,在公司的极品geek宅都是只用一个黑黑的框完成一切的.结果我一 ...
- c/c++内存机制(一)(转)
转自:http://www.cnblogs.com/ComputerG/archive/2012/02/01/2334898.html 一:C语言中的内存机制 在C语言中,内存主要分为如下5个存储区: ...
- 解决jQuery插件sliderjs, 点击插件分页,导航按钮后不能重新开始.
jQuery SlidesJS - Can't restart animation after clicking on navigation or pagination <!DOCTYPE ht ...
- SCXML和QScxml使用总结
最近接触了SCXML这个状态描述文本,简单来讲就是描述了整个状态的变迁过程的一种XML格式的表格.Qt labs中有一个项目就是QScxml,它基于QStateMachine上层制作,可以直接读取SC ...
- Asp.net MVC 与 Asp.net Web API 区别
Asp.Net Web API VS Asp.Net MVC 1.Asp.net MVC 是用来创建返回视图(Views)与数据的Web应用,而Asp.net Web API是一种简单轻松地成熟的HT ...
- JSON基础知识总结
JSON基础 一.JSON简介 JSON,全称“JavaScript Object Notation(JavaScript对象表示法)”,起源于JavaScript的对象和数组.JSON,说白了就是J ...