Exemple #1
0
//删除树的节点
bool tree_delete(s_tree *tree, s_node *node, int leftright)
{
	if (tree == null)
	{
		return false;
	}

	if (node == null)
	{
		return false;
	}

	//删除左子树
	if (leftright == 0)
	{
		tree_delete_node(tree, node->left_child);
		node->left_child = null;
	}
	//删除右子树
	else if (leftright == 1)
	{
		tree_delete_node(tree, node->right_child);
		node->right_child = null;
	}

	//如果是根节点则清空树
	if (node == tree->root)
	{
		tree->root = null;
	}

	return true;
}
Exemple #2
0
//删除节点
void tree_delete_node(s_tree *tree, s_node *node)
{
	if (node == null)
	{
		return;
	}

	//递归删除左子树
	tree_delete_node(tree, node->left_child);
	//递归删除右子树
	tree_delete_node(tree, node->right_child);

	if (node->data != null)
	{
		tree->free_node(node->data);
	}

	//删除左节点
	node->left_child = null;
	//删除右节点
	node->right_child = null;

	//如果是根节点则清空树
	if (node == tree->root)
	{
		tree->root = null;
	}

	free(node);
}
Exemple #3
0
void ami_gui_cert_close(struct session_data *data)
{
	unsigned long i;

	if(data->tree->handle)
	{
		ami_tree_close((struct treeview_window *)data->tree->handle);
		win_destroyed = true;
	}

	assert(data);

/*
	for (i = 0; i < data->num; i++) {
		if (data->certs[i].subject)
			textarea_destroy(data->certs[i].subject);
		if (data->certs[i].issuer)
			textarea_destroy(data->certs[i].issuer);
	}
*/

	if (data->tree) {
		tree_delete_node(data->tree, data->tree->root, false);
		free(data->tree);
	}

	free(data->certs);
	free(data->url);
	free(data);
}
Exemple #4
0
void tree_destroy(Node *node) {
  if (node->left != NULL) {
    tree_destroy(node->left);
  }
  if (node->right != NULL) {
    tree_destroy(node->right);
  }
  tree_delete_node(node);
}
Exemple #5
0
/**
 * Creates a tree entry for a URL, and links it into the tree
 *
 * \param parent     the node to link to
 * \param url        the URL (copied)
 * \param data	     the URL data to use
 * \param title	     the custom title to use
 * \return the node created, or NULL for failure
 */
struct node *tree_create_URL_node(struct tree *tree, struct node *parent,
		const char *url, const char *title,
		tree_node_user_callback user_callback, void *callback_data)
{
	struct node *node;
	struct node_element *element;
	char *text_cp, *squashed;

	squashed = squash_whitespace(title ? title : url);
	text_cp = strdup(squashed);
	if (text_cp == NULL) {
		LOG(("malloc failed"));
		warn_user("NoMemory", 0);
		return NULL;
	}
	free(squashed);
	node = tree_create_leaf_node(tree, parent, text_cp, true, false,
				     false);
	if (node == NULL) {
		free(text_cp);
		return NULL;
	}

	if (user_callback != NULL)
		tree_set_node_user_callback(node, user_callback,
					    callback_data);

	tree_create_node_element(node, NODE_ELEMENT_BITMAP,
				 TREE_ELEMENT_THUMBNAIL, false);
	tree_create_node_element(node, NODE_ELEMENT_TEXT, TREE_ELEMENT_VISITS,
				 false);
	tree_create_node_element(node, NODE_ELEMENT_TEXT,
				 TREE_ELEMENT_LAST_VISIT, false);
	element = tree_create_node_element(node, NODE_ELEMENT_TEXT,
					   TREE_ELEMENT_URL, true);
	if (element != NULL) {
		text_cp = strdup(url);
		if (text_cp == NULL) {
			tree_delete_node(tree, node, false);
			LOG(("malloc failed"));
			warn_user("NoMemory", 0);
			return NULL;
		}
		tree_update_node_element(tree, element, text_cp, NULL);
	}

	return node;
}
Exemple #6
0
void run_tests(void)
{
	Tree_node * tree = tree_create(42);
	Tree_node * node = tree_insert_balanced(tree, 50);
	my_assert(tree_find(tree, 50) == node);
	
	Tree_node * node2 = tree_insert_balanced(tree, 30);
	my_assert(tree_get_height(tree) == 2);
	
	tree_insert_raw(node2, 5, LEFT);
	my_assert(tree->left->left->data == 5);
	
	tree_insert_balanced(tree, 30);
	my_assert(tree->left->left->data == 5);

	tree_delete_node(tree, LEFT);
	my_assert(tree->left == NULL);
	my_assert(tree_get_height(tree) == 2);

	my_assert_conclude();
}
Exemple #7
0
static struct node *sslcert_create_node(const struct ssl_cert_info *cert)
{
	struct node *node;
	struct node_element *element;
	char *text;

