C语言hash函数

来源:互联网 发布:js map参数传递 编辑:程序博客网 时间:2024/06/05 17:43

#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 27int do_hash(int num) //hash表来求余数,这样就可以了{    return num%HASH_SIZE;}//初始化//添加数字//更新数字//删除数字//查找数字hash_node HashTable[HASH_SIZE]; //这里申明一个hashtable的数组//初始化函数,需要做的事将key复制为null,将p指针指向null,返回一个头指针来指向这个hashtablevoid 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;}

0 0