HASH查找--------(拉链法)

//哈希查找的方法从大的方向上可以分为两种  (基本的思路都是在创建哈希表的过程中用每一个数据的数值对数据的个数进行取余数操作)

 方法如此下分别是:

       方法1: 开放地址发  

             A  线性探测:

                 当有区域的结果相同时候,就按照先后顺序  依次后移  知道找到第一个空位置的时候 将数据放入

             B  探测-------线性探测再散列

                 遇到取余数后的结果相同的时候按照一定的间距依次后移 为了防止死循环的出现  间隔按照一定的规则先后增大(从1           开始,平方增大,假如第一次没有空的位置  第二次的间隔为4  电视那次的 间隔为9 以此类推)

             C  随机探测 

      方法2:拉链法

             采用邻接表的思想将数据加载到指针数组中  指针书中中每一个位置存放的是每一个取余数后的结果相同的数据所构成 的       链表的头指针的值。在查找数据的过程中  对需要查找的数据进行取余数操作,根据结果好到相应的链表(取余数的结果就           是链表的头指针存放在指针数组中的位置) 然后从头结点开始遍历  知道找到所需要找的数据结束操作  如果到链表的末尾还         没找到数据,就表明这个数据不存在,结束查找的操作         

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

typedef struct node{
    int value;
    int n;
    struct node *next;
}Hash;

//创建哈希表   将数组中的元素加载到哈希表中  为后续的查找做准备  

Hash **Create(int a[],int len){
    if(a==NULL || len<=0)  return NULL;
    Hash **hash=NULL;

    //申请指针数组  用于装每一个链表的头指针  
    hash=(Hash**)malloc(sizeof(Hash)*len);
    memset(hash,0,sizeof(Hash)*len);
    int i;
    int temp;
    Hash *insert=NULL;

   //循环  将数组中的每一个 元素加载到哈希表中 
   for(i=0;i<len;i++){
        temp=a[i]%len;
        insert=(Hash*)malloc(sizeof(Hash));
        insert->value=a[i];
        insert->n=i;
        insert->next=hash[temp];
        hash[temp]=insert;
    }
    return hash;
}

//从创建好的哈希表中查找是否存在所需要查找的数据  存在就将钙元素在书中的下标值返回 

int funcation(Hash **hash,int len,int find_date){
    if(hash==NULL)  return -1;
    Hash *bj=NULL;
    int temp;
    temp=find_date%len;
    bj=hash[temp];
    while(bj!=NULL){
        if(bj->value==find_date){
            return bj->n;
            break;
        }
        bj=bj->next;
    }
    return -1;
}

int main(){
    int a[]={10,0,22,3,14,52,36};
    int find_date;
    Hash ** hash=NULL;
    hash = Create(a,sizeof(a)/sizeof(a[0]));
    scanf("%d",&find_date);
    int temp;
    temp=funcation(hash,sizeof(a)/sizeof(a[0]),find_date);
    printf("%d\n",temp);
    return 0;
    
}

 

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值