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

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

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

源文件.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
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
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
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
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 11楼 九转星河
一样的嘛,new只要后缀是.c,不会造成冲突,我试过的vs没有冲突。

但Dev估计有冲突,因为曾经this这个变量名,Dev就不准我用,我靠。

BUG已经解决。但我怀疑有内存泄漏,你帮我看下吧,我下午不知道有时间没,希望下午继续下雨,好不上班。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-04 12:13
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 13楼 九转星河
我写的这个结构,效率怎样,不知道,但好玩就够了。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-04 13:32
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 15楼 九转星河
在工作地了,我的小手机不太方便,等下班再看。

原来有人这么感了,哈哈。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-04 13:45
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
还是看了下你贴的链接,他说比散列快耶,表示怀疑,不过我不懂散列,算啦,先不深究这个。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-04 13:50
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 18楼 九转星河
我没用倒字母占用节点呀,每个节点都是一个完整的单词。只是现在还是初级版本。而且单词是否合法,由另外的函数检查更好。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-06-04 14:22
快速回复:字典树(已完成遍历、插入、删除整颗树)
数据加载中...
 
   



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

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