-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathsearchStructs.c
101 lines (91 loc) · 2.31 KB
/
searchStructs.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
#include "searchStructs.h"
void addToResultList(ResultList **list, long int pos, int key) {
ResultList *elem = (ResultList *)mallocSafe(sizeof(ResultList));
elem->next = *list;
elem->pos = pos;
elem->key = key;
*list = elem;
}
void freeResultList(ResultList *list) {
if (list) {
freeResultList(list->next);
ResultList * aux = list;
free(list);
}
}
void freeResultTree(ResultNode *root) {
if (root) {
freeResultTree(root->left);
freeResultTree(root->right);
freeResultList(root->result);
free(root);
}
}
void addToResultTree(ResultNode **root, ResultList *list, TableName tableName) {
if (*root) {
int comp = strcmp(tableName, (*root)->tableName);
if (comp == 0) {
freeResultList((*root)->result);
(*root)->result = list;
} else {
if (comp < 0) {
if ((*root)->left) {
addToResultTree(&((*root)->left), list, tableName);
} else {
ResultNode *elem = (ResultNode *)mallocSafe(sizeof(ResultNode));
elem->left = NULL;
elem->right = NULL;
elem->result = list;
strncpy(elem->tableName, tableName, TABLE_NAME_LIMIT);
(*root)->left = elem;
}
} else {
if ((*root)->right) {
addToResultTree(&((*root)->right), list, tableName);
} else {
ResultNode *elem = (ResultNode *)mallocSafe(sizeof(ResultNode));
elem->left = NULL;
elem->right = NULL;
elem->result = list;
strncpy(elem->tableName, &(tableName[0]), TABLE_NAME_LIMIT);
(*root)->right = elem;
}
}
}
} else {
ResultNode *elem = (ResultNode *)mallocSafe(sizeof(ResultNode));
elem->left = NULL;
elem->right = NULL;
elem->result = list;
strncpy(elem->tableName, tableName, TABLE_NAME_LIMIT);
*root = elem;
}
}
ResultList *searchResultList(ResultNode *root, TableName tableName) {
if (root) {
int comp = strcmp(tableName, root->tableName);
if (comp == 0) {
return root->result;
} else if (comp < 0) {
return searchResultList(root->left, tableName);
} else {
return searchResultList(root->right, tableName);
}
} else {
return NULL;
}
}
void showResultTree(ResultNode *root) {
if (root) {
showResultTree(root->left);
printf("%s\n", root->tableName);
showResultList(root->result);
showResultTree(root->right);
}
}
void showResultList(ResultList *list) {
if (list) {
showResultList(list->next);
printf("\t%lx\n", list->pos);
}
}