⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 gdsl_bstree.c

📁 一个通用的C语言实现的数据结构
💻 C
📖 第 1 页 / 共 2 页
字号:
    return t;}/******************************************************************************//* Search functions of binary search trees                                    *//******************************************************************************/extern gdsl_element_tgdsl_bstree_search (const gdsl_bstree_t t, gdsl_compare_func_t f, void* v){    _gdsl_bintree_t n;    assert (t != NULL);     n = bstree_search (ROOT (t), SENT (t), f ? f : t->comp_f, v);    return (n == NULL) ? NULL : CONTENT (n);}/******************************************************************************//* Parse functions of binary search trees                                     *//******************************************************************************/extern gdsl_element_tgdsl_bstree_map_prefix (const gdsl_bstree_t t, gdsl_map_func_t map_f, 			void* d){    assert (t != NULL);    assert (map_f != NULL);    return bstree_prefix_parse (ROOT (t), SENT (t), map_f, d);}extern gdsl_element_tgdsl_bstree_map_infix (const gdsl_bstree_t t, gdsl_map_func_t map_f, void* d){    assert (t != NULL);    assert (map_f != NULL);    return bstree_infix_parse (ROOT (t), SENT (t), map_f, d);}extern gdsl_element_tgdsl_bstree_map_postfix (const gdsl_bstree_t t, gdsl_map_func_t map_f, 			 void* d){    assert (t != NULL);    assert (map_f != NULL);    return bstree_postfix_parse (ROOT (t), SENT (t), map_f, d);}#if 0extern gdsl_element_tgdsl_bstree_level_parse (const gdsl_bstree_t t, gdsl_map_func_t map_f, void* d){    assert (t != NULL);    assert (map_f != NULL);    /* !! TO DO... !! */    return NULL;}#endif/******************************************************************************//* Input/output functions of binary search trees                              *//******************************************************************************/extern voidgdsl_bstree_write (const gdsl_bstree_t t, gdsl_write_func_t write_f, FILE* file,		   void* d){    assert (t != NULL);    assert (write_f != NULL);    assert (file != NULL);    bstree_write (ROOT (t), SENT (t), write_f, file, d);}extern voidgdsl_bstree_write_xml (const gdsl_bstree_t t, gdsl_write_func_t write_f, 		       FILE* file, void* d){    assert (t != NULL);    assert (file != NULL);    fprintf (file, "<GDSL_BSTREE REF=\"%p\" NAME=\"%s\" CARD=\"%ld\">\n",	     (void*) t, t->name, t->card);    bstree_write_xml (ROOT (t), SENT (t), write_f, file, d);    fprintf (file, "</GDSL_BSTREE>\n");}extern voidgdsl_bstree_dump (const gdsl_bstree_t t, gdsl_write_func_t write_f, FILE* file, 		  void* d){    assert (t != NULL);    assert (file != NULL);    fprintf (file, "<GDSL_BSTREE REF=\"%p\" NAME=\"%s\" CARD=\"%ld\">\n",	     (void*) t, t->name, t->card);    fprintf (file, "<GDSL_BSTREE_SENT REF=\"%p\" LEFT=\"%p\" RIGHT=\"%p\" PARENT=\"%p\"/>\n", 	     (void*) SENT (t), (void*) LEFT (SENT (t)), 	     (void*) RIGHT (SENT (t)), (void*) PARENT (SENT (t)));    bstree_dump (ROOT (t), SENT (t), write_f, file, d);    fprintf (file, "</GDSL_BSTREE>\n");}/******************************************************************************//* Private functions                                                          *//******************************************************************************/static gdsl_element_t default_alloc (void* e){    return e;}static void default_free (gdsl_element_t e){    ;}static long int default_comp (gdsl_element_t e, void* key){    return 0;}static void bstree_free (_gdsl_bintree_t n, _gdsl_bintree_t sent, gdsl_free_func_t f){    if (n != sent)	{	    bstree_free (LEFT (n), sent, f);	    bstree_free (RIGHT (n), sent, f);	    f (CONTENT (n));	    free (n);	}}static ulongbstree_height (_gdsl_bintree_t n, _gdsl_bintree_t sent){    if (n == sent)	{	    return 0UL;	}    if (LEFT (n) == sent && RIGHT (n) == sent)	{	    return 0UL;	}    return (ulong) (1UL + 		    GDSL_MAX (bstree_height (LEFT (n), sent),			      bstree_height (RIGHT (n), sent)));}static _gdsl_bintree_tbstree_search (_gdsl_bintree_t root, _gdsl_bintree_t sent, gdsl_compare_func_t f, void* v){    int comp;    while (root != sent)	{	    comp = f (CONTENT (root), v);	    if (comp == 0)		{		    return root;		}	    if (comp > 0)		{		    root = LEFT (root);		}	    else		{		    root = RIGHT (root);		}	}    return NULL;}static _gdsl_bintree_tbstree_next (gdsl_bstree_t t, _gdsl_bintree_t n){    n = RIGHT (n);    while (LEFT (n) != SENT (t))	{	    n = LEFT (n);	}    return n;}static gdsl_element_tbstree_prefix_parse (_gdsl_bintree_t root, _gdsl_bintree_t sent, 		     gdsl_map_func_t map_f, void* user_data){    if (root != sent)	{	    gdsl_element_t e = CONTENT (root);	    if (map_f (e, get_location (root, sent), user_data) == GDSL_MAP_STOP) 		{		    return e;		}	    bstree_prefix_parse (LEFT (root), sent, map_f, user_data);	    bstree_prefix_parse (RIGHT (root), sent, map_f, user_data); 	}    return NULL;}static gdsl_element_tbstree_infix_parse (_gdsl_bintree_t root, _gdsl_bintree_t sent, 		    gdsl_map_func_t map_f, void* user_data){    if (root != sent)	{	    gdsl_element_t e;	    bstree_infix_parse (LEFT (root), sent, map_f, user_data);	    e = CONTENT (root);	    if (map_f (e, get_location (root, sent), user_data) == GDSL_MAP_STOP) 		{		    return e;		}	    bstree_infix_parse (RIGHT (root), sent, map_f, user_data);	}    return NULL;}static gdsl_element_tbstree_postfix_parse (_gdsl_bintree_t root, _gdsl_bintree_t sent, 		      gdsl_map_func_t map_f, void* user_data){    if (root != sent)	{	    gdsl_element_t e;	    bstree_postfix_parse (LEFT (root), sent, map_f, user_data);	    bstree_postfix_parse (RIGHT (root), sent, map_f, user_data);	    e = CONTENT (root);	    if (map_f (e, get_location (root, sent), user_data) == GDSL_MAP_STOP) 		{		    return e;		}	}    return NULL;}static voidbstree_write (_gdsl_bintree_t n, _gdsl_bintree_t sent, 	      gdsl_write_func_t write_f, FILE* file, void* d){    if (n != sent)	{	    bstree_write (LEFT (n), sent, write_f, file, d);	    write_f (CONTENT (n), file, get_location (n, sent), d);	    bstree_write (RIGHT (n), sent, write_f, file, d);	}}static voidbstree_write_xml (_gdsl_bintree_t n, _gdsl_bintree_t sent, 		  gdsl_write_func_t write_f, FILE* file, void* d){    if (n != sent)	{	    bstree_write_xml (LEFT (n), sent, write_f, file, d);	    if (LEFT (n) == sent && RIGHT (n) == sent)		{		    fprintf (file, "<GDSL_BSTREE_LEAF REF=\"%p\"", (void*) n);		}	    else		{		    fprintf (file, "<GDSL_BSTREE_NODE REF=\"%p\"", (void*) n);		}	    if (LEFT (n) != sent || RIGHT (n) != sent)		{		    if (LEFT (n) != sent)			{			    fprintf (file, " LEFT=\"%p\"", (void*) LEFT (n));			}		    else			{			    fprintf (file, " LEFT=\"\"");			}	  		    if (RIGHT (n) != sent)			{			    fprintf (file, " RIGHT=\"%p\"", (void*) RIGHT (n));			}		    else			{			    fprintf (file, " RIGHT=\"\"");			}		}	    if (PARENT (n) != sent)		{		    fprintf (file, " PARENT=\"%p\">", (void*) PARENT (n));		}	    else		{		    fprintf (file, " PARENT=\"\">");		}	    if (write_f != NULL)		{		    write_f (CONTENT (n), file, get_location (n, sent), d);		}	    if (LEFT (n) == sent && RIGHT (n) == sent)		{		    fprintf (file, "</GDSL_BSTREE_LEAF>\n");		}	    else		{		    fprintf (file, "</GDSL_BSTREE_NODE>\n");		}	    bstree_write_xml (RIGHT (n), sent, write_f, file, d);	}}static voidbstree_dump (_gdsl_bintree_t n, _gdsl_bintree_t sent, 	     gdsl_write_func_t write_f, FILE* file, void* d){    if (n != sent)	{	    bstree_dump (LEFT (n), sent, write_f, file, d);	    if (LEFT (n) == sent && RIGHT (n) == sent)		{		    fprintf (file, "<GDSL_BSTREE_LEAF REF=\"%p\"", (void*) n);		}	    else		{		    fprintf (file, "<GDSL_BSTREE_NODE REF=\"%p\"", (void*) n);		}	    if (CONTENT (n) != NULL)		{		    fprintf (file, " CONTENT=\"%p\"", (void*) CONTENT (n));		}	    else		{		    fprintf (file, " CONTENT=\"\"");		}	    fprintf (file, " LEFT=\"%p\" RIGHT=\"%p\"", (void*) LEFT (n), (void*) RIGHT (n));	    if (PARENT (n) != NULL)		{		    fprintf (file, " PARENT=\"%p\">", (void*) PARENT (n));		}	    else		{		    fprintf (file, " PARENT=\"\">");		}	    if (write_f != NULL)		{		    write_f (CONTENT (n), file, get_location (n, sent), d);		}	    if (LEFT (n) == sent && RIGHT (n) == sent)		{		    fprintf (file, "</GDSL_BSTREE_LEAF>\n");		}	    else		{		    fprintf (file, "</GDSL_BSTREE_NODE>\n");		}	    bstree_dump (RIGHT (n), sent, write_f, file, d);	}}static gdsl_location_tget_location (_gdsl_bintree_t n, _gdsl_bintree_t s){    gdsl_location_t location = GDSL_LOCATION_UNDEF;    if (PARENT (n) == s)	{	    location |= GDSL_LOCATION_ROOT;	}    if (LEFT (n) == s && RIGHT (n) == s)	{	    location |= GDSL_LOCATION_LEAF;	}    return location;}/** EMACS ** * Local variables: * mode: c * c-basic-offset: 4 * End: */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -