C语言 哈希表

本文介绍了哈希表的基本概念,包括哈希函数的设计,如整数的除留余数法和字符串的间隔法。接着详细讨论了处理哈希冲突的两种策略:拉链法和线性探测法,并分别提供了C语言的代码实现。通过学习,读者可以理解哈希表如何高效地存储和查找数据。
摘要由CSDN通过智能技术生成

哈希表简介

散列表(Hash table,也叫哈希表),是根据关键码值(Key value)而直接进行访问的数据结构。

哈希函数

得到一个数的hash值的函数,被称为哈希函数。
1. 整数

除留余数法, 对于大小为素数M的数组,对于任意正整数k,计算k除以M的余数。M一般取素数。

#define PRIME 11
int getIntHashCode(int a) {
    return a%PRIME;
}


  1. 字符串

保留除余法
int getHashCode(char *str, int length) {
    int hash = 0;
    for (int i = 0; i < length; i++) {
        hash = *(str + i) + hash * 31;
    }
    return hash;
}

间隔n个字符,得到哈希值

//间隔dk个字符
int getHashCode_2(char *str, int length, int dk) {
    int hash = 0;
    for (int i = 0; i < length; i=i+2) {
        hash = *(str + i) + hash * 31;
    }
    return hash;
}

如果给定的数组超过我们存储的大小,就会有相同的哈希值,所以我们需要避免哈希冲突

哈希冲突
拉链法

这里写图片描述
将同一个哈希值的跟在之前的节点之后。

代码实现

ADT:

#include &l
  • 0
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
哈希表是一种高效的数据结构,它可以在常数时间内完成插入、删除和查找操作。下面是一个简单的C语言哈希表代码和讲解: 代码: ``` #include <stdio.h> #include <stdlib.h> #include <string.h> #include "uthash.h" struct hashTable { int key; int val; UT_hash_handle hh; }; struct hashTable *hashTable = NULL; void insert(int key, int val) { struct hashTable *s; HASH_FIND_INT(hashTable, &key, s); if (s == NULL) { s = (struct hashTable*)malloc(sizeof(struct hashTable)); s->key = key; HASH_ADD_INT(hashTable, key, s); } s->val = val; } int find(int key) { struct hashTable *s; HASH_FIND_INT(hashTable, &key, s); if (s == NULL) { return -1; } return s->val; } void delete(int key) { struct hashTable *s; HASH_FIND_INT(hashTable, &key, s); if (s != NULL) { HASH_DEL(hashTable, s); free(s); } } void printHashTable() { struct hashTable *s; for (s = hashTable; s != NULL; s = (struct hashTable*)(s->hh.next)) { printf("key:%d, val:%d\n", s->key, s->val); } } int main() { insert(1, 10); insert(2, 20); insert(3, 30); insert(4, 40); printf("find key 1, val:%d\n", find(1)); printf("find key 5, val:%d\n", find(5)); delete(3); printHashTable(); return 0; } ``` 讲解: 1. 首先定义了一个结构体`struct hashTable`,它包含了键`key`和值`val`,以及一个`UT_hash_handle`类型的指针`hh`,这是一个用于哈希表操作的结构体。 2. 在`main`函数中,我们调用`insert`函数向哈希表中插入数据,调用`find`函数查找数据,调用`delete`函数删除数据,最后调用`printHashTable`函数打印哈希表中的所有数据。 3. `insert`函数首先调用`HASH_FIND_INT`宏查找哈希表中是否已经存在该键,如果不存在,则动态分配一个`struct hashTable`类型的结构体,并将键和结构体添加到哈希表中。 4. `find`函数同样调用`HASH_FIND_INT`宏查找哈希表中是否存在该键,如果存在,则返回对应的值,否则返回-1。 5. `delete`函数调用`HASH_FIND_INT`宏查找哈希表中是否存在该键,如果存在,则调用`HASH_DEL`宏删除该键和对应的结构体,并释放内存。 6. `printHashTable`函数遍历哈希表中的所有数据,并打印出键和值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值