	text = messages_get_buff("SSL_Certificate_Subject", cert->subject);
	if (text == NULL)
		return NULL;

	node = tree_create_leaf_node(NULL, NULL, text, false, false, false);
	if (node == NULL) {
		free(text);
		return NULL;
	}
	tree_set_node_user_callback(node, sslcert_node_callback, NULL);

	/* add issuer node */
	element = tree_create_node_element(node, NODE_ELEMENT_TEXT,
					   TREE_ELEMENT_SSL_ISSUER, false);
	if (element != NULL) {
		text = messages_get_buff("SSL_Certificate_Issuer", cert->issuer);
		if (text == NULL) {
			tree_delete_node(NULL, node, false);
			return NULL;
		}
		tree_update_node_element(NULL, element, text, NULL);
	}

	/* add version node */
	element = tree_create_node_element(node, NODE_ELEMENT_TEXT,
					   TREE_ELEMENT_SSL_VERSION, false);
	if (element != NULL) {
		text = messages_get_buff("SSL_Certificate_Version", cert->version);
		if (text == NULL) {
			tree_delete_node(NULL, node, false);
			return NULL;
		}
		tree_update_node_element(NULL, element, text, NULL);
	}

	/* add valid from node */
	element = tree_create_node_element(node, NODE_ELEMENT_TEXT,
					   TREE_ELEMENT_SSL_VALID_FROM, false);
	if (element != NULL) {
		text = messages_get_buff("SSL_Certificate_ValidFrom", cert->not_before);
		if (text == NULL) {
			tree_delete_node(NULL, node, false);
			return NULL;
		}
		tree_update_node_element(NULL, element, text, NULL);
	}


	/* add valid to node */
	element = tree_create_node_element(node, NODE_ELEMENT_TEXT,
					   TREE_ELEMENT_SSL_VALID_TO, false);
	if (element != NULL) {
		text = messages_get_buff("SSL_Certificate_ValidTo", cert->not_after);
		if (text == NULL) {
			tree_delete_node(NULL, node, false);
			return NULL;
		}
		tree_update_node_element(NULL, element, text, NULL);
	}

	/* add certificate type */
	element = tree_create_node_element(node, NODE_ELEMENT_TEXT,
					   TREE_ELEMENT_SSL_CERT_TYPE, false);
	if (element != NULL) {
		text = messages_get_buff("SSL_Certificate_Type", cert->cert_type);
		if (text == NULL) {
			tree_delete_node(NULL, node, false);
			return NULL;
		}
		tree_update_node_element(NULL, element, text, NULL);
	}

	/* add serial node */
	element = tree_create_node_element(node, NODE_ELEMENT_TEXT,
					   TREE_ELEMENT_SSL_SERIAL, false);
	if (element != NULL) {
		text = messages_get_buff("SSL_Certificate_Serial", cert->serial);
		if (text == NULL) {
			tree_delete_node(NULL, node, false);
			return NULL;
		}
		tree_update_node_element(NULL, element, text, NULL);
	}

	/* set the display icon */
	tree_set_node_icon(NULL, node, sslcert_icon);

