标题:三叉树演示
只看楼主
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
呵呵,我很享受这样的讨论。但总感觉我们俩说的是两件事,silent_world强调的是void *在公用模块中的作用,而我所说的是void *在目前讨论的三叉搜索树模型中的隐患。

对于void *指针的一个典型范例就是stdlib.h中的qsort函数。通过使用void *参数可以使qsort函数对任意类型的数组进行排序。

但是对于tstrie_destroy(void *root)函数,root必须是一个TERNARY_TRIE型指针,君的函数也只能处理TERNARY_TRIE树(在函数里也做了显示转换),所以这个void *的好处在这里并没有得到体现。相反由于它掩盖了传入指针的原有类型,函数内部并不能知道它原来是指向什么的指针,一概当作TERNARY_TRIE处理。当由于某种原因传入一个别的类型指针,编译器不会发出警告,这时会引发不可预知的问题。这是我反对在这里使用void * 的重要原因。

君提出的另一个概念倒是很有意思,工厂模式在C语言里的应用。
我的C语言学习和使用的阶段主要是在初中和高中。上大学后学了两年C++,之后.net异军突起就改学C#了,包括现在主要使用的语言是C#,C只在玩ACM和论坛交流时才用。
我对语言的使一直以来用分的很开,面向对象就要用面向对象的思想,面向过程就用面向过程的角度。
不过,现在,有时间我一定看看设计模式在C语言下的应用方法和案例。

最后,指出一点,君的tstrie_delData函数逻辑不对。

呵呵,我说话过于直,这是个缺陷,silent_world请见谅,希望这不要影响你交流的心情

重剑无锋,大巧不工
2012-08-06 20:24
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
随风写的怎么样了? silent_world的代码也还没修改?

重剑无锋,大巧不工
2012-08-07 13:31
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
得分:0 
呵呵

[ 本帖最后由 silent_world 于 2012-8-7 15:38 编辑 ]
2012-08-07 14:48
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
提供一组测试数据吧。最好写一个能返回树中结点个数的函数,以验证操作的正确性。

顺序插入如下串
abc
abeh
abdi
abfj
此时树中应该有9个结点
删除abeh
此时树中应该有7个结点

重剑无锋,大巧不工
2012-08-07 18:08
beyondyf
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:103
帖 子:3282
专家分:12654
注 册:2008-1-21
得分:0 
明天要出差,提前先把我写的删除函数放上来吧。同步更新第一页完整代码。各位晚安。
程序代码:
void ternary_tree_delete(TERNARY_TREE * tree, char * string)
{
    TERNARY_NODE * pl, * pr, * pt;
   
    if(*tree == NULL) return;
    if(*string == '\0') return;
   
    if((*tree)->key > *string) ternary_tree_delete(&((*tree)->left), string);
    else if((*tree)->key < *string) ternary_tree_delete(&((*tree)->right), string);
    else if(string[1] == '\0') (*tree)->value = 0;
    else ternary_tree_delete(&((*tree)->mid), string + 1);
   
    if((*tree)->mid != NULL || (*tree)->value != 0) return;
   
    pl = (*tree)->left;
    pr = (*tree)->right;
    if(pl == NULL) pl = pr;
    else if(pr != NULL)
    {
        for(pt = pl; pt->right != NULL; pt = pt->right);
        pt ->right = pr;
    }
   
    free(*tree);
    *tree = pl;
}

重剑无锋,大巧不工
2012-08-07 21:56
Susake
Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15
来 自:女儿国的隔壁
等 级:贵宾
威 望:23
帖 子:2288
专家分:6481
注 册:2012-12-14
得分:0 
学习了...能来这个论坛太好了...这样我就知道自己的不足,能够学到很多在学校学不到的东西...和各位独到的见解...
这个必须顶....

仰望星空...........不忘初心!
2013-03-17 01:45



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-374683-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.184804 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved