//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查找,散列查找的更多相关文章

  1. 散列查找的C实现

    概念 散列查找,类似与查英文字典的过程.如果我们要查找"zoo"(key)对应的释义(value),我们不会从第一页开始逐页查找(顺序查找),而是直接根据大致的推算(Hash函数) ...

  2. hash算法散列算法

    Hash,一般翻译做“散列”,也有直接音译为“哈希”的,就是把任意长度的输入(又叫做预映射, pre-image),通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是 ...

  3. 哈希--Hash,“散列”/“哈希”

    哈希 Hash,翻译“散列”,音译为“哈希”,把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值.这种转换是一种压缩映射,也就是散列值的空间通常远小于输入的空间,不同的输入可能会散 ...

  4. Hash开散列 拉链法

    #include<iostream> #include<cstdio> using namespace std; const int maxn=1000007; struct ...

  5. 【知识强化】第六章 查找 6.4 散列(Hash)表

    本节课我们来学习一种新的查找方式叫做散列查找.什么是散列查找呢?在学习散列查找之前,一定要介绍一个基本概念就是散列表.那么学习散列表之前我们先来回忆一下之前所学习过的所有查找方式,那么无论是顺序查找还 ...

  6. 数据结构(四十二)散列表查找(Hash Table)

    一.散列表查找的基础知识 1.散列表查找的定义 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,使得每个关键字key对应一个存储位置f(key).查找时,根据这个确定的对应关系找到 ...

  7. 数据结构---散列表查找(哈希表)概述和简单实现(Java)

    散列表查找定义 散列技术是在记录的存储位置和它的关键字之间建立一个确定的对应关系f,是的每个关键字key对应一个存储位置f(key).查找时,根据这个确定的对应关系找到给定值的key的对应f(key) ...

  8. 密码学之Hash散列

    一.简介 hash(散列.杂凑)函数,是将任意长度的数据映射到有限长度的域上. 直观解释起来,就是对一串数据m进行杂糅,输出另一段固定长度的数据h,作为这段数据的特征(指纹).也就是说,无论数据块m有 ...

  9. 散列之HashTable学习

    1,什么是散列? 举个例子,在日常生活中,你将日常用品都放在固定的位置,当你下次需要该东西时,直接去该地方取它.这个过程就相当于散列查找. 若将它们随意杂乱无章地存放,当需要某件东西时,只能一个地方一 ...

随机推荐

  1. (多对象)Json转换成List

    写的不好,请大家见谅. 1.Json 格式{"packages":[{“type”:”aaa”}],"zone_packages":[{"ticket ...

  2. C#设置IP地址,启用禁用适配器

    界面效果图如下: 报表界面 说下关键代码 需要开启 Windows Management Instrumentation服务(默认已经开启),在程序中需要增加 Management引用. 主要有Net ...

  3. STL中的set容器

    #include <iostream> #include <set> using namespace std; int main() { set<int> s; s ...

  4. java解析JSON (使用net.sf.json)

    例如JSON字符串str如下: {     "data": [         {             "basic_title": "运筹帷幄因 ...

  5. 对于方法 String.Contains,只支持可在客户端上求值的参数。

    var ProjectLevel_XJJS = "06,07,08,09"; p.Where(e =>ProjectLevel_XJJS.Contains(e.LevelCo ...

  6. Python 函数传递list,传递dict 以及*args和**kargs

    函数之间传递list: def show(ll): for i in ll: print(i) show(['chen','hang','wang','yadan']) #============== ...

  7. 图示Servelet请求过程

    静态文件的请求处理过程: 客户端浏览器向WebServer发送一个HTTP请求,WebServer解析HTTP请求,然后找到对应的静态文件,读取文件的内容,然后返回给客户端浏览器HTML文本,浏览器解 ...

  8. 兼容各浏览器中的PNG透明效果CSS定义

    <style>.mycls{width: 48px;height: 48px;background: url(20090318230119136.png) no-repeat left t ...

  9. Node.js模块 加载笔记

    //核心模块就是Node.js标准API种提供的模块,如fs,http,net.vm等.官方提供,编译成二进制代码//核心模块拥有最高的加载优先级 //文件模块则是存储为单独的文件(或文件夹)的模块, ...

  10. Jzzhu and Chocolate

    CF#257 div2 C:http://codeforces.com/contest/450/problem/C 题意:n*m的方格,每次可以横着或者纵向的切一刀,问切k之后,最小的最大是多少. 题 ...