免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 5695 | 回复: 10
打印 上一主题 下一主题

[C] 发一个自己DIY的可以把二叉树实时画成直观图的函数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-12-03 17:30 |只看该作者 |倒序浏览
很久没来这里了,最近测试各种平衡动态二叉树,发现光靠gdb特别麻烦并且不直观。
因此花了几个小时做了一个小工具,可以把二叉树的内存数据生成一个直观的图例。
下图是一个实时生成的二叉树样子:

虽然丑了一点,但是个人认为对新手在学习和调试二叉树,特别是直观了解各种二叉树增删操作有极大帮助。
如果在每一个操作前后各生成一次这个图例,大家将很容易看到二叉树各个节点的变化,这对于我们调试优化代码都有好处。
注意,每次生成的结果是一个时间为文件名的html文件。
具体如何使用:
下载附件的treemap.zip
里面有如下文件:
test.c: 测试程序,大家照着它做就好了
tree_map.h: 你需要包含的头文件, 里面也有对函数调用的说明
libtree_map.so,libtree_map.a:你在编译时需要引入的库
*.html: 偶使用随机数生成的二叉树的实时直观图

编译: 在linux下打开附件包,执行gcc -c test.c ,gcc -o a.out test.o libtree_map.a
然后 ./a.out 20 这样即可测试。

限制:linux (unix 我没有测试),gcc 2.9.6

大家个人随意使用,但是还是不要抄到论文,或者应用到商业目的任何项目当中

treemap.zip

8.41 KB, 下载次数: 234

论坛徽章:
0
2 [报告]
发表于 2008-12-03 17:38 |只看该作者
支持一下

论坛徽章:
0
3 [报告]
发表于 2008-12-03 17:38 |只看该作者
看起来挺精致的,收藏了

论坛徽章:
0
4 [报告]
发表于 2008-12-03 18:30 |只看该作者
支持一下,收藏后再看

论坛徽章:
0
5 [报告]
发表于 2008-12-03 18:32 |只看该作者
用html文件来绘制图的想法很不错,lz为什么不把源码放出来呢

论坛徽章:
0
6 [报告]
发表于 2008-12-03 18:35 |只看该作者
下来看看,对楼主的行为表示赞赏。

论坛徽章:
0
7 [报告]
发表于 2008-12-04 09:36 |只看该作者
这不是激怒我发出来俺用VC做的画图程序吗?
不过不放源码确实有些可惜啊

[ 本帖最后由 duanjigang 于 2008-12-4 09:37 编辑 ]

论坛徽章:
0
8 [报告]
发表于 2008-12-04 10:40 |只看该作者

回复 #1 xuediao 的帖子

支持楼主放出源代码,供大家参考学习

论坛徽章:
0
9 [报告]
发表于 2008-12-04 12:17 |只看该作者
本帖最后由 starfuck 于 2019-11-26 23:55 编辑












论坛徽章:
0
10 [报告]
发表于 2008-12-04 16:21 |只看该作者
昨天发的比较匆忙, 现在补充一下。
这个工具可以供任意的二叉树使用,只要你的二叉树的节点数据结构包含如下咚咚:
1) 一个指向左子节点的指针;
2) 一个指向右子节点的指针;
说实话,我还没碰到过二叉树节点的结构中没有包含这两个玩意的 :)
大家在调用之前还应该实现一个接口 typedef char* (*print_node)(void *node);
这接口和c# JAVA中的 object.toString()一个意思,就是打印节点, 你想咋输出就咋输出。 如果你不实现的话,工具包将会越俎代庖, 打印出节点的地址。
举例说明:
假如二叉树节点结构为:
struct tree_item{
       int value;
       tree_item_t * pnode;       /* parent item */
       tree_item_t * lnode;       /* left item */
       tree_item_t * rnode;       /* right item */
};

实现的接口为:
static char *output_node(void *node){
    tree_item_t *cur = (tree_item_t *)node;
    char *buf = malloc(64);
    snprintf(buf, 64, "%d", cur->value);
    return buf;
}

那么调用生成图例的方式为:
DO_TREE_MAP(tree.root, tree_item_t, lnode, rnode, output_node);

如何,应该用起来非常简单吧。
懒得将这个结果画成jpg图片,个人认为,用html能够更快更简单的实现,何必去搞复杂的玩意呐?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP