#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语言hash函数
最新推荐文章于 2024-07-16 11:02:07 发布