1 #include<stdio.h>
2 #include<stdlib.h>
3 #include<math.h>
4 #define Mod 100007 //取模的大小,哈希表的大小...
5 #define Max 50 //存放的总数
6 typedef long long LL;
7 class Hash //手写哈希
8 {
9 public:
10 int hs[Mod]; //哈希值 设定的哈希函数为 原值 % Mod ,所以哈希值有可能是 0 ~ Mod-1
11 int next[Max]; //链表 存放哈希值相等的一条链,他的大小取决于所有原值的数量
12 LL S[Max]; //存放原值
13 int H[Max]; //存放所有哈希值
14 int sn; //不同原值的数量
15 int hn; //不同哈希值的数量
16 Hash() //构造函数: 定义Hash类变量时初始化
17 {
18 sn=0;
19 hn=0;
20 for(int i=0;i<Mod;i++)
21 hs[i]=0;
22 }
23 void clear() //清空函数
24 {
25 sn=0;
26 for(int i=0;i<hn;i++)
27 hs[H[i]]=0;
28 hn=0;
29 }
30 void add(LL s) //加入
31 {
32 int ha=abs(s)%Mod; //计算哈希值
33 if(hs[ha]==0) //如果该哈希值还未出现过
34 {
35 H[hn++]=ha; //将该哈希值记录起来,同时哈希值数量加 1
36 }
37 sn++; //0 表示结尾,所以从1 开始存,原值数量加 1,特别针对 hs数组
38 S[sn]=s; //将原值记录起来
39 next[sn]=hs[ha]; //原本原值记录位置
40 hs[ha]=sn; //最新原值记录位置,如果从0 开始存,就无法判断此时是空还是1个值
41 //比如:5 和 10 有一样的哈希值 ,并且 5 和 10 先后加入 那么有:
42 //5 加入: next[1] = 0; hs[5] = 1; hs[5] 是哈希值为5 的头,表示第一个原值在1的位置
43 //10加入: next[2] = 1; hs[5] = 2; 表示第一个哈希值为5的在2,第二个在1,第三个不存在
44 }
45 int find(LL s) //查找
46 {
47 int ha=abs(s)%Mod; //计算哈希值
48 int k=hs[ha]; //头
49 while(k!=0)
50 {
51 if(S[k]==s) return k;//找到
52 k=next[k]; //下一个节点
53 }
54 return 0; //表示没找到
55 }
56 };
57 int main()
58 {
59
60 return 0;
61 }