数据结构:哈希查找 & C语言实现

1 原因

查找最快的方式就是直接去找到那个东西,计算机中能否直接通过关键词key直接找到需要记录的存储位置,不需要比较。
存储位置= f(key)
这里把f称为散列函数,又称为哈希函数。这一块连续的存储空间称为哈希表

2 哈希表

2.1 查找步骤

1)存储时,通过哈希函数计算记录的地址,并将数据存入该地址。
2)查找时,通过海希函数计算地址,去地址取出数据。

2.2 哈希函数构造

除留余数法。

以ip地址192.168.50.168为例,存储时可以把四个数字相加除以32得到余数作为key。

2.2 冲突

哈希在计算地址时肯定会遇到冲突,解决冲突的常用方法,链地址法
遇到冲突之后,直接把相同哈希值的数据用链表串起来。
在这里插入图片描述

3 实现

链地址实现。冲突时使用链表进行存储。(未完待续)

#include <stdio.h>
int hash_length = 10;
typedef struct
{
    int value;
    struct hash_table_t *nxt_elmt;//此处注意时struct hash_table_t
}hash_table_t;

int hash(int value)
{
    return value%10;
}

void insert_hash(hash_table_t *H,int value)
{
    int hash_key;
    hash_table_t *p;
    hash_key = hash(value);
    if( H[hash_key].value != -1)
    {
        p =(hash_table_t*) malloc(sizeof(hash_table_t));
        p->value = value;
        p->nxt_elmt = NULL;
        H[hash_key].nxt_elmt = p;
    }
    else 
    H[hash_key].value = value;
}
void find_hash(hash_table_t *H,int value)
{

}
int main()
{
    hash_table_t hash_base[hash_length],*p,*q;
    int num=0;
    for(int i=0;i<hash_length;i++)
    {
        hash_base[i].value = -1 ;//默认为-1
        hash_base[i].nxt_elmt = NULL;
    }
    
    printf("please input num\n");
    scanf("%d",&num);
    printf("num = %d\n", num);
    insert_hash(hash_base,num);
    printf("please input num2\n");
    scanf("%d",&num);
    printf("num2 = %d\n", num);
    insert_hash(hash_base,num);
    for(int i=0;i<hash_length;i++)
    {
        printf("%d",hash_base[i].value);
        q = hash_base[i].nxt_elmt;
        while( q!= NULL)
        {
            //p = hash_base[i].nxt_elmt;
            printf("\t %d",q->value);
            q = q->nxt_elmt;
        }
        printf("\n");
    }
    printf("hello word!!!\n");
    return 0;
}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值