首先定义一个结构tnode,其中成员word名字,match匹配情况,以及左右子树的指针.
主函数与原书的没什么大的变化.多了一个获取参数的功能.
判断是否有参数,并且判断参数字符串的首字符是不是'-'.是的话将这个数值复制给变量num.否则默认为6复制给num.
初始化root根节点.
循环体判断式中的getword函数读取单词并保存在word数组中.
然后判断读取的单词首字符是不是字母同时判断这个单词是否达到了字符数的要求.
调用addtreex函数,将根节点root和读取的首个单词word和要求分组的字符数num还有匹配状态变量found传给addtreex函数,返回的是root的指针.
然后用treexprint输出这个二叉树.
看一下addtreex函数的内容.
传入的是空指针的情况.
首先初始化当前节点的内容(现在是根节点).
分配空间,将单词复制给成员.目前匹配状态和初始化左右子树.
然后不是空指针的情况.
通过判断式调用compare函数进行判断.
先进入compare函数看一下.
这个函数有一个地方我想了半天.
if(s == '\0')
这个判断式t与s前面一样,但是s结束了t后面还有的情况怎么办.
这里是因为外面的for循环体有了一个条件就是s == t,执行里面判断式的前提条件就是s和t相等,如果不相等就不会执行后面的判断式也不会造成直接返回0.因为s到'\0'而t没到的话for判断式就为假从而结束这个for循环.
如果s =='\0'为真的话就是说t和s完全一样.所以可以略过,因为这歌程序不计数,只需要输出打印一次就可以.所以只保留一个
.
found = YES;
p->match = YES;
这两个匹配状态理解起来麻烦一点.
首先说found这个匹配状态是为了给下一个节点准备的.
getword读取一个单词后会调用addtreex函数准备将其放入二叉树,然后调用compare对比,(目前单词还没放入二叉树)匹配成功后将p->match也就是已经在树中的那个单词节点的成员变为匹配状态.
然后将found也变为匹配状态(这个匹配状态是为了这个新读入的单词准备的.)
然后再调用addtreex函数将其放入二叉树.
因为这是一个新节点,所以需要创建它,那么这个节点的match成员就通过found进行初始化.
这就是found的作用.
网友评论