/* XXX Not using */ si_t application_quit() { si_t i, n; struct object * addr; /* 有多少个窗口 */ n = vector_size(&(global_application.window_vector)); /* 依次删除窗口 */ for(i = n - 1; i >= 0; -- i) { addr = vector_at(&global_application.window_vector, i); /* 这里没有逐个注销窗口类对象或者它的派生类对象。 因为窗口管理程序收到用户应用程序的退出请求后, 会释放关于这个用户应用程序的所有资源。 */ /* 释放这棵树 */ object_tree_free(addr->parent); /* 从窗口向量中删除这个节点 */ vector_erase(&global_application.window_vector, i); } vector_exit(&global_application.window_vector); event_listener_exit(&global_application.app_event_listener); uds_exit(&global_application.uds); free(global_application.name); return 0; }
si_t object_tree_free(struct object * root) { /* 释放左子树 */ if(root->lchild != NULL) { /* root->lchild 左子节点的地址 */ object_tree_free(root->lchild); } /* 释放右子树 */ if(root->rchild != NULL) { /* root->rchild 右子节点的地址 */ object_tree_free(root->rchild); } /* root->node.data 与 root 的值一样 */ free(root); return 0; }
si_t application_exit() { struct object * addr; si_t i, n; /** * release focus list **/ list_exit(&(global_application.focus_list)); /* 有多少个窗口 */ n = vector_size(&(global_application.window_vector)); /* 依次删除窗口 */ for(i = n - 1; i >= 0; -- i) { addr = vector_at(&(global_application.window_vector), i); /* 这里没有逐个注销窗口类对象或者它的派生类对象。 因为窗口管理程序收到用户应用程序的退出请求后, 会释放关于这个用户应用程序的所有资源。 */ /* 释放这棵树 */ object_tree_free(addr->parent); /* 从窗口向量中删除这个节点 */ vector_erase(&(global_application.window_vector), i); } vector_exit(&(global_application.window_vector)); if(0 != cancel_application()) { EGUI_PRINT_ERROR("failed to cancle application"); } event_listener_exit(&global_application.app_event_listener); queue_exit(&global_application.message_queue); uds_exit(&global_application.uds); free(global_application.name); free(global_application.icon_root_path); term_restore(); return 0; }
int main() { srand(time(NULL)); while (1) { ui_t count; struct node_t *tree = NULL; if(scanf("%lu", &count)==EOF) { break; } tree = random_tree(count); print_tree(tree); object_tree_free(OBJECT_POINTER(tree)); } return 0; }
/* 如果 obj 有左子节点 那么这个左子节点并不是 obj 子对象 所以在析构以 obj 为根的树之前一定要要将 obj->lchild 成员清空 如果 obj 在对象树中 那么完成删除工作后一定要更新 root->parent 的 lchild 成员和 rchild 成员 这是为了保证遍历的正确 */ si_t object_remove(struct object * obj) { struct object * tree; /* obj 有父对象 */ if(obj->parent != NULL) { /* 找到这棵树根节点的父节点 */ /* 没有的话 tree == NULL */ tree = object_get_root(obj)->parent; /* obj 是由父节点右子节点 */ if(obj == obj->parent->rchild) { /* obj 没有左子节点 */ /* parent 的下一层对象只有 obj */ if(obj->lchild == NULL) { /* 清除父节点中的指针 */ obj->parent->rchild = NULL; } /* obj 有左子节点 */ /* parent 的下一层有多个对象 */ else { /* 处理 obj 同层的对象 */ obj->parent->rchild = obj->lchild; obj->lchild->parent = obj->parent; /* 清空 obj->lchild */ obj->lchild = NULL; } } /* obj 是由父节点左子节点 */ /* 此时 parent 的下一层有多个对象 */ else if(obj == obj->parent->lchild) { /* obj 没有左子节点 */ /* obj 处于末端 */ if(obj->lchild == NULL) { /* 清除父节点中的指针 */ obj->parent->lchild = NULL; } /* obj 有左子节点 */ /* obj 处于中间 */ else { /* 处理 obj 同层的对象 */ obj->parent->lchild = obj->lchild; obj->lchild->parent = obj->parent; /* 清空 obj->lchild */ obj->lchild = NULL; } } /* 删除 obj 以及它的所有子对象 */ object_tree_free(obj); /* obj 在对象树中 */ /* 必须更新 root->parent 节点的 lchild 成员和 rchild 成员 */ /* 此时 tree == root->parent */ if(tree != NULL) { /* 更新最左边节点 */ tree->lchild = object_tree_l_most_node(tree->parent); /* 更新最右边节点 */ tree->rchild = object_tree_r_most_node(tree->parent); } } /* 没有父对象 */ else { /* 清空 obj->lchild */ obj->lchild = NULL; /* 删除 obj 以及它的所有子对象 */ object_tree_free(obj); } return 0; }