您的位置:首页 > 编程语言 > C语言/C++

C语言hash函数

2015-09-03 21:23 621 查看
#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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: