字典树(已完成遍历、插入、删除整颗树)
刚想到的,个人觉得挺好玩,只是会占用大量空间。目前只完成了插入,关于打印和遍历,我还需要再想想。
嗯……手头没有编译器,有人来当小白鼠么?
测试的时候,请连续输入两个一模一样的单词,如果第二次输入的单词被打印出来,就可以说暂时成功。
源文件.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编辑过]








