回复 39楼 silent_world
平时探讨的问题多在基础算法的编码技巧点这像的微观层面,很高兴能在工程项目这样的宏观角度和你交流。
我不是职业搞软件的,做过的项目排除IDE自动生成的部分一般也就几千行代码的规模。不过我对软件工程的兴趣并不亚于对算法的兴趣。
而且我做OO开发的时间远多于做PO的时间,所以对于代码架构也有一点个人的见解。
关于头指针。可能是我们的理解不同,因为我的代码用的也是头指针。对树的操作也是通过头指针完成的。
咱俩算法的一个重要的不同在于我的树不带头结点,而你的树是带头结点的。
这里需要强调的一点,头结点并不是树根,而是一个指向树根的引导结点。头结点的作用本就是替代头指针。
树带不带头结点的操作方式是不同的,很难说哪种好哪种坏,需要具体问题具体分析。
因为我的树是不带头结点的,我的头指针直接指向树根结点,操作中需要用二级指针来处理头指针的指向问题。
而你的树是有头结点的,至于这个结点该置于栈内还是置于堆内,我想我们的出发点不同。我想,你考虑的是树的生命周期独立于其创建线程(函数)的生命周期的情况。
只是其作用在你的代码里没有体现出来,却引发了麻烦。
再谈谈代码封装和复用的问题。我也很注重代码的内聚性和耦合性以及通用性。
如果你TERNARY_TRIE结构的cur_property域设计成void *型指针我会很赞同。这可以扩大你的三叉树的使用范围。这是一种复用设计。
但是你的destroy、add、del等函数,它们不是通用函数,是专用函数。你的这些函数只能操作TERNARY_TRIE树对不对?
如果误传入其它类型的指针将导致不可预知的问题。所以这里用void * 指针毫无意义,反而埋下了祸根。这不是可以复用的部分。
三叉搜索树的作用等同于字典键值对,可以实现对键的压缩存储(键头的相同部分可以共用)。值是可以复用的部分,可以是文件地址,可以是IP值等等各种特征值。而树的结构和操作不是可以复用的部分。
很遗憾你现在工作忙。等闲下来有时间了再完成你的代码吧。到时候我们可以更进一步地讨论一些更细节的问题。