-
Notifications
You must be signed in to change notification settings - Fork 0
/
htable.c
86 lines (75 loc) · 1.89 KB
/
htable.c
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
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <stdlib.h>
#include "htable.h"
int htable_init(HTable *htb,
unsigned int buckets,
int (*hash)(const void *key),
void (*destroy)(void *data),
int (*match)(const void *key1, const void *key2)){
if(match==NULL || hash==NULL || buckets == 0){
return -1;
}
if((htb->table = (List *)malloc(buckets * sizeof(List))) == NULL){
return -1;
}
for(int i=0; i<buckets; i++){
list_init((List *)(htb->table+i), destroy, match);
}
htb->buckets = buckets;
htb->hash = hash;
htb->match = match;
htb->destroy = destroy;
htb->size = 0;
return 0;
}
void htable_destroy(HTable *htb){
for(int i=0; i<htb->buckets; i++){
list_destroy((List *)(htb->table+i));
}
free(htb->table);
memset(htb, 0, sizeof(*htb));
}
int htable_insert(HTable *htb, const void *data){
/* existed */
if(htable_has_data(htb, data)){
return 1;
}
/* insert */
/* Don't trust User function htb->hash() can return suitable value */
int pos = htb->hash(data) % htb->buckets;
if(list_push((List *)(htb->table+pos), data) != 0){
return -1;
}
htb->size++;
return 0;
}
int htable_remove(HTable *htb, const void *data){
/* Don't trust User function htb->hash() can return suitable value */
int pos = htb->hash(data) % htb->buckets;
List *pList = (List *)(htb->table+pos);
Node *pNode = list_search(pList, data);
/* data not in htb */
if(pNode==NULL){
return -1;
}
void *temp;
if(list_remove(pList, pNode, (void**)&temp)!=0){
return -1;
}
htb->size--;
return 0;
}
int htable_has_data(HTable *htb, const void *data){
/* Don't trust User function htb->hash() can return suitable value */
int pos = htb->hash(data) % htb->buckets;
List *pList = (List *)(htb->table+pos);
if(list_search(pList, data)!=NULL){
return 1;
}
return 0;
}
void htable_dump(HTable *htb, void (*print)(const void *data)){
for(int i=0; i<htb->buckets; i++){
List *pList = (List *)(htb->table+i);
list_dump(pList, print);
}
}