2.3.2 建立哈夫曼树的功能模块
此模块功能为使用初始化模块中得到的26 个大写英文字母字符串和空格的权值,将其权值按递增顺序排列,将每个权值作为一颗二叉树,将叶结点所代表的字符存储起来,选出两个权值最小的根结点,改变他们的权值和其对应位置,然后设置新的结点,并设置其双亲指针则最小根结点是新结点的左孩子而次小根结点是新结点的右孩子。对于每个结点而言,既需要知道双亲的信息,又需要知道孩子的信息。因此采用带双亲的孩子链表作为结点的存储结构。则若哈夫曼树有n个叶结点,则最终生成的哈夫曼树有2n-1个结点,所以我们可用一个长度为2n的一文数组存放哈夫曼树中的所有节点。然后利用哈弗曼算法进行哈夫曼树的构造。
2.3.3 建立哈夫曼编码的功能模块 AIX如何删除不正确的路由
每种编码方案都可以对应一颗二叉树,故可以利用二叉树设计二进制前缀编码其编码方案是:用二叉树的叶子结点表示字符,对二叉树中的每个分支结点的左、右分支分别用0和1比进行编码,从树的根结点到叶子结点,沿途路径上所有0和1组成的编码序列作为该叶子结点所代表字符的二进制编码。若字符集中的每个字符都在叶子结点上,则该编码一定是前缀编码。为了得到总厂最短的二进制前缀编码,可用该字符出现的频率作为叶子结点的权赋给该结点,求出此树的最小带权路径长度。用哈夫曼树得到的编码就成为哈弗曼编码。
2.3.4 译码的功能模块
哈夫曼的译码过程就是分解电文中字符串的过程。利用已经构建好的哈夫曼树和已知的哈夫曼编码位串表,首先进行初始化,输入一个二进制编码串,以“*”标志一个字符串编码的结束,若电文没有结束,则重新输入一串新的二进制编码,回到根结点继续进行译码,直到二进制电文全部译完为止。从根结点开始往下搜索时,若编码为0,则进入左孩子;若编码为1,则进入右孩子;若是叶结点,则进行译码,然后继续向下进行搜索,直到所有字符全部译码完成,
2.3.5 存盘功能模块1(将字符串与二进制编码写入文件中):
在哈夫曼树构造完成之后,对相应的字符串惊醒编码和译码,然后将其存盘到对应的区域。利用fputc()函数,从当前文件位置开始向文件输入一个字符,然后利用一个for语句循环,将所有的字符串全部写入到存盘文件中,若返回值为EOF,则表示字符输出失败,否则返回值为c,即与输出的字符相等。哈夫曼树存盘函数Transtotcode(),在用户构建哈夫曼树成功之后,程序通过调用此函数对用户所创建的树进行存盘,并在存盘的文件中显示出每一个结点的左、右孩子及其权值。
2.3.6 存盘功能模块2(将字符串与二进制编码从文件中读出):
在将字符串写入文件之后,可将文件中的字符串以及其对应的二进制编码从文件中读出并在另一个文件中显示出来。利用fget()函数,从当前文件位置开始向文件读出一个字符,然后利用一个for语句循环,将所有的字符串全部读出到另一个存盘文件中,若返回值为EOF,则表示字符读出失败,否则返回当前读出的字符串及其二进制编码。哈夫曼编码存盘函数Transtoncode(),在使用此程序过程中,用户输入的字符串及其相应的编码会被系统通过调用该函数存盘,以便用户查阅。
第三章 详细设计
3.1 哈夫曼树
3.1.1哈夫曼树的定义
哈夫曼树节点的数据类型定义为:
typedef struct{ //哈夫曼树的结构体
char ch;
int weight; //权值 企业应收账款管理问题研究论文+开题报告+任务书
int parent,lchild,rchild;
}tnode,*huftree;
3.1.2哈夫曼算法
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] 下一页