C语言hash函数

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

//这里我自己设计一个hash算法来快速查找一堆数字中相等的数字,这也许是最接近原理的算法了
//一个整数整除27后的来作为hash函数
//定义一个保存实际数据的结构体节点

struct data_node
{
    int num;
    int count;
    struct data_node *next;
};

//定义一个结构体时hash表的一部分
typedef struct
{
    int key; //余数
    struct data_node *p; //链表的头指针
} hash_node;

#define HASH_SIZE 27
int do_hash(int num) //hash表来求余数,这样就可以了
{
    return num%HASH_SIZE;
}

//初始化
//添加数字
//更新数字
//删除数字
//查找数字

hash_node HashTable[HASH_SIZE]; //这里申明一个hashtable的数组

//初始化函数,需要做的事将key复制为null,将p指针指向null,返回一个头指针来指向这个hashtable

void InitHashTable(hash_node *HashTable)
{
    //进行参数的校验
    for(int i=0;i<HASH_SIZE;i++)
    {
        HashTable[i].key = 0;
        HashTable[i].p =NULL;
    }
}

//保存到这个链表中
//如果这个链表是空的话,就作为头指针,如果这个链表不为空,则添加到吧数字添加到末尾
int savedata(struct data_node **head,int num)
{
    struct data_node *tmp_p = *head;

    struct data_node *p = (struct data_node *)malloc(sizeof(struct data_node));
    if(p == NULL)
        return 0;
    if(*head == NULL)
    {
        *head = p;
        p->count = 1;
        p->num = num;
        p->next = NULL;
    }
    else //如果不为空,则这个时候应该添加到链表末尾
    {

        while(tmp_p != NULL)//如果存在,则将这个节点的count加1就可以了
        {
            if(tmp_p->num == num)
            {
                free(p);
                ++tmp_p->count ;
                return 0;
            }
            if(tmp_p->next == NULL)
                break;
            tmp_p = tmp_p->next;
        }

        tmp_p->next = p;
        p->count =1;
        p->num = num;
        p->next = NULL;

    }

    return 0;
}
//添加数字
//将这个数字经过hash求出结果,然后再保存到相应的链表中
//返回真或者假就可以了
int add_hash(hash_node *HashTable,int num)
{
    int mod = do_hash(num);
    return savedata(&HashTable[mod].p,num);
}




int main()
{

    int num = 100;
    hash_node *H = HashTable;
    InitHashTable(H);
    add_hash(H,num);
    add_hash(H,num);
    add_hash(H,3);
    add_hash(H,1);
    add_hash(H,4);
    //在这里我们可以发现一个好的hash函数是多么的重要,如果hash函数不好造成很多冲突的话,效率并不会提高很多的,理想的情况是冲突几乎没有
    //这也就是设计hash函数的精髓所在
    return 0;
}

C语言中,可以通过使用二维数组来实现哈希函数。具体实现方法如下: 1. 首先,定义一个二维数组作为哈希表,数组的每个元素表示一个哈希桶,每个哈希桶可以存放多个键值对。数组的大小可以根据需要进行调整。 ```c #define MAX_SIZE 10 typedef struct { int key; int value; } Entry; Entry hashTable[MAX_SIZE][MAX_SIZE]; ``` 2. 然后,编写哈希函数来计算键值对应的哈希桶的位置。常用的哈希函数有很多种,比如直接定址法、除留余数法、平方取中法等。根据具体情况选择合适的哈希函数。 ```c int hashFunction(int key) { // 这里使用除留余数法作为哈希函数 return key % MAX_SIZE; } ``` 3. 接下来,可以编写插入和查找函数来操作哈希表。 ```c void insert(int key, int value) { int index = hashFunction(key); // 在对应的哈希桶中查找是否已经存在相同的key,如果存在,更新value;如果不存在,将键值对插入到哈希桶中 int i; for (i = 0; i < MAX_SIZE; i++) { if (hashTable[index][i].key == key) { hashTable[index][i].value = value; return; } if (hashTable[index][i].key == 0) { hashTable[index][i].key = key; hashTable[index][i].value = value; return; } } // 如果哈希桶已满,无法插入键值对 printf("Hash table is full.\n"); } int search(int key) { int index = hashFunction(key); // 在对应的哈希桶中查找key,并返回对应的value int i; for (i = 0; i < MAX_SIZE; i++) { if (hashTable[index][i].key == key) { return hashTable[index][i].value; } } // 如果未找到对应的key,返回一个特定的值表示未找到 return -1; } ``` 通过以上方法,可以实现一个简单的哈希函数和哈希表的功能。在使用哈希函数时,需要根据实际情况选择合适的哈希函数和哈希表大小,以确保哈希函数的性能和哈希表的存储能力。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C语言-一维数组和二维数组,包括动态一维数组和二维数组声明和使用](https://blog.csdn.net/u012582648/article/details/107912735)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [哈希(Hash)查找算法详解之C语言版](https://blog.csdn.net/sunnyoldman001/article/details/127345993)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值