赫夫曼编码的编码与译码课程设计
下面有一个通用赫夫曼译码器,与赫夫曼编码与译码的和两个附件.程序本人都调试过正解无语,如对赫夫曼编码还有其它问题请联系我.QQ:156148347nbsp; 本人绝对是自己编写,如转其它地方请注明转:无忧小子.谢谢,这可是我2个星期的结晶呵呵??觉得简单了,恰好我今天建了一棵哈树,实现了哈编码。方法:打开文件,按字符读入,用数组统计每个字母的出现的次数?作为权值,再利用该数组内容作为输入创建哈夫曼树,然后利用栈先根遍历该树,进入左子树栈压0,右子树压1,到达叶节点时从栈底至栈顶输入栈内容,即为哈编码。
三、 实验要求:根据设计要求和分析,要实现本设计,必须实现以下几个方面的功能:(1) 赫夫曼树的建立;(2) 赫夫曼编码的生成;(3) 编码文件的译码。要实现赫夫曼树算法,首先要实现在HT[1..k]中选择parent为0且权值最小的两个根结点的选择算法;另外,还要有一个实现统计输入电文字符串(str)中各种字符出现的频率以及字符的种类的算法。具体要求统计一段文字str(只有大写字符或者全为小写字符)中出现的字符种类k,并统计显示每个字符出现的次数。然后要求以上面的统计结果求出这些字符(k个)对应的赫夫曼编码,将其写入一个文件A,然后再对输入的文字str进行编码,将生成的编码写入另一个文件B。然后再对B进行译码,并将最终的结果直接显示出来。#include stdio.hstruct string{ /*该结构体用于字符统计时*/char type[2]; /*定义字符数组,以存放字符码表*/int apper; /*该表达出现了多少次*/}a_z[26],what[26]; /*定义两个结构变量*/typedef struct
{ unsigned int weight ; //结点权值unsigned int parent,lchild,rchild;//结点的父指针,左右孩子指针}HTNode,*HuffmanTree; //动态分配数组存储哈夫曼树typedef char **HuffmanCode ; //动态分配数组存储哈夫曼编码表/*在HT[1...t]中选择parent不为0且权值最小的两个结点,其序号分别为s1和s2*/void Select(HuffmanTree *HT,int *s1,int *s2,int limit){int i,m,n;m=n=10000;for(i=1;i=limit-1;i++){ if( ((*HT).parent==0) ( (*HT).weightm || (*((*HT)+i)).weightn ))if(mn){n=(*((*HT)+i)).weight ;(*s2)=i ;}else{m=(*((*HT)+i)).weight ;(*s1)=i ;}}if( (*s1) (*s2) ){ i=(*s1);(*s1)=(*s2);(*s2)=i;}}/*构建啥夫曼树,并且使用指针w引用主函数的权值*/void CreateHuffmanTree(HuffmanTree *HT,unsigned int *w,int n){ /*定义HT为二级指针,使传过来的值具有双向性,w存放结点的权值,n为结点数*/int i,m,s1,s2;HuffmanTree p;m=2*n-1;*HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));/*动态申请空间,相当于申请数组*/for(p=*HT+1,i=1;i=n;i++,p++){(*p).weight=w[i-1];/*给结点赋权值*/(*p).parent=(*p).lchild=(*p).rchild=0;/*初始化时,双亲和孩子结点都为0*/}for(;i=m;i++,p++)(*p).weight=(*p).parent=(*p).lchild=(*p).rchild=0;for(i=n+1;i=m;i++){ /*为第剩下结点分配孩子结点,并且赋权值给其结点*/Select(HT,s1,s2,i); /*调用选择输入小结点的函数*/(*HT)[s1].parent=((*HT)+s2)-parent=i;/*这行语句及以下几句为指针与数组的等介形式*/(*((*HT)+i)).lchild=s1;(*((*HT)+i)).rchild=s2;(*((*HT)+i)).weight=(*((*HT)+s1)).weight+(*((*HT)+s2)).weight;}}void HuffmanC
原创力文档

文档评论(0)