-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtreemap.c
117 lines (101 loc) · 2.46 KB
/
treemap.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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
#include "treemap.h"
#include <stdlib.h>
#include <string.h>
static Node *newNode(const char *key, const char *value) {
Node *node = malloc(sizeof(Node));
node->key = strdup(key);
node->value = strdup(value);
node->left = NULL;
node->right = NULL;
return node;
}
TreeMap *newTreeMap() {
TreeMap *treeMap = malloc(sizeof(TreeMap));
treeMap->root = NULL;
return treeMap;
}
Node **findNode(Node **cur, const char *key) {
while (*cur) {
if (strcmp(key, (*cur)->key) > 0) {
cur = &((*cur)->right);
} else if (strcmp(key, (*cur)->key) < 0) {
cur = &((*cur)->left);
} else {
break;
}
}
return cur;
}
void insertToTreeMap(TreeMap *treemap, const char *key, const char *value) {
Node **node = findNode(&(treemap->root), key);
if (*node != NULL) {
free((*node)->value);
(*node)->value = strdup(value);
return;
}
*node = newNode(key, value);
}
Node *searchNode(Node *cur, const char *key) {
while (cur) {
if (strcmp(key, cur->key) > 0) {
cur = cur->right;
} else if (strcmp(key, cur->key) < 0) {
cur = cur->left;
} else {
break;
}
}
return cur;
}
char *getValueFromTreeMap(const TreeMap *treemap, const char *key) {
Node *node = searchNode(treemap->root, key);
if (node == NULL) return NULL;
return node->value;
}
static void freeComponents(Node *node) {
if (node == NULL) return;
free(node->key);
free(node->value);
}
static void freeNodeAndComponents(Node *node) {
if (node == NULL) return;
freeComponents(node);
free(node);
}
static void freeNode(Node *node) {
if (node == NULL) return;
freeNode(node->left);
freeNode(node->right);
freeNodeAndComponents(node);
}
void freeTreeMap(TreeMap *treemap) {
freeNode(treemap->root);
free(treemap);
}
static Node **findMinNode(Node **cur) {
while ((*cur)->left) cur = &((*cur)->left);
return cur;
}
int removeFromTreeMap(TreeMap *treemap, const char *key) {
Node **node = findNode(&(treemap->root), key);
if (*node == NULL) return -1;
Node *tmp = *node;
if ((*node)->left == NULL) {
*node = (*node)->right;
freeNodeAndComponents(tmp);
return 0;
}
if ((*node)->right == NULL) {
*node = (*node)->left;
freeNodeAndComponents(tmp);
return 0;
}
Node **min = findMinNode(&((*node)->right));
freeComponents(*node);
(*node)->key = strdup((*min)->key);
(*node)->value = strdup((*min)->value);
Node *tmp2 = *min;
*min = (*min)->right;
freeNodeAndComponents(tmp2);
return 0;
}