回复 13楼 beyondyf
hehe,首先,非常感谢beyondyf对代码的评价。可能你不是做计算机软件的,对代码的看法,咱俩还有些不同的地方。
为什么要用到这个头指针呢?
1、这个embed_xuel做嵌入式,应该比较清楚,早期的平台,好些是不支持全局变量的,如早期brew,飞利浦。
在开发过程中,基本采用设计模式中的单一模式,即再添加两个接口global_getXXXmodule() 和 global_setXXXmodule();
2、代码复用原则。在软件工程中,有一项是代码封装性和复用性。作为对外模块,需保证操作的内闭性。
大家可以看看一些软件工程的书籍。呵呵。
3、void指针的设置。如果作为一个公共使用模块,和代码封装有关。也保证代码在不同平台中,移植的方便性。
4、tstrie_destroy()是采用树的深度优先释放,如果对树的线索化比较熟悉,应能明白。
头指针的释放还存在问题,并且有crash现象,改为如下即可。
void tstrie_destroy(void *root)
{
TERNARY_TRIE *me = (TERNARY_TRIE *)root;
TERNARY_TRIE *preNode = 0, *curNode = 0;
preNode = curNode = me->child_trie[TERNARY_MIDDLE];
while(curNode)
{
while(curNode->child_trie[TERNARY_LEFT])curNode = curNode->child_trie[TERNARY_LEFT];
if(curNode->child_trie[TERNARY_MIDDLE])
curNode = curNode->child_trie[TERNARY_MIDDLE];
else if(curNode->child_trie[TERNARY_RIGHT])
curNode = curNode->child_trie[TERNARY_RIGHT];
else
{
preNode = curNode->parent;
if(preNode)
{
if(preNode->child_trie[TERNARY_LEFT] == curNode)
preNode->child_trie[TERNARY_LEFT] = 0;
else if(preNode->child_trie[TERNARY_MIDDLE] == curNode)
preNode->child_trie[TERNARY_MIDDLE] = 0;
else if(preNode->child_trie[TERNARY_RIGHT] == curNode)
preNode->child_trie[TERNARY_RIGHT] = 0;
}
TSTRIE_DELNODE(curNode);
curNode = preNode;
}
}
}
关于内存释放,建议大家做这么一个事情,对malloc和free再封装一层,添加一些地址打印语句,就可以看出来内存释放的问题了。
呵呵,偶最近忙得一塌糊涂,实在没有时间测试。
代码本身也还存在一些bug,多谢beyondyf指出。
非常感谢各位对代码关注。呵呵,代码也没有什么版权的问题。
偶只是开发习惯而已,大家可以随意操作
[
本帖最后由 silent_world 于 2012-8-6 13:25 编辑 ]