N 开始 判断当前结点是否有孩子结点 YouBiao<<1,sDepth++ Y 向其左结点 当前结点是否有 左孩子结点点 Y N 当前结点是否有 右孩子结点 Y youBiao,sDepth与结 N 点返回其父结点 Y 当前结点是否有 父结点 youBiao为Haffman N 编码值即 当前结点的左右 N 孩子是否都已访 Y youBiao<<1丨0x01,sDepth++;结点指向其右
文件的压缩编码成功 (3)“输出”部分是最重要的部分,也是最易出错的部分。每个字符要能合理的结束。这主要是为解压缩考虑的,比如在最后,这里涉及到C语言的位操作,要求这个算法能处理好以下几个问题:
1)每个字符所对应的haffCode的比特位长度由5~23位不等长,不可少输, 多输,输错任何一位,后一个字符的haffCode要紧跟在前一个字符的haffCode后面。
2)最后一个要输出的haffCode的最后一位,它恰好是位于最后一个有效字符的第一位,剩下的七个空位是要用无效的haffCode加以填充的。否则,如果填充的haffCode亦为某个ascii字符的haffCode时,那么在解压缩时,则该在原被压缩文件中不存在的字符便会无中生有的在解压后的文件中出现,这显然是不正确的,应在程序中加以处理。 当文件不为空时 N Y count = 0 N count<8 Y 当前的一个字符对应 的Y haffCode已输出完毕 读入被压缩文件的下一个字符,得到其 haffCode,设为 curCode,如是最后一 N 个字符,则做相应y的处理 Count++ 将curCode中的当前位赋值给输 出字符左起的第count个位置 输出字符到压缩文件
(4)main 函数部分
开始
是否成功输入 N 要打开文件
名称
Y
N 是否找到
key.txt文件
Y 将 key 文件中的值作为叶 子结点构建 haffman树
实现 haffman 编码
输 出 ASCII 码 对 应 的 haffman 编码及其长度 返回 输出字符到 压缩文件 文件压缩结束,关闭打开的 文件
七、测试结果及分析: 运行结果:
压缩情况:
相关推荐: