| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 8298 人关注过本帖, 1 人收藏
标题:字典树(已完成遍历、插入、删除整颗树)
只看楼主 加入收藏
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
结帖率:95.65%
收藏(1)
已结贴  问题点数:100 回复次数:43 
字典树(已完成遍历、插入、删除整颗树)
刚想到的,个人觉得挺好玩,只是会占用大量空间。
目前只完成了插入,关于打印和遍历,我还需要再想想。

嗯……手头没有编译器,有人来当小白鼠么?

测试的时候,请连续输入两个一模一样的单词,如果第二次输入的单词被打印出来,就可以说暂时成功。

源文件.cpp后缀通不过编译,所以记得确保源文件后缀为.c

09:58 06/04
    已经可以运行,但是怎么遍历好坑的样子,我还需要再想想。
10:08 06/04
    遍历已完成。
11:58 06/04
    发现BUG一枚,还未解决。(已解决)
12:36 06/04
    发现新的BUG,当一个单词逐一减少字母,例如jack,jac,ja,j的时候,会出现判断错误。(已解决)
19:36 06/04
    完成删除整颗树,但始终怀疑会造成内存泄漏,这感觉真不好。(同一文件循环10次读取插入、删除整颗树获得结果,并没有内存泄漏)


程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define T List
typedef struct T *T;
struct T{
    T ChList[ 26 ];
    char *Word;
    };

void
InsertList( T *Root, char *src );

void
Print( T Root );

void
DelList( T *Root );

int
main( void )
{
    T Root;
    char word[ 100 ];

    Root = NULL;    
         
    while( NULL != fgets( word, 100, stdin ) )
    {
        word[ strlen( word ) - 1 ] = '\0';
        InsertList( &Root, word );
    }

    Print( Root );
    DelList( &Root );
    
    return 0;
}


void
InsertList( T *Root, char *src ) //目前还是初级版本,所以不检查src是否是单词,同时也不检查是否含有非字母,所以测试的时候请输入全字母组成的单词。
{
    T new;
    T next;
    char *dst;
    
    dst = src;
    
    while( '\0' != *src )
    {
        while( NULL == ( next = *Root ) ) 
        {
            new = ( T )calloc( 1, sizeof( struct T ) );
            if( NULL == new )
                exit( EXIT_FAILURE );
            new->Word = NULL;
            *Root = new;
        }

        Root = &next->ChList[ tolower( *src ) - 'a' ] ;   
        src++;
    }

    if( NULL == ( *Root ) )
    {
        new = ( T )calloc( 1, sizeof( struct T ) );
        if( NULL == new )
            exit( EXIT_FAILURE );
        new->Word = strdup( dst );
        *Root = new;
    }
    else if( NULL == ( *Root )->Word )
        ( *Root )->Word = strdup( dst );
    else
        printf( "%s 在表中\n", ( *Root )->Word );
}

void
Print( T Root )
{
    int ix;

    if( NULL == Root )
        return;
    if( NULL != Root->Word )
        printf( "%s\n",Root->Word );
    for( ix = 0; 26 > ix; ++ix )
        Print( Root->ChList[ ix ] );
}


void
DelList( T *Root )
{
    int ix;

    if( NULL == *Root )
        return;
    for( ix = 0; 26 > ix; ++ix )
        DelList( &( *Root )->ChList[ ix ] );
    if( NULL != ( *Root )->Word )
    {
        free( ( *Root )->Word );
        ( *Root )->Word = NULL;
    }
    free( *Root );
    *Root = NULL;
}


 

[此贴子已经被作者于2017-6-4 19:44编辑过]

搜索更多相关主题的帖子: 编译器 单词 空间 
2017-06-04 09:12
Jesehuang
Rank: 2
等 级:论坛游民
威 望:1
帖 子:6
专家分:59
注 册:2017-6-2
收藏
得分:25 
dayinga.obj - 1 error(s), 0 warning(s)
2017-06-04 09:38
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 2楼 Jesehuang
编译信息,截图。

现在我手头上有编译器了,修改之后,代码可以运行了。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-04 09:40
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10539
专家分:42927
注 册:2014-5-20
收藏
得分:25 
T new;
......
new = ( T )calloc( 1, sizeof( struct T ) );

T 是结构类型还是结构指针类型?
2017-06-04 09:41
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 4楼 吹水佬
T是结构指针。
struct T 是结构类型

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-04 09:45
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 4楼 吹水佬
源文件cpp后缀通不过编译,原因说的次数太多,我懒得说了。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-04 09:47
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:25 
哈希~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-04 11:39
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
这哈希加树结构单词较多的时候的确遍历效率无与伦比~还有记得释放空间~
不过如果输入单词较少的时候好像空间消耗很大~而且啊~能改进一下么~边遍历时边记录单词到栈堆里面~至于单词有没有存在用一个状态变量标记就行了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-04 11:58
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 8楼 九转星河
不知道这是什么玩意儿,但绝对是树就对了。
其他的先缓缓,有个BUG还没解决。

先想想想想想想…………

至于是什么BUG,你编译一下,依次输入 a  b  c  d就知道了。

我知道问题出在哪儿,但没想到解决的办法。

[此贴子已经被作者于2017-6-4 12:03编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-04 12:01
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 9楼 renkejun1942
先吃饭~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-06-04 12:05
快速回复:字典树(已完成遍历、插入、删除整颗树)
数据加载中...
 
   



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

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