-
Notifications
You must be signed in to change notification settings - Fork 0
/
hash.cpp
67 lines (52 loc) · 1.51 KB
/
hash.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
#include <stdlib.h>
#define SIZE 1024
#define testSize 1024
static int (**hnew())[2] {
return (int (**)[2])calloc(sizeof(int**), SIZE);
}
static void hdel(int (**e)[2]) {
for (int i = 0; i < SIZE; i++) free(e[i]); free(e);
}
static int (**hget(int (**t)[2], int k))[2] {
// for (int h = k & (SIZE - 1); **t && ***t != k; h = ((h + 1) & (SIZE - 1)), t += h);
int h = k & (SIZE - 1);
while (**t && ***t != k) {
h = ((h + 1) & (SIZE - 1));
t += h;
}
return t;
}
static void hset(int (**t)[2], int k, int v) {
// for (int (**a)[2] = hget(t, k); !*a && (*a=(int (*)[2])malloc(sizeof(**t))); (**a)[0]=k,(**a)[1]=v);
int (**a)[2] = hget(t, k);
if (!*a && (*a=(int (*)[2])malloc(sizeof(**t)))) {
(**a)[0]=k,(**a)[1]=v;
}
else {
(**a)[0]=k,(**a)[1]=v;
}
}
// TEST DRIVER
#include <stdio.h>
int main() {
// initialize hash table
int (**table)[2] = hnew();
/***** example of typical use *****
hset(table, 10, 10);
hset(table, 20, 20);
int (**a)[2] = hget(table, 10);
int (**b)[2] = hget(table, 20);
printf("%d:%d\n", (**a)[0], (**a)[1]);
printf("%d:%d\n", (**b)[0], (**b)[1]);
***********************************/
for (int i = 0; i < testSize; ++i) {
hset(table, i, i-100);
}
for (int i = 0; i < testSize; ++i) {
printf( "k: %d -- v: %d\n", (**hget(table, i))[0], (**hget(table, i))[1] );
}
// delete hash table
hdel(table);
// pause to see the result
// getchar();
}