-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlinked_hash_map_remove.c
43 lines (40 loc) · 1.25 KB
/
linked_hash_map_remove.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
#include "linked_hash_map_remove.h"
bool removeEntry(struct LinkedHashMap *map, int key) {
int h = hash(key);
int index = indexFor(map, h);
struct Entry *bucket = map->table[index];
struct Entry *prev = map->table[index];
while (bucket != NULL) {
if (bucket->hash == h && bucket->key == key) {
if (prev == bucket) {
map->table[index] = bucket->next;
}
prev->next = bucket->next;
if (map->head == map->tail) {
map->head = NULL;
map->tail = NULL;
free(bucket);
return true;
}
if (bucket == map->head) {
bucket->after->before = NULL;
map->head = bucket->after;
} else if (bucket == map->tail) {
bucket->before->after = NULL;
map->tail = bucket->before;
} else {
bucket->before->after = bucket->after;
bucket->after->before = bucket->before;
}
free(bucket);
return true;
}
if (bucket->next != NULL) {
prev = bucket;
bucket = bucket->next;
} else {
break;
}
}
return false;
}