赫夫曼编码的编码与译码课程设计-Read.doc

赫夫曼编码的编码与译码课程设计-Read.doc

赫夫曼编码的编码与译码课程设计 下面有一个通用赫夫曼译码器,与赫夫曼编码与译码的和两个附件.程序本人都调试过正解无语,如对赫夫曼编码还有其它问题请联系我.QQ:156148347 nbsp; 本人绝对是自己编写,如转其它地方请注明 转:无忧小子. 谢谢,这可是我2个星期的结晶 呵呵??觉得简单了,恰好我今天建了一棵哈树,实现了哈编码。 方法:打开文件,按字符读入,用数组统计每个字母的出现的次数?作为权值, 再利用该数组内容作为输入创建哈夫曼树, 然后利用栈先根遍历该树,进入左子树栈压0,右子树压1,到达叶节点时 从栈底至栈顶输入栈内容,即为哈编码。 三、 实验要求: 根据设计要求和分析,要实现本设计,必须实现以下几个方面的功能: (1) 赫夫曼树的建立; (2) 赫夫曼编码的生成; (3) 编码文件的译码。 要实现赫夫曼树算法,首先要实现在HT[1..k]中选择parent为0且权值最小的两个根结点的选择算法;另外,还要有一个实现统计输入电文字符串(str)中各种字符出现的频率以及字符的种类的算法。 具体要求统计一段文字str(只有大写字符或者全为小写字符)中出现的字符种类k,并统计显示每个字符出现的次数。 然后要求以上面的统计结果求出这些字符(k个)对应的赫夫曼编码,将其写入一个文件A,然后再对输入的文字str进行编码,将生成的编码写入另一个文件B。然后再对B进行译码,并将最终的结果直接显示出来。 #include stdio.h struct 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)

1亿VIP精品文档

相关文档