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 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;iHASH_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函数#include hash_map
#include string
#include iostream
using namespace std;
class Spoint
{
public :
Spoint(int a=0,int b=0){this-a = a; this-b = b;}
int getA(){ return this-a ;}
int getB(){ return this-b ;}
private :
int a;
int b;
};
//1 define the hash function
struct hash_Spoint{
size_t operator()(const class Spoints)const{
return s.getA()s.getB();
}
};
//2 define the equal function
struct equal_Spoint{
bool operator()(const class Spoints1, const class Spoints2)const{
returns1.getA() == s2.getA()s1.getB() == s2.getB();
}
};
int main(int argc, char *argv[])
{
hash_mapSpoint, string, hash_Spoint, equal_Spoint hmap;
Spoint s1(1,2);
hmap[s1]="Spoint 1";
Spoint s2(2,3);
hmap[s2]="Spoint 2";
Spoint s3(2,3);
hmap[s3]="Spoint 3";
couthmap[s1]endl;
couthmap[s2]endl;
couthmap[s3]endl;
return 0;
}
Hash表的设计 (2人)(使用C语言)#includeiostream
#includestring
using namespace std;
#define HASH_LENGTH 50//哈希表的长度
#define M 47//随机数
#define NAME_NO 30//人名的个数
typedef struct
{char *py;//名字的拼音
int k;//拼音所对应的整数
}NAME;
NAME NameList[HASH_LENGTH];//全局变量NAME
typedef struct//哈希表
{char *py;//名字的拼音
int k;//拼音所对应的整数
int si;//查找长度
}HASH;
HASH HashList[HASH_LENGTH];//全局变量HASH
void InitNameList() //姓名(结构体数组)初始化
{char *f;
int r,s0,i;
for (i=0; iHASH_LENGTH; i)//
推荐阅读
- 末世经营种田游戏,末世经营类单机游戏
- html5分享页面,h5页面分享功能
- 关于接面包小程序怎么接的的信息
- 最强游戏开发,世界最厉害的游戏开发公司
- windows系统键盘图的简单介绍
- jquery所有id都隐藏,jquery根据id隐藏元素
- linux中命令df,linux中命令的格式
- 极盗者迅雷下载,极米怎么下载迅雷
- go语言是鹅厂吗 go语言好不好