1、第四次上机作业 第四次上机作业 huffman编码和解码 姓名:黄涛 班级:070921 学号:07092002 指导老师:唐厚俭 上机时间:2010年10月22号 一 、摘要一、实验目的 1、理解Huffman二叉树的概念 2、学会使用Huffman编码对数据进行无损压缩的原理二、试验方法 1、通过对huffman编码和解码的编程,利用指针、数组等进行编写程序代码,并运行结果。 2、深入了解函数的嵌入、递归等方面的运用。 二、内容一、问题重述 Huffman编码是一种常用的压缩编码方法,其基本原理是频繁使用的数据用较短的代码代替,较少使用的数据用较长的代码代替,每个数据的代码各不同。这些代码
2、都是二进制的,且码长是可变的,其实现主要通过借助huffman数即最优二叉树,是一类带权径最短的树。二、问题分析 对于读入一ASCII文件,首先进行打开操作,当然,必须判断能否打开,打开后统计文档中字符出现的频度,并根据频度对每个字符生成Huffman编码,这些编码各不相同,要记录每个字符对应的huffman编码,计算出其总编码的长度,利用其概率算法计算编码效率。 对已编的bhuffman编码进行解码,其解码后生成huffman树,并将其输出、打印。最后要对原始数据、每个字符对应的Huffman编码以及原文档的Huffman编码进行打出处理。三、流程图 4、函数说明 1、输入文件,printf
3、(请输入你要打开的文件名:)通过 if (fp = fopen(name,rt) = NULL ) 判断能否打开,打不开进行存档失败,打开进行下一步操作。 2、对文件进行huffman 编码,首先通过利用 typedef struct node进行函数声明, int weight; struct node *lchild , *rchild , *parent ; struct node *next; HuffmanNode , *HuffmanTree; 定义编码函数:HuffmanNode、HuffmanTree,利用数组逐项进行编码,并且没行对应唯一的编码,对其字符在编码过程中,找出最小
4、的字符利用指针编码,记录其码号,利用for语句依次进行下去 ,输出编码函数,完成函数编码, 3、对已编码完的文件进行解码操作; 首先开程序开始时,对解码函数进行声明:typedef struct char ch; char codeN; CodeNode;;并保存。然后接入huffman编码文件,分成HuffmanTree HT , CodeNode HC , char str三部分,分别进行数据的输入、输出、存储。从零开始记录首个被解码字符,累加进行下去, 最后输出其解码后的数据。 五、结论 通过领用一系列的函数将输入的文件进行huffman编码,解码,完成其要求,正确的解决了huffman
5、编码、解码问题,并运行出了结果。 六、遇到的问题及解决方法 在编程过程中,起初靠里直接输入文件,但其能否打开并不知道,少了步判定,后加入判定,成功输入文件,对文件进行编码,感觉繁琐,故利用for 语句,依次编码,同样也对编码文件进行了解码,总的说来,主要问题出现在后面的huffman树形式的输出以及解码后对解码数据的输出问题。后通过多次调试将其解决,对函数的运用也得到熟悉。 七、程序代码#include #include #include #define M 1000 #define N 128 typedef struct node int weight; struct node *lchi
6、ld , *rchild , *parent ; struct node *next; HuffmanNode , *HuffmanTree; typedef struct char ch; char codeN; CodeNode; int n; void Open(char s) FILE *fp; char name10; int i=0; printf(请输入你要打开的文件名:); gets(name); if (fp = fopen(name,rt) = NULL ) printf(打开文件失败!n); exit(1); si+ = fgetc(fp); while(si-1 !=
7、EOF) si+ = fgetc(fp); si = 0; printf(读取到的字符:n); puts(s); fclose(fp); void Save(char s) FILE *fp; char name10; printf(请输入你要保存的文件名:); gets(name); if (fp = fopen(name,wt) = NULL) printf(保存文件失败!n); exit(1); fputs(s,fp); fclose(fp); void SearchStr(char s , char str , int count) int i , j , k=0; for (i=0
8、; iN ; i+) counti = 0; for (i=0 ; si ; i+) for (j=0 ; jk ; j+) if (strj = si) countj+; break; if (j = k) strk = si; countk+; k+; strk-1 = 0; n = k-1; void SelectMin(HuffmanTree HT , int k , HuffmanTree *HT1 , HuffmanTree *HT2) int i , min; HuffmanTree p; min = 3128; for ( p=HT,i=0 ; inext) if (p-wei
9、ghtparent = NULL) min = p-weight; *HT1 = p ; min = 3128; for ( p=HT,i=0 ; inext) if (p-weightparent = NULL & p!=*HT1) min = p-weight; *HT2 = p ; void CreatHuffmanTree(HuffmanTree *HT , int count) int i; HuffmanTree p , HT1 , HT2; p = *HT = (HuffmanTree)malloc(sizeof(HuffmanNode); p-next = p-lchild =
10、 p-rchild = p-parent = NULL; for (i=0 ; inext = (HuffmanTree)malloc(sizeof(HuffmanNode); p = p-next; p-next = p-lchild = p-rchild = p-parent = NULL; for ( p=*HT ,i=0 ; iweight = counti; p = p-next; for (i=n ; iparent = HT2-parent = p; p-lchild = HT1; p-rchild = HT2; p-weight = HT1-weight + HT2-weigh
11、t; p = p-next; free(p); void CodeHuffman(HuffmanTree HT , CodeNode HC , char str) int i , j , k , x; char ch; HuffmanTree p , q=HT; for (i=0 ; in ; i+) HCi.ch = stri; for (i=0 ; iparent ; p=p-parent) if (p = p-parent-lchild) HCi.codej+ = 0; else HCi.codej+ = 1; HCi.codej = 0; k = j/2; while(jk) /编码反
12、转 ch = HCi.codej-1; HCi.codej-1 = HCi.codex; HCi.codex = ch ; j-; x+; q = q-next; void ToltalCoding(CodeNode HC , char s , char code) int i , j ; code0 = 0; for (i=0 ; si ; i+) for (j=0 ; jparent ; root=root-parent); for (i=0 , p=root ; codei ; i+) if (codei = 0) p = p-lchild; else p = p-rchild; if
13、(p-lchild=NULL & p-rchild=NULL) for (j=0,q=HT ; q!=p ; q=q-next,j+); ssk+ = strj; . p = root; ssk = 0; printf(解码结果:n); puts(ss); void main(void) int i = 0; / char xuanzhe; char sM,ssM; /定义字符串数组,s存放将要编码的字符串,ss存解码后的字符串 char strN; /存放输入的字符串中n个不同的字符 int countN; /存放n个不同字符对应的在原字符串中出现的次数 char codeM; /存放最终编码完成后的编码 / char choice; HuffmanTree HT; /定义一个哈夫曼树的链表 CodeNode HCN; Open(s); SearchStr(s,str,count); CreatHuffmanTree(&HT,count); CodeHuffman(HT,HC,str); for ( i=0 ; in ; i+ ) printf(字符:%ct权值:%dt编码:%sn,stri,counti,HCi.code); ToltalCoding(HC,s,code); Decoding(HT,code,str,ss); free(HT);
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1