![]()
![]()
![]()
![]()
![]()
1 #include <stdio.h>
2 #include <malloc.h>
3 #include "GTree.h"
4 #include "LinkList.h"
5
6
7 typedef struct _tag_GTreeNode GTreeNode;
8 struct _tag_GTreeNode
9 {
10 GTreeData* data;
11 GTreeNode* parent;
12 LinkList* child;
13 };
14
15
16 typedef struct _tag_TLNode TLNode;
17 struct _tag_TLNode
18 {
19 LinkListNode header;
20 GTreeNode* node;
21 };
22
23
24 static void recursive_display(GTreeNode* node, GTree_Printf* pFunc, int format, int gap, char div)
25 {
26 int i = 0;
27
28 if( (node != NULL) && (pFunc != NULL) )
29 {
30 for(i=0; i<format; i++)
31 {
32 printf("%c", div);
33 }
34
35 pFunc(node->data);
36
37 printf("\n");
38
39 for(i=0; i<LinkList_Length(node->child); i++)
40 {
41 TLNode* trNode = (TLNode*)LinkList_Get(node->child, i);
42
43 recursive_display(trNode->node, pFunc, format + gap, gap, div);
44 }
45 }
46 }
47
48 static void recursive_delete(LinkList* list, GTreeNode* node)
49 {
50 if( (list != NULL) && (node != NULL) )
51 {
52 GTreeNode* parent = node->parent;
53 int index = -1;
54 int i = 0;
55
56 for(i=0; i<LinkList_Length(list); i++)
57 {
58 TLNode* trNode = (TLNode*)LinkList_Get(list, i);
59
60 if( trNode->node == node )
61 {
62 LinkList_Delete(list, i);
63
64 free(trNode);
65
66 index = i;
67
68 break;
69 }
70 }
71
72 if( index >= 0 )
73 {
74 if( parent != NULL )
75 {
76 for(i=0; i<LinkList_Length(parent->child); i++)
77 {
78 TLNode* trNode = (TLNode*)LinkList_Get(parent->child, i);
79
80 if( trNode->node == node )
81 {
82 LinkList_Delete(parent->child, i);
83
84 free(trNode);
85
86 break;
87 }
88 }
89 }
90
91 while( LinkList_Length(node->child) > 0 )
92 {
93 TLNode* trNode = (TLNode*)LinkList_Get(node->child, 0);
94
95 recursive_delete(list, trNode->node);
96 }
97
98 LinkList_Destroy(node->child);
99
100 free(node);
101 }
102 }
103 }
104
105 static int recursive_height(GTreeNode* node)
106 {
107 int ret = 0;
108
109 if( node != NULL )
110 {
111 int subHeight = 0;
112 int i = 0;
113
114 for(i=0; i<LinkList_Length(node->child); i++)
115 {
116 TLNode* trNode = (TLNode*)LinkList_Get(node->child, i);
117
118 subHeight = recursive_height(trNode->node);
119
120 if( ret < subHeight )
121 {
122 ret = subHeight;
123 }
124 }
125
126 ret = ret + 1;
127 }
128
129 return ret;
130 }
131
132 static int recursive_degree(GTreeNode* node)
133 {
134 int ret = -1;
135
136 if( node != NULL )
137 {
138 int subDegree = 0;
139 int i = 0;
140
141 ret = LinkList_Length(node->child);
142
143 for(i=0; i<LinkList_Length(node->child); i++)
144 {
145 TLNode* trNode = (TLNode*)LinkList_Get(node->child, i);
146
147 subDegree = recursive_degree(trNode->node);
148
149 if( ret < subDegree )
150 {
151 ret = subDegree;
152 }
153 }
154 }
155
156 return ret;
157 }
158
159 GTree* GTree_Create()
160 {
161 return LinkList_Create();
162 }
163
164 void GTree_Destroy(GTree* tree)
165 {
166 GTree_Clear(tree);
167 LinkList_Destroy(tree);
168 }
169
170 void GTree_Clear(GTree* tree)
171 {
172 GTree_Delete(tree, 0);
173 }
174
175 int GTree_Insert(GTree* tree, GTreeData* data, int pPos)
176 {
177 LinkList* list = (LinkList*)tree;
178 int ret = (list != NULL) && (data != NULL) && (pPos < LinkList_Length(list));
179
180 if( ret )
181 {
182 TLNode* trNode = (TLNode*)malloc(sizeof(TLNode));
183 TLNode* cldNode = (TLNode*)malloc(sizeof(TLNode));
184 TLNode* pNode = (TLNode*)LinkList_Get(list, pPos);
185 GTreeNode* cNode = (GTreeNode*)malloc(sizeof(GTreeNode));
186
187 ret = (trNode != NULL) && (cldNode != NULL) && (cNode != NULL);
188
189 if( ret )
190 {
191 cNode->data = data;
192 cNode->parent = NULL;
193 cNode->child = LinkList_Create();
194
195 trNode->node = cNode;
196 cldNode->node = cNode;
197
198 LinkList_Insert(list, (LinkListNode*)trNode, LinkList_Length(list));
199
200 if( pNode != NULL )
201 {
202 cNode->parent = pNode->node;
203
204 LinkList_Insert(pNode->node->child, (LinkListNode*)cldNode, LinkList_Length(pNode->node->child));
205 }
206 }
207 else
208 {
209 free(trNode);
210 free(cldNode);
211 free(cNode);
212 }
213 }
214
215 return ret;
216 }
217
218 GTreeData* GTree_Delete(GTree* tree, int pos)
219 {
220 TLNode* trNode = (TLNode*)LinkList_Get(tree, pos);
221 GTreeData* ret = NULL;
222
223 if( trNode != NULL )
224 {
225 ret = trNode->node->data;
226
227 recursive_delete(tree, trNode->node);
228 }
229
230 return ret;
231 }
232
233 GTreeData* GTree_Get(GTree* tree, int pos)
234 {
235 TLNode* trNode = (TLNode*)LinkList_Get(tree, pos);
236 GTreeData* ret = NULL;
237
238 if( trNode != NULL )
239 {
240 ret = trNode->node->data;
241 }
242
243 return ret;
244 }
245
246 GTreeData* GTree_Root(GTree* tree)
247 {
248 return GTree_Get(tree, 0);
249 }
250
251 int GTree_Height(GTree* tree)
252 {
253 TLNode* trNode = (TLNode*)LinkList_Get(tree, 0);
254 int ret = 0;
255
256 if( trNode != NULL )
257 {
258 ret = recursive_height(trNode->node);
259 }
260
261 return ret;
262 }
263
264 int GTree_Count(GTree* tree)
265 {
266 return LinkList_Length(tree);
267 }
268
269 int GTree_Degree(GTree* tree)
270 {
271 TLNode* trNode = (TLNode*)LinkList_Get(tree, 0);
272 int ret = -1;
273
274 if( trNode != NULL )
275 {
276 ret = recursive_degree(trNode->node);
277 }
278
279 return ret;
280 }
281
282 void GTree_Display(GTree* tree, GTree_Printf* pFunc, int gap, char div)
283 {
284 TLNode* trNode = (TLNode*)LinkList_Get(tree, 0);
285
286 if( (trNode != NULL) && (pFunc != NULL) )
287 {
288 recursive_display(trNode->node, pFunc, 0, gap, div);
289 }
290 }
1 #ifndef _GTREE_H_
2 #define _GTREE_H_
3
4 typedef void GTree;
5 typedef void GTreeData;
6 typedef void (GTree_Printf)(GTreeData*);
7
8 GTree* GTree_Create();
9
10 void GTree_Destroy(GTree* tree);
11
12 void GTree_Clear(GTree* tree);
13
14 int GTree_Insert(GTree* tree, GTreeData* data, int pPos);
15
16 GTreeData* GTree_Delete(GTree* tree, int pos);
17
18 GTreeData* GTree_Get(GTree* tree, int pos);
19
20 GTreeData* GTree_Root(GTree* tree);
21
22 int GTree_Height(GTree* tree);
23
24 int GTree_Count(GTree* tree);
25
26 int GTree_Degree(GTree* tree);
27
28 void GTree_Display(GTree* tree, GTree_Printf* pFunc, int gap, char div);
29
30 #endif
1 #include <stdio.h>
2 #include <malloc.h>
3 #include "LinkList.h"
4
5 typedef struct _tag_LinkList
6 {
7 LinkListNode header;
8 int length;
9 } TLinkList;
10
11 LinkList* LinkList_Create() // O(1)
12 {
13 TLinkList* ret = (TLinkList*)malloc(sizeof(TLinkList));
14
15 if( ret != NULL )
16 {
17 ret->length = 0;
18 ret->header.next = NULL;
19 }
20
21 return ret;
22 }
23
24 void LinkList_Destroy(LinkList* list) // O(1)
25 {
26 free(list);
27 }
28
29 void LinkList_Clear(LinkList* list) // O(1)
30 {
31 TLinkList* sList = (TLinkList*)list;
32
33 if( sList != NULL )
34 {
35 sList->length = 0;
36 sList->header.next = NULL;
37 }
38 }
39
40 int LinkList_Length(LinkList* list) // O(1)
41 {
42 TLinkList* sList = (TLinkList*)list;
43 int ret = -1;
44
45 if( sList != NULL )
46 {
47 ret = sList->length;
48 }
49
50 return ret;
51 }
52
53 int LinkList_Insert(LinkList* list, LinkListNode* node, int pos) // O(n)
54 {
55 TLinkList* sList = (TLinkList*)list;
56 int ret = (sList != NULL) && (pos >= 0) && (node != NULL);
57 int i = 0;
58
59 if( ret )
60 {
61 LinkListNode* current = (LinkListNode*)sList;
62
63 for(i=0; (i<pos) && (current->next != NULL); i++)
64 {
65 current = current->next;
66 }
67
68 node->next = current->next;
69 current->next = node;
70
71 sList->length++;
72 }
73
74 return ret;
75 }
76
77 LinkListNode* LinkList_Get(LinkList* list, int pos) // O(n)
78 {
79 TLinkList* sList = (TLinkList*)list;
80 LinkListNode* ret = NULL;
81 int i = 0;
82
83 if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )
84 {
85 LinkListNode* current = (LinkListNode*)sList;
86
87 for(i=0; i<pos; i++)
88 {
89 current = current->next;
90 }
91
92 ret = current->next;
93 }
94
95 return ret;
96 }
97
98 LinkListNode* LinkList_Delete(LinkList* list, int pos) // O(n)
99 {
100 TLinkList* sList = (TLinkList*)list;
101 LinkListNode* ret = NULL;
102 int i = 0;
103
104 if( (sList != NULL) && (0 <= pos) && (pos < sList->length) )
105 {
106 LinkListNode* current = (LinkListNode*)sList;
107
108 for(i=0; i<pos; i++)
109 {
110 current = current->next;
111 }
112
113 ret = current->next;
114 current->next = ret->next;
115
116 sList->length--;
117 }
118
119 return ret;
120 }
1 #ifndef _LINKLIST_H_
2 #define _LINKLIST_H_
3
4 typedef void LinkList;
5 typedef struct _tag_LinkListNode LinkListNode;
6 struct _tag_LinkListNode
7 {
8 LinkListNode* next;
9 };
10
11 LinkList* LinkList_Create();
12
13 void LinkList_Destroy(LinkList* list);
14
15 void LinkList_Clear(LinkList* list);
16
17 int LinkList_Length(LinkList* list);
18
19 int LinkList_Insert(LinkList* list, LinkListNode* node, int pos);
20
21 LinkListNode* LinkList_Get(LinkList* list, int pos);
22
23 LinkListNode* LinkList_Delete(LinkList* list, int pos);
24
25 #endif
1 #include <stdio.h>
2 #include "GTree.h"
3 /* run this program using the console pauser or add your own getch, system("pause") or input loop */
4
5 void printf_data(GTreeData* data)
6 {
7 printf("%c", (int)data);
8 }
9
10 int main(int argc, char *argv[])
11 {
12 GTree* tree = GTree_Create();
13 int i = 0;
14
15 GTree_Insert(tree, (GTreeData*)'A', -1);
16 GTree_Insert(tree, (GTreeData*)'B', 0);
17 GTree_Insert(tree, (GTreeData*)'C', 0);
18 GTree_Insert(tree, (GTreeData*)'D', 0);
19 GTree_Insert(tree, (GTreeData*)'E', 1);
20 GTree_Insert(tree, (GTreeData*)'F', 1);
21 GTree_Insert(tree, (GTreeData*)'H', 3);
22 GTree_Insert(tree, (GTreeData*)'I', 3);
23 GTree_Insert(tree, (GTreeData*)'J', 3);
24
25 printf("Tree Height: %d\n", GTree_Height(tree));
26 printf("Tree Degree: %d\n", GTree_Degree(tree));
27 printf("Full Tree:\n");
28
29 GTree_Display(tree, printf_data, 2, ' ');
30
31 printf("Get Tree Data:\n");
32
33 for(i=0; i<GTree_Count(tree); i++)
34 {
35 printf_data(GTree_Get(tree, i));
36 printf("\n");
37 }
38
39 printf("Get Root Data:\n");
40
41 printf_data(GTree_Root(tree));
42
43 printf("\n");
44
45 GTree_Delete(tree, 3);
46
47 printf("After Deleting D:\n");
48
49 GTree_Display(tree, printf_data, 2, '-');
50
51 GTree_Clear(tree);
52
53 printf("After Clearing Tree:\n");
54
55 GTree_Display(tree, printf_data, 2, '.');
56
57 GTree_Destroy(tree);
58
59 return 0;
60 }