	return node;
}
Exemple #8
0
int main(void)
{
    //트리를 구성할 루트노드 
    TreeNode *root=NULL;
    //트리에 넣을 값들을 받을 정수형 배열 
    int val[100];
    //반복 구문을 수행할 정수형 변수 
    int i, j;
    
    //트리에 구성할 값들을 입력 받기 
    //설명문 출력 
    printf("트리를 구성할 값을 입력하세요.\n(정수 범위: 1~100 / 최대 100개 입력 가능 / 종료는 101)\n");
    //트리에 넣을 값을 배열에 저장(최대 100번 반복)
    for(i=0;i<100;i++)
    {
         //트리에 넣을 값 입력 
         scanf("%d", &val[i]);
         //101를 입력받으면 반복 종료 
         if(val[i]==101)
              break;
         //입력 범위를 초과하면 
         else if(val[i]>101)
              //오류 메세지 출력 
              error("값을 초과하였습니다.");
    }
    
    //입력 값 출력 및 입력 값 트리에 삽입 
    printf("\n입력 값 \n");
    //입력 한 값들의 갯수만큼 반복 
    for(j=0;j<i;j++)
    {
         //입력 값 확인을 위한 출력 
         printf("%d ", val[j]);
         //입력 값 트리에 삽입 
         tree_insert_node(&root, val[j]);
    }
    //출력 구분을 위한 개행 
    printf("\n-------------------------------------------------------\n");

    //전위 순회 함수를 통해 전위 순회 출력 
    printf("전위 순회 출력 결과\n"); 
    tree_preorder(root);
    
    //중위 순회 함수를 통해 전위 순회 출력 
    printf("\n중위 순회 출력 결과\n"); 
    tree_inorder(root);
    
    //후위 순회 함수를 통해 전위 순회 출력 
    printf("\n후위 순회 출력 결과\n"); 
    tree_postorder(root);
    printf("\n");
    
    //입력 받은 값 트리에서 삭제하기 
    //설명문 출력 
    printf("\n트리에서 삭제할 값을 순서대로 입력하세요!(종료는 101) \n");
    //트리에서 삭제할 값 배열에 저장(최대 100번 반복)
    for(i=0;i<100;i++)
    {
         //삭제할 값 입력 
         scanf("%d", &val[i]);
         //101을 입력받으면 반복 종료 
         if(val[i]==101)
              break;
         //입력 범위를 초과하면 
         else if(val[i]>101)
              //오류 메세지 출력 
              error("값을 초과하였습니다.");
    }
    
    //입력 값 출력 및 입력 값 트리에서 삭제 
    printf("\n입력 값 \n");
    //입력 한 값들의 갯수만큼 반복 
    for(j=0;j<i;j++)
    {
         //삭제 값 확인을 위한 출력 
         printf("%d ", val[j]);
         //트리에서 해당되는 노드 삭제  
         tree_delete_node(&root, val[j]);
    }
    
    //출력 구분을 위한 개행 
    printf("\n-------------------------------------------------------\n");
    //트리 노드 개수 구하는 함수를 통한 개수 출력 
    printf("삭제 후 트리의 노드 개수 : %d\n", tree_get_node_count(root));
    //트리 높이 구하는 함수를 통한 높이 출력 
    printf("삭제 후 트리의 높이 : %d\n", tree_height(root));
    //레벨 순회 함수를 통한 레벨 순회 출력
    printf("삭제 후 트리의 레벨 순회 \n");
    tree_level_order(root); 
    printf("\n");
    
    system("pause");
    return 0;
}
Exemple #9
0
BOOL ami_tree_event(struct treeview_window *twin)
{
	/* return TRUE if window destroyed */
	ULONG class,result,relevent = 0;
	ULONG column;
	uint16 code;
	struct MenuItem *item;
	struct node *treenode;
	struct Node *lbnode;
	struct node_element *element;
	char *text;
//	ULONG editcols[] = {TREE_ELEMENT_TITLE,TREE_ELEMENT_URL};
	static WORD gen=0;

	while((result = RA_HandleInput(twin->objects[OID_MAIN],&code)) != WMHI_LASTMSG)
	{
       	switch(result & WMHI_CLASSMASK) // class
   		{
			case WMHI_GADGETUP:
				switch(result & WMHI_GADGETMASK)
				{
					case GID_TREEBROWSER:
						GetAttrs(twin->gadgets[GID_TREEBROWSER],
							LISTBROWSER_RelEvent,&relevent,
							TAG_DONE);

							switch(relevent)
						{
							case LBRE_DOUBLECLICK:
								GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode);
								GetListBrowserNodeAttrs(lbnode,
									LBNA_UserData,(ULONG *)&treenode,
									TAG_DONE);
								ami_tree_launch_node(twin->tree,treenode);
							break;

							case LBRE_EDIT:
								GetAttrs(twin->gadgets[GID_TREEBROWSER],
									LISTBROWSER_SelectedNode,(ULONG *)&lbnode,
//									LISTBROWSER_RelColumn,(ULONG *)&column,
									TAG_DONE);

								GetListBrowserNodeAttrs(lbnode,
									LBNA_UserData,(ULONG *)&treenode,
									TAG_DONE);

								element = tree_find_element(treenode,TREE_ELEMENT_TITLE);
								GetListBrowserNodeAttrs(lbnode,
									LBNA_Column,column,
									LBNCA_Text,(ULONG *)&text,
									TAG_DONE);
								element->text = (char *)strdup(text);
								tree_handle_node_element_changed(twin->tree, element);
							break;

							case LBRE_HIDECHILDREN:
								GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode);
								GetListBrowserNodeAttrs(lbnode,
									LBNA_UserData,(ULONG *)&treenode,
									TAG_DONE);
								tree_set_node_expanded(twin->tree, treenode, false);
							break;

							case LBRE_SHOWCHILDREN:
								GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode);
								GetListBrowserNodeAttrs(lbnode,
									LBNA_UserData,(ULONG *)&treenode,
									TAG_DONE);
								tree_set_node_expanded(twin->tree, treenode, true);
							break;
						}
					break;

					case GID_OPEN:
						GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode);
						GetListBrowserNodeAttrs(lbnode,
							LBNA_UserData,(ULONG *)&treenode,
							TAG_DONE);
						ami_tree_launch_node(twin->tree,treenode);
					break;

					case GID_NEWF:
						GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode);
						if(lbnode)
						{
							GetListBrowserNodeAttrs(lbnode,
								LBNA_UserData,(ULONG *)&treenode,
								TAG_DONE);
						}
						else
						{
							treenode = twin->tree->root;
						}

						tree_create_folder_node(treenode,(char *)messages_get("TreeNewFolder"));

						ami_recreate_listbrowser(twin);
					break;

					case GID_NEWB:
						ami_new_bookmark(twin);
					break;

					case GID_UP:
						ami_move_node(twin,AMI_MOVE_UP);
					break;

					case GID_DOWN:
						ami_move_node(twin,AMI_MOVE_DOWN);
					break;

					case GID_LEFT:
						ami_move_node(twin,AMI_MOVE_OUT);
					break;

					case GID_DEL:
						GetAttr(LISTBROWSER_SelectedNode,twin->gadgets[GID_TREEBROWSER],(ULONG *)&lbnode);
						GetListBrowserNodeAttrs(lbnode,
							LBNA_UserData,(ULONG *)&treenode,
							TAG_DONE);
						tree_delete_node(twin->tree, treenode, false);
/* We are recreating the list from scratch as there is no obvious easy way
   to delete children from a listbrowser list */
						ami_recreate_listbrowser(twin);
					break;
				}
			break;

/* no menus yet, copied in as will probably need it later
			case WMHI_MENUPICK:
				item = ItemAddress(gwin->win->MenuStrip,code);
				while (code != MENUNULL)
				{
					ami_menupick(code,gwin);
					if(win_destroyed) break;
					code = item->NextSelect;
				}
			break;
*/

			case WMHI_CLOSEWINDOW:
				ami_tree_close(twin);
				return TRUE;
			break;
		}
	}
	return FALSE;
}