-
Notifications
You must be signed in to change notification settings - Fork 0
/
PointTree.c
100 lines (83 loc) · 1.63 KB
/
PointTree.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
#include <stdlib.h>
#include <stdio.h>
#include "PointTree.h"
struct PointTree {
int row;
int col;
PointTree *parent;
PointTree *sib;
PointTree *child;
};
static PointTree *freeNodes = NULL;
static void freeNode(PointTree *node)
{
node->sib = freeNodes;
freeNodes = node;
}
static PointTree *newNode()
{
PointTree *new;
if (freeNodes) {
new = freeNodes;
freeNodes = new->sib;
} else {
new = malloc(sizeof(PointTree));
}
return new;
}
PointTree *PointTreeInit()
{
PointTree *root = newNode();
root->row = -1;
root->col = -1;
root->parent = NULL;
root->sib = NULL;
root->child = NULL;
return root;
}
void PointTreeRecycle(PointTree *tree)
{
if (tree) {
PointTreeRecycle(tree->sib);
PointTreeRecycle(tree->child);
freeNode(tree);
}
}
void PointTreeGarbageCollect()
{
PointTree *temp;
while (freeNodes) {
temp = freeNodes->sib;
free(freeNodes);
freeNodes = temp;
}
}
void PointTreeAdd(PointTree **tree, int row, int col)
{
PointTree *new = newNode(), *child;
new->parent = *tree;
new->child = NULL;
new->sib = NULL;
new->row = row;
new->col = col;
if (!(*tree)->child) {
(*tree)->child = new;
} else {
child = (*tree)->child;
while (child->sib)
child = child->sib;
child->sib = new;
}
*tree = new;
}
int PointTreePathContains(PointTree *tree, int row, int col)
{
int found = 0;
while (!found && tree) {
if (tree->row == row && tree->col == col)
found = 1;
else
tree = tree->parent;
}
return found;
}