修改与添加。
This commit is contained in:
parent
bb1816299e
commit
71eb84f190
BIN
list/list.h
BIN
list/list.h
Binary file not shown.
167
tree/tree.h
167
tree/tree.h
@ -20,6 +20,12 @@ typedef struct tree
|
|||||||
TNode *root;
|
TNode *root;
|
||||||
}Tree;
|
}Tree;
|
||||||
|
|
||||||
|
List *tree_list = NULL;
|
||||||
|
List *tnode_list = NULL;
|
||||||
|
int if_safeModeForTree = 0;
|
||||||
|
int safeModeForTree(int ifon);
|
||||||
|
int releaseAllForTree(void);
|
||||||
|
|
||||||
TNode *initTNode(void);
|
TNode *initTNode(void);
|
||||||
Tree *initTree(void);
|
Tree *initTree(void);
|
||||||
int *initMallocValueForTNode(TNode *p_tnode, char *type, void *value);
|
int *initMallocValueForTNode(TNode *p_tnode, char *type, void *value);
|
||||||
@ -39,6 +45,36 @@ int removeChildByIndex(TNode *p_tnode, unsigned long long index);
|
|||||||
int removeChildByValue(TNode *p_tnode, char *type, void *value);
|
int removeChildByValue(TNode *p_tnode, char *type, void *value);
|
||||||
int TreeThroughDown(Tree *p_tree, int(*func)(TNode *, unsigned long long height));
|
int TreeThroughDown(Tree *p_tree, int(*func)(TNode *, unsigned long long height));
|
||||||
int TreeThroughUp(Tree *p_tree, int(*func)(TNode *, unsigned long long height));
|
int TreeThroughUp(Tree *p_tree, int(*func)(TNode *, unsigned long long height));
|
||||||
|
int TreeTravel(Tree *p_tree, int(*func)(TNode *, unsigned long long height));
|
||||||
|
|
||||||
|
int releaseTree(Tree *p_tree);
|
||||||
|
int releaseOnlyTree(Tree *p_tree);
|
||||||
|
int releaseTNode(TNode *p_tnode);
|
||||||
|
int releaseOnlyTNode(Tree *p_tree);
|
||||||
|
|
||||||
|
int safeModeForTree(int ifon) {
|
||||||
|
if (ifon == 1) {
|
||||||
|
if (tnode_list == NULL && tree_list == NULL) {
|
||||||
|
tnode_list = (List *)malloc(sizeof(List));
|
||||||
|
tree_list = (List *)malloc(sizeof(List));
|
||||||
|
|
||||||
|
tree_list->head = NULL;
|
||||||
|
tree_list->length = 0;
|
||||||
|
tree_list->tail = NULL;
|
||||||
|
|
||||||
|
tnode_list->head = NULL;
|
||||||
|
tnode_list->length = 0;
|
||||||
|
tnode_list->tail = NULL;
|
||||||
|
|
||||||
|
if_safeModeForTree = 1;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return ifon;
|
||||||
|
}
|
||||||
|
|
||||||
TNode *initTNode(void) {
|
TNode *initTNode(void) {
|
||||||
TNode *p_tnode = (TNode *)malloc(sizeof(TNode));
|
TNode *p_tnode = (TNode *)malloc(sizeof(TNode));
|
||||||
@ -50,6 +86,21 @@ TNode *initTNode(void) {
|
|||||||
p_tnode->type = NULL;
|
p_tnode->type = NULL;
|
||||||
p_tnode->home = initList();
|
p_tnode->home = initList();
|
||||||
p_tnode->room = NULL;
|
p_tnode->room = NULL;
|
||||||
|
if (if_safeModeForTree) {
|
||||||
|
if (if_safeModeForNode) {
|
||||||
|
if_safeModeForNode = 0;
|
||||||
|
Node *s_node = initNode();
|
||||||
|
initMallocValueForTNode(s_node, "pointer", (void *)p_tnode);
|
||||||
|
insertInTail(tnode_list, s_node);
|
||||||
|
if_safeModeForNode = 1;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Node *s_node = initNode();
|
||||||
|
initMallocValueForTNode(s_node, "pointer", (void *)p_tnode);
|
||||||
|
insertInTail(tnode_list, s_node);
|
||||||
|
}
|
||||||
|
}
|
||||||
return p_tnode;
|
return p_tnode;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -57,6 +108,21 @@ Tree *initTree(void) {
|
|||||||
Tree *p_tree = (Tree *)malloc(sizeof(Tree));
|
Tree *p_tree = (Tree *)malloc(sizeof(Tree));
|
||||||
p_tree->id = getId();
|
p_tree->id = getId();
|
||||||
p_tree->root = NULL;
|
p_tree->root = NULL;
|
||||||
|
if (if_safeModeForTree) {
|
||||||
|
if (if_safeModeForNode) {
|
||||||
|
if_safeModeForNode = 0;
|
||||||
|
Node *s_node = initNode();
|
||||||
|
initMallocValueForTNode(s_node, "pointer", (void *)p_tree);
|
||||||
|
if_safeModeForNode = 1;
|
||||||
|
insertInTail(tree_list, s_node);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Node *s_node = initNode();
|
||||||
|
initMallocValueForTNode(s_node, "pointer", (void *)p_tree);
|
||||||
|
insertInTail(tree_list, s_node);
|
||||||
|
}
|
||||||
|
}
|
||||||
return p_tree;
|
return p_tree;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -322,3 +388,104 @@ int _doTreeThroughDown(TNode *p_tnode, int height, int(*func)(TNode *, unsigned
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int TreeTravel(Tree *p_tree, int(*func)(TNode *, unsigned long long height)) {
|
||||||
|
TNode *p_tnode = p_tree->root;
|
||||||
|
unsigned long long height = 0;
|
||||||
|
if (p_tnode != NULL) {
|
||||||
|
int func_back = func(p_tnode, height);
|
||||||
|
while (func_back > -2) {
|
||||||
|
if (func_back > -1) {
|
||||||
|
p_tnode = getChildByIndex(func_back,func_back);
|
||||||
|
func(p_tnode, height + 1);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
p_tnode = p_tnode->father;
|
||||||
|
func(p_tnode, height - 1);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
int releaseTNode(TNode *p_tnode) {
|
||||||
|
if(p_tnode->child_num == 0){
|
||||||
|
releaseList(p_tnode->home);
|
||||||
|
if (p_tnode->father != NULL) {
|
||||||
|
removeChildById(p_tnode->father, p_tnode->id);
|
||||||
|
}
|
||||||
|
if (strcmp(p_tnode->type, "pointer")) {
|
||||||
|
if (!strcmp(p_tnode->type, "list")) {
|
||||||
|
releaseList((List *)p_tnode->value);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
free(p_tnode->value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p_tnode->value = NULL;
|
||||||
|
p_tnode->type = NULL;
|
||||||
|
p_tnode->id = 0;
|
||||||
|
p_tnode->if_malloc = 0;
|
||||||
|
free(p_tnode);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int _doreleaseTree(TNode *p_tnode, int height);
|
||||||
|
|
||||||
|
int releaseTree(Tree *p_tree) {
|
||||||
|
TreeThroughUp(p_tree, _doreleaseTree);
|
||||||
|
p_tree->root = NULL;
|
||||||
|
p_tree->id = 0;
|
||||||
|
free(p_tree);
|
||||||
|
}
|
||||||
|
|
||||||
|
int _doreleaseTree(TNode *p_tnode, int height) {
|
||||||
|
releaseTNode(p_tnode);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int releaseOnlyTree(Tree *p_tree) {
|
||||||
|
p_tree->id = 0;
|
||||||
|
p_tree->root = NULL;
|
||||||
|
free(p_tree);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int releaseOnlyTNode(TNode *p_tnode) {
|
||||||
|
releaseList(p_tnode->home);
|
||||||
|
if (strcmp(p_tnode->type, "pointer")) {
|
||||||
|
if (!strcmp(p_tnode->type, "list")) {
|
||||||
|
releaseList((List *)p_tnode->value);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
free(p_tnode->value);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
p_tnode->value = NULL;
|
||||||
|
p_tnode->type = NULL;
|
||||||
|
p_tnode->id = 0;
|
||||||
|
p_tnode->if_malloc = 0;
|
||||||
|
free(p_tnode);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
int releaseAllForTree(void) {
|
||||||
|
if (if_safeModeForTree) {
|
||||||
|
if_safeModeForTree = 0;
|
||||||
|
Node *p_node = tnode_list->head;
|
||||||
|
while (p_node != NULL) {
|
||||||
|
TNode *p_tnode = (TNode *)p_node->value;
|
||||||
|
releaseOnlyTNode(p_tnode);
|
||||||
|
}
|
||||||
|
Node *p_node = tree_list->head;
|
||||||
|
while (p_node != NULL) {
|
||||||
|
Tree *p_tree = (Tree *)p_node->value;
|
||||||
|
releaseOnlyTree(p_tree);
|
||||||
|
}
|
||||||
|
releaseList(tnode_list);
|
||||||
|
releaseList(tree_list);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user