start=n-1;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent) if(HT[f].lchild==c) cd[--start]='0';
else cd[--start]='1';
HC[i]=(char *)malloc((n-start)*sizeof(char)); strcpy(HC[i],&cd[start]); }
3.3译码:
基本思想:根据编码的具体过程,逆向推导。从第一个数值开始,如果为零则代表沿左节点元素,如果为一则代表右节点方向 主要步骤及主要功能函数: if(*code=='0')
find(HT,code,text,HT[m].lchild,m); else
find(HT,code,text,HT[m].rchild,m);
for(i=0;p[i]!='\\0';i++) //把译码好的字符存入文件textfile.txt中 fputc(p[i],fw);
3.4输出哈夫曼树:
基本思想:以凸凹的形式表现哈夫曼树的结构。首先统计叶子结点个数,然后构造一个矩阵,没有元素存在时用空格代替,否则将节点的权重值打印在终端 主要步骤及主要功能函数: (1)首先统计叶子节点的总个数 for(i=1;i<=2*n-1;i++) {
for (j=0;T[i][j]!=0;j++) {
if(T[i][j]==' ') {
printf(\ fputc(T[i][j],fp); } else
{printf(\ }
printf(\}
(2)建立矩阵,利用元素和空格构造一个凸凹的图像,直观的表现结构图,其中元素所在的列数即为在哈夫曼树中所在的层数
void Convert_tree(unsigned char T[100][100],int s,int *i,int j)
{ int k,l; l=++(*i); for(k=0;k
Convert_tree(T,s+1,i,HT[j].lchild); if(HT[j].rchild)
Convert_tree(T,s+1,i,HT[j].rchild); T[l][++k]='\\0'; }
3.5数据结构的定义
//////////////////////////////////////////////////////////////////////////////
/*定义赫夫曼树结点的结构体变量,存放结点的权值、字符、双亲、坐孩子和右孩子*/ typedef struct{
int weight;
char ch; //增加一个域用于存放该节点的字符 int parent,lchild,rchild; }HTNode,*HuffmanTree;
typedef char **HuffmanCode; //指向赫夫曼编码的指针
四.调试
4.1菜单选择及初始化哈夫曼树界面
4.2编码
将编码结果写入codefile文件中
4.3译码
在textfile文件中写入译码结果
4.4以凹凸表形式打印哈夫曼树
为简便输入,我们选取几个较少的元素作为范例,对其进行输入和赋值,元素为{a.b.c.d.e.f.g.h.i.j},对应的权重值为{1.2.3.4.5.6.7.8.9.0},运行
五.总结
通过这次的综合训练让我对所学的知识加深了印象,要想学好c语言要重在实践,要通过不断的上机操作才能更好地学习它尤其是对算法有更深的认识。对整个程序的设计,算法是非常重要的,设计程序的整体框架,就是利用算法进行设计,在短短的几天里,我们去图书馆或在网上查找了很多资料,学了一些以前没有接触过的函数,以此来完善程序的功能。然而很多函数虽然用的语法没错,但是不能运用自如,为自己所用。最后逐步完善各个函数的功能模块,同时算法也有了一定的认识。这些都为以后的学习和实践,提高自身能力有很大的帮助,本