哈夫曼编译码课程设计_第1页
哈夫曼编译码课程设计_第2页
哈夫曼编译码课程设计_第3页
哈夫曼编译码课程设计_第4页
哈夫曼编译码课程设计_第5页
已阅读5页,还剩35页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、一、系统开发的背景二、系统分析与设计系统功能要求 系统模块结构设计三、系统的设计与实现三)四)五)目录初始化哈夫曼树: I NITHUFFMA(NHUFFMANHFM) 编码: ENCODIN(G HUFFMANHFM) 译码: DECODING(HUFFMANHFM) 印代码文件: PRINT(HUFFMANHFM) 印哈夫曼树: TREEPRINT(H UFFMANHFM) 101213四、系统测试14四)五)六)测试 测试 测试 测试 测试MAIN( ) 函数 I NITHUFFMA(NHUFFMANHFM) 函数 ENCODIN(GHUFFMANHFM) 函数 . DECODIN(GH

2、UFFMANHFM) 函数 . PRINT(HUFFMANHFM) 函数 1415151515五、总结六、附件测试 TREEPRINT(HUFFMANHFM) 函数1616代码、部分图表)17哈夫曼编译码器、系统开发的背景利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原) 。对于双工信道(即可以双向传输信息的信道) ,每端都需要一个完整的编 / 译码系统。因此要为这样的信息收发站写一个哈夫曼码的编 / 译码系统,来实现电文的编码、译码和打印输出。、系统分析与设计系统功能要求一

3、个完整的哈夫曼系统应具有以下功能:1)I :初始化(Initialization)。从终端读入字符集大小n,以及n个字符和 n 个权值,建立哈夫曼树,并将它存于文件 hfmTree 中。2)E:编码(Encoding )。利用以建好的哈夫曼树(如不在内存,则从文件 hfmTree 中读入),对文件 ToBeTran 中的正文进行编码,然后将结果存入文件 CodeFile 中。3)D:译码(Decoding)。利用已建好的哈夫曼树将文件 CodeFile中的代码进行译码,结果存入文件 TextFile 中。4)P:印代码文件(Print )。将文件CodeFile以紧凑格式显示在终端上,每行 5

4、0个代码。同时将此字符形式的编码文件写入文件 CodePrin中。5)T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观18的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件Tree Print中。【测试数据】1)利用教科书中的数据调试程序。2)用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“ THIS P ROGRAM IS MY FAVOR”E通过对系统功能的分析,哈夫曼编译码系统功能如图1所示。图11、哈夫曼编译码器系统功能图通过上图的功能分析,把整个系统划分为 6个模块初始化哈夫曼树(Initializat

5、ion),该模块主要实现:从终端读入2、3、4、5、字符集大小n以及n个字符和n个权值,建立哈夫曼树,并将它存于文件 hfmTree 中。借助函数 InitHuffman(Huffman Hfm) 来实现;编码(Encoding),该模块主要实现:利用以建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编 码 , 然 后 将 结 果 存 入 文 件 CodeFile 中 。 借 助 函 数 voidEncoding(Huffman Hfm) 来实现;译码(Decoding),该模块主要实现:利用已建好的哈夫曼树将文件CodeFile 中的代码进行译码

6、,结果存入文件 TextFile 中。借助函数void Decoding(Huffman Hfm) 来实现;印代码文件( Print ),该模块主要实现:将文件 CodeFile 以紧凑格式显示在终端上,每行 50 个代码。同时将此字符形式的编码文件写入文件 CodePrin 中。借助函数 Print(Huffman Hfm) 来实现;印哈夫曼树( Tree Printing ),该模块主要实现:将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件 TreePrint 中。借助函数 Print(HuffmanHfm)来实现;三、系统的设计与实现一

7、) 初始化哈夫曼树: InitHuffman(Huffman Hfm)分析:首先建立一个哈夫曼树,对其进行初始化后,然后依次输入字符和权值的基本信息,存入文件。流程图如图 2 所示。开始J图 2:1 nitHuffman(Huffman Hfm) 流程图该模块的具体代码如下所示。#include <stdio.h>#include <string.h>#include <malloc.h>#include<stdlib.h>#include<ctype.h>#define Maxsize 1000#define Max 100type

8、def char *HuffmanCode;/ 动态分配数组存储哈夫曼表码表 typedef structint weight;int parent,lchild,rchild;HTNode,*HuffmanTree;/ 动态分配数组存储哈夫曼树 typedef structHuffmanTree HT; char *c; int length;HuffmanCode HC;Huffman;/ 全局结构体变量,来存储字符与代码 void Select(HuffmanTree HT,int end,int *s1,int *s2)/ 值最小的两个节点,其序号为int i;int min1=Max

9、size;int min2;for (i=1;i<=end;i+)/s1,s2遍历查找权值最小的结点 S1if (HTi.parent=0&&HTi.weight<min1)*s1=i; min1=HTi.weight; min2=Maxsize; for(i=1;i<=end;i+)/选择 HT1i-1 中无双亲且权遍历查找除 S1 外权值最小的结点 S2if(HTi.parent=0&&(*s1!=i)&&min2>HTi.weight) *s2=i; min2=HTi.weight;Huffman HuffmanCo

10、ding(Huffman Hfm) / 并求出 n 个字符的构造哈夫曼编码 HC存放 n 个字符的权值(均 0),构造哈夫曼树 HT,int i,n,m,s1,s2,start; int c,f; char *cd; n=Hfm.length; if(n<=1) return Hfm; m=2*n-1; for(i=n+1;i<=m;+i) / s2 Select(Hfm.HT,i-1,&s1,&s2); Hfm.HTs1.parent=i;/ Hfm.HTs2.parent=i; Hfm.HTi.lchild=s1;/ Hfm.HTi.rchild=s2;选择 H

11、T1 i-1 中无双亲且权值最小的两个节点,其序号为s1 ,修改父亲位置修改孩子位置Hfm.HTi.weight=Hfm.HTs1.weight+Hfm.HTs2.weight;/ 权值之和/ 从叶子结点到根逆向求每个字符的哈夫曼编码Hfm.HC=(HuffmanCode)malloc(n+1)*sizeof(char *);/ cd=(char *)malloc(n*sizeof(char);/ cdn-1='0'/ for(i=1;i<=n;+i)/ start=n-1;/父亲结点权值为左右孩子分配 n 个字符编码的头指针向量 分配求编码的工作空间编码结束符逐个字符求

12、哈夫曼编码编码结束符位置从叶子到根逆向求编码for(c=i,f=Hfm.HTi.parent;f!=0;c=f,f=Hfm.HTf.parent)/ if(c=Hfm.HTf.lchild) cd-start='0'else cd-start='1'从 cd 复制编码到 Hfm.HCHfm.HCi=(char *)malloc(n-start)*sizeof(char); strcpy(Hfm.HCi,&cdstart);/ free(cd);/ 释放工作空间 return Hfm;输入函数,控制用户输入字符和相应权值Huffman InputHuffm

13、an(Huffman Hfm)/ int i,n; printf(" 请输入字符个数 : "); scanf("%d",&n); if(n<=1) printf(" 只有一个字符 ! 不需要编码 !n");/ 若只有一个数值则无需编码 printf(" 请输入字符个数 : ");scanf("%d",&n); Hfm.HT=(HuffmanTree)malloc(2*n)*sizeof(HTNode);Hfm.c=(char *)malloc(n+1)*sizeof(cha

14、r); for(i=1;i<=n;i+)printf("请输入字符 : ");scanf("%s",&Hfm.ci);printf("请输入这个字符的权值 : ");scanf("%d",&Hfm.HTi.weight);Hfm.HTi.parent=0;Hfm.HTi.lchild=0;Hfm.HTi.rchild=0; for(;i<=2*n-1;+i)Hfm.HTi.weight=0;Hfm.HTi.parent=0;Hfm.HTi.lchild=0;Hfm.HTi.rchild=

15、0;Hfm.length=n; return Hfm;Huffman InitHuffman(Huffman Hfm)/ int n,i,x; FILE *fp; fp=fopen("hfmTree","rt");/ if(fp=NULL) Hfm=InputHuffman(Hfm);/ 数中fp=fopen("hfmTree","wt"); fprintf(fp,"%dn",Hfm.length); for(i=1;i<=Hfm.length;i+)fprintf(fp,"%c

16、 %d ",Hfm.ci,Hfm.HTi.weight); rewind(fp); else 初始化哈夫曼数,要求用户输入字符和相应权值对文件 hfmTree 以读文本的形式打开调用 InputHuffman 函数,用户输入字符和相应权值存入哈夫曼printf(" 字符已存在 !n"); Hfm=InputHuffman(Hfm);/ 调用 InputHuffman 函数,用户输入字符和相应权值存入哈弗 曼数中fp=fopen("hfmTree","w+"); fprintf(fp,"%dn",Hfm.l

17、ength); for(i=1;i<=Hfm.length;i+) fprintf(fp,"%c %d ",Hfm.ci,Hfm.HTi.weight); rewind(fp); fscanf(fp,"%dn",&n);Hfm.c=(char *)malloc(n+1)*sizeof(char); Hfm.HT=(HuffmanTree)malloc(2*n)*sizeof(HTNode); for(i=1;i<=n;i+)将已经在文件中的字符和其fscanf(fp,"%s %d ",&Hfm.ci,&am

18、p;Hfm.HTi.weight);/对应的权重输入到 Hfm.ci 和 &Hfm.HTi.weight 中 for(i=1;i<=n;i+)/ 对每个节点初始化 Hfm.HTi.parent=0;Hfm.HTi.lchild=0;Hfm.HTi.rchild=0; for(;i<=2*n-1;+i) Hfm.HTi.weight=0;Hfm.HTi.parent=0;Hfm.HTi.lchild=0;Hfm.HTi.rchild=0;Hfm.length=n;fclose(fp);Hfm=HuffmanCoding(Hfm);return Hfm;二) 编码: Encod

19、ing (Huffman Hfm )分析:利用已建好的 Huffman 树(如不在内存,则从文件 hfmTre 中读入),对文件中的正文进行编码, 然后将结果存入文件 CodeFile 中。 流程图如图 3 所示。该模块的具体代码如下所示。void Encoding(Hufman Hfm)/ 利用已建好的 Huffman树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。int i=0,j=0, n;char chMax;FILE *fp,*fw;n=H fm.le ngth;if(fw=fo pen ("To

20、BeTra rr,"r+")=NULL)/尝试打开ToBeTranprin tf(" 请输入字符串:n ");scan f("%s",ch);prin tf("n");fp=fo pen ("CodeFile","wt+");elsefscan f(fw,"%s",ch);fclose(fw);while(chj)for(i=1;i<=n ;i+) if(chj=Hfm.ci) fprin tf(fp,"%s",Hfm.HCi);

21、break;j+;prin tf("n");rewi nd(fp);fclose(fp);译码: Decod in g(Huffma n Hfm )分析:利用已建好的Huffman树将文件CodeFile中的代码进行译码,结果存入文件 TextFile中。流程图如图4所示。图 4: Decoding(Huffman Hfm)流程图该模块的具体代码如下所示。void Decoding(Huffman Hfm)/利用已建好的 Huffman树将文件 CodeFile中的代码进行译码,结果存入文件 TextFile 中。HuffmanTree p;int i,n;int j=0;

22、char d500;FILE *fp;n=Hfm.length;if(fp=fopen("CodeFile","r+")=NULL)printf(" 请输入代码 :");scanf("%s",d);elsefscanf(fp,"%s",d);/将文件中的字符输入到数组 d 中fclose(fp);printf(" 文件是 :n ");fp=fopen("TextFile","wt+");/以写入文件的形式打开 TextFilewhile

23、(dj)p=&Hfm.HT2*n-1;while(p->lchild|p->rchild)if(dj='0') i=p->lchild; p=&Hfm.HTi;else i=p->rchild; p=&Hfm.HTi;j+;printf("%c",Hfm.ci);fprintf(fp,"%c",Hfm.ci);19prin tf("n");fclose(fp);(四)印代码文件:Prin t(Huffma n Hfm)分析:将文件CodeFile以紧凑格式显示在终端上流程

24、图。如图5所示。38void Prin t(Huffma n Hfm)输出编码输出,Hfm.ciHfm.HTi.weight输出译码图 5: Printf(Huffman Hfm)流程图该模块的具体代码如下所示。void Print(Huffman Hfm)/将文件CodeFile以紧凑格式显示在终端上,每行50个代码。int i,n;int m=1;/ 计数器char ch;FILE* fprint;n=H fm.le ngth;printf(”输出字符的代码:n");for(i=1;i<=n; i+)/显示每一个字符对应的哈夫曼编码prin tf("n"

25、);prin tf("Weight: %dt",Hfm.HTi.weight);prin tf("Code:");puts(Hfm.HCi);fprin t=fo pen ("CodeFile","rb");while ( feof(fpri nt)=O )ch=fgetc(fpn nt);prin tf("%c",ch);m+;if (m%50=0)/保证每一行输出50个字符prin tf("n");prin tf("n");fclosefpri nt)

26、;(五)印哈夫曼树:Tree Prin t(Huffman Hfm)分析:将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件Tree Print中。如图6所示。/输出编码void TreePri nt(Huffma n Hfm)输出,Hfm.ciHfm.HTi.weight图 6: TreePrintf(Huffman Hfm) 流程图该模块的具体代码如下所示。void Tree Prin t(Huffman Hfm)/将文件CodeFile以紧凑格式显示在终端上,每行50个代码。int i,n;int m=1;/ 计数器char ch;FIL

27、E* fprint;n=H fm.le ngth;printf(”输出字符的代码:n");for(i=1;i<=n; i+)/显示每一个字符对应的哈夫曼编码prin tf("n");prin tf("Weight: %dt",Hfm.HTi.weight);prin tf("Code:");puts(Hfm.HCi);fprin t=fo pen ("CodeFile","rb");while ( feof(fpri nt)=O )ch=fgetc(fpri nt);prin t

28、f("%c",ch);m+;if (m%50=0)/保证每一行输出50个字符prin tf("n");prin tf("n");fclose(fpri nt);四、系统测试(一) 测试mai n()函数测试该函数使用的测试方法,测试的具体步骤,测试的结果。I 初始化 E.编福D虑码 F 印缶码文# 邁夫曲请输人你的选择gPres s any k&y to continue图7: void main()函数测试结果图(二)测试 InitHuffman(Huffman Hfm)函数S. 化 码夫 始码聘體 塁译印se! I E D

29、 P T Q1选乍斜討;冒IT : : 你壬于迦字垦苏务字智咅 入入入入入入入入入入入入入入入人4 i+4r'J4-s;rlr44Ir-i4r44r-idT-4JTr'Mr-14r'?;n-frr4.rr44r4;n-trp- 住冃 壬冃住屈请请佳冃佳月请jiBEjl冃 佳 月灶冃有仕 月佳 冃佳冃(四)(五)图 8: InitHuffman(Huffman Hfm) 函数测试结果图(三)测试 Encoding(Huffman Hfm)函数【I歉麴护TH I s-progeah-i s-nv-FPiuon【teQieaeaioeeeeQBQBOBaeeeoQiQaQBa

30、eaeeeeieeeQ0990000001eei000000000680900000600001eae 0100000000060010QBO0Q001BQaQBaeeOQeOQeOQQ009001eOQeeeQ0000000001a0000001600009090 0i0OQeeoQeeei eQieesQnoQeQsi 0000000000001091 卿盹盹盹00盹。日画盹。00 盹000师腼胴00 01000901016000 00090(100060 90 01 eOQOeQl 000 09900(100066600000000016000 09001600009 000 (<

31、1100000016000 00 006001 0000010001图9: Encoding(Huffman Hfm)函数测试结果图测试 Decoding(Huffman Hfm) 函数般的如T'Hl£-PB0GRfll1-IS-MV-FfiU0FITE图10: Decoding(Huffman Hfm)函数测试结果图测试 Print(Huffman Hfm)函数p择码 选代 I 入字1We xght =Code =r-ChipHe iglit:He ifjht -He ight:lie ight:lie Lght:We igiht:We ight:We ight =ight

32、:475751ia&1543G3154864Code:Code -Code :Gode :Code =Code:Code =Gode:Code =Gode:00000GOGOOQlQ9BQQei3Be0eQQl091QQBQBQeeeQQQSeQ069009BSl69B666GG1eeeeeseeeeeeeeeeedeseai00回0060060600601eeeeeeei图11: Print(Huffman Hfm)函数测试结果图(六)测试 TreePrint(Huffman Hfm)函数ISiMTChap: TUeight:60Code :Chap = HUe 远 hi;=47Co

33、de :00939Q0Q0333030QQ1Omr: I57Code :09909 90Q6OS1Char :We isht =SICod« :00909900000001Gtiar;Weight;186Code :001har :We light:15Code :00939 90009000 03000000001Ghw 二Weight:48Code :0O0QQQ0BBQ0000001Chap:Ueight:Code :Chai* 二Ue i 百 lit =15Code :BQQQQQ0QBQ000 BQQQQBQQBlChav:Ueigbt:48Cod« :00900

34、90000000001Chap:£4Code 'Baaaaoai图 12: TreePrintf(Huffman Hfm)函数测试结果图五、总结系统完成了对所建的哈夫曼树进行初始化、编码、译码、打印输出功 能。但是将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示 在终端上,同时将此字符形式的哈夫曼树写入文件 TreePrint 中比较困难不 能完全实现。通过本次数据结构的课程设计,我学习了很多在上课没懂的 知识,并对求哈夫曼树及哈夫曼编码 / 译码的算法有了更加深刻的了解,更 巩固了课堂中学习有关于哈夫曼编码的知识,真正学会一种算法了。当求 解一个算法时 , 不是拿到

35、问题就不加思索地做,而是首先要先对它有个大概 的了解,接着再详细地分析每一步怎么做,无论自己以前是否有处理过相 似的问题,只要按照以上的步骤,通过认真分析必定会做出来。这次课程设计,我在编辑中犯了不应有的错误,设计统计字符和合并 时忘记应该怎样保存数据,对文件的操作也很生疏,通过查阅 c 语言课本 第十章文件的输入输出,我基本掌握了文件的操作,在不断分析后明确并 改正了错误和疏漏,我的程序更加完善。六、附件(代码、部分图表)#include <stdio.h>#include <string.h> #include <malloc.h> #include&l

36、t;stdlib.h> #include<ctype.h> #define Maxsize 1000 #define Max 100 typedef char *HuffmanCode;/ 动态分配数组存储哈夫曼表码表 typedef structint weight;int parent,lchild,rchild; HTNode,*HuffmanTree;/ 动态分配数组存储哈夫曼树 typedef structHuffmanTree HT; char *c; int length;HuffmanCode HC;选择 HT1i-1 中无双亲且权Huffman;/ 全局结构

37、体变量,来存储字符与代码 void Select(HuffmanTree HT,int end,int *s1,int *s2)/ 值最小的两个节点,其序号为 s1, s2int i;int min1=Maxsize;int min2;遍历查找权值最小的结点 S1for (i=1;i<=end;i+)/ if (HTi.parent=0&&HTi.weight<min1)*s1=i; min1=HTi.weight;min2=Maxsize;遍历查找除 S1 外权值最小的结点 S2for(i=1;i<=end;i+)/if(HTi.parent=0&&

38、amp;(*s1!=i)&&min2>HTi.weight)*s2=i;min2=HTi.weight;Huffman HuffmanCoding(Huffman Hfm) / 存放 n 个字符的权值(均 0),构造哈夫曼树 HT, 并求出 n 个字符的构造哈夫曼编码 HCint i,n,m,s1,s2,start;int c,f;char *cd;n=Hfm.length;if(n<=1) return Hfm;m=2*n-1;选择 HT1 i-1 中无双亲且权值最小的两个节点,其序号为s1 ,for(i=n+1;i<=m;+i) /s2Select(Hfm

39、.HT,i-1,&s1,&s2);修改父亲位置修改孩子位置Hfm.HTs1.parent=i;/Hfm.HTs2.parent=i;Hfm.HTi.lchild=s1;/Hfm.HTi.rchild=s2;Hfm.HTi.weight=Hfm.HTs1.weight+Hfm.HTs2.weight;/ 权值之和/ 从叶子结点到根逆向求每个字符的哈夫曼编码Hfm.HC=(HuffmanCode)malloc(n+1)*sizeof(char *);/ cd=(char *)malloc(n*sizeof(char);/ cdn-1='0'/ for(i=1;i&l

40、t;=n;+i)/start=n-1;/父亲结点权值为左右孩子分配 n 个字符编码的头指针向量 分配求编码的工作空间编码结束符逐个字符求哈夫曼编码编码结束符位置for(c=i,f=Hfm.HTi.parent;f!=0;c=f,f=Hfm.HTf.parent)/从叶子到根逆向求编码if(c=Hfm.HTf.lchild)cd-start='0' else cd-start='1'Hfm.HCi=(char *)malloc(n-start)*sizeof(char); strcpy(Hfm.HCi,&cdstart);/ free(cd);/ 释放工作

41、空间 return Hfm;Huffman InputHuffman(Huffman Hfm)/int i,n;printf(" 请输入字符个数 : "); scanf("%d",&n);if(n<=1) printf(" printf("从 cd 复制编码到 Hfm.HC输入函数,控制用户输入字符和相应权值只有一个字符 ! 不需要编码 !n");/ 若只有一个数值则无需编码 请输入字符个数 : ");scanf("%d",&n);Hfm.HT=(HuffmanTree)m

42、alloc(2*n)*sizeof(HTNode); Hfm.c=(char *)malloc(n+1)*sizeof(char); for(i=1;i<=n;i+)printf("请输入字符 : ");scanf("%s",&Hfm.ci);printf("请输入这个字符的权值 : ");scanf("%d",&Hfm.HTi.weight);Hfm.HTi.parent=0;Hfm.HTi.lchild=0;Hfm.HTi.rchild=0;for(;i<=2*n-1;+i)Hfm.

43、HTi.weight=0;Hfm.HTi.parent=0;Hfm.HTi.lchild=0;Hfm.HTi.rchild=0;Hfm.length=n;return Hfm;初始化哈夫曼数,要求用户输入字符和相应权值Huffman InitHuffman(Huffman Hfm)/int n,i,x;对文件 hfmTree 以读文本的形式打开FILE *fp; fp=fopen("hfmTree","rt");/ if(fp=NULL)调用 InputHuffman 函数,用户输入字符和相应权值存入哈夫曼Hfm=InputHuffman(Hfm);/数

44、中fp=fopen("hfmTree","wt"); fprintf(fp,"%dn",Hfm.length);for(i=1;i<=Hfm.length;i+)fprintf(fp,"%c %d ",Hfm.ci,Hfm.HTi.weight); rewind(fp);elseprintf(" 字符已存在 !n"); Hfm=InputHuffman(Hfm);/ 调用 InputHuffman 函数,用户输入字符和相应权值存入哈弗 曼数中fp=fopen("hfmTree&q

45、uot;,"w+"); fprintf(fp,"%dn",Hfm.length); for(i=1;i<=Hfm.length;i+) fprintf(fp,"%c %d ",Hfm.ci,Hfm.HTi.weight); rewind(fp);elsefscanf(fp,"%dn",&n);for(i=1;i<=n;i+)将已经在文件中的字符和其fscanf(fp,"%s %d ",&Hfm.ci,&Hfm.HTi.weight);/ 对应的权重输入到 Hf

46、m.ci 和 &Hfm.HTi.weight 中 for(i=1;i<=n;i+)/ 对每个节点初始化 Hfm.HTi.parent=0;Hfm.HTi.lchild=0;Hfm.HTi.rchild=0;for(;i<=2*n-1;+i)Hfm.HTi.weight=0;Hfm.HTi.parent=0;Hfm.HTi.lchild=0;Hfm.HTi.rchild=0;Hfm.length=n;fclose(fp);Hfm=HuffmanCoding(Hfm);return Hfm;CodeFile 中。void Encoding(Huffman Hfm)/ 利用已建好

47、的 Huffman 树(如不在内存,则从文件 hfmTree 中 读入),对文件 ToBeTran 中的正文进行编码,然后将结果存入文件int i=0,j=0,n;char chMax;FILE *fp,*fw;n=Hfm.length;尝试打开 ToBeTranif(fw=fopen("ToBeTran","r+")=NULL)/printf(" 请输入字符串: n ");scanf("%s",ch);printf("n");fp=fopen("CodeFile",&quo

48、t;wt+");elsefscanf(fw,"%s",ch);fclose(fw);while(chj)for(i=1;i<=n;i+)if(chj=Hfm.ci)printf("%s",Hfm.HCi);fprintf(fp,"%s",Hfm.HCi);break;j+;printf("n");rewind(fp);fclose(fp);void Decoding(Huffman Hfm)/ 利用已建好的 Huffman 树将文件 CodeFile 中的代码进行译码, 结果存入文件 TextFil

49、e 中。HuffmanTree p;int i,n;int j=0;char d500;FILE *fp;n=Hfm.length; if(fp=fopen("CodeFile","r+")=NULL)printf(" 请输入代码 :");scanf("%s",d);else将文件中的字符输入到数组 d 中fscanf(fp,"%s",d);/ fclose(fp);printf(" 文件是 :n ");以写入文件的形式打开 TextFilefp=fopen("Te

50、xtFile","wt+");/ while(dj)p=&Hfm.HT2*n-1;while(p->lchild|p->rchild)if(dj='0') i=p->lchild; p=&Hfm.HTi; else i=p->rchild; p=&Hfm.HTi;j+;printf("%c",Hfm.ci);fprintf(fp,"%c",Hfm.ci);printf("n");fclose(fp);void Print(Huffman Hf

51、m)/ 将文件 CodeFile 以紧凑格式显示在终端上,每行 50 个代码。int i,n;int m=1;/ 计数器char ch;FILE* fprint;n=Hfm.length;printf(" 输出字符的代码 :n");for(i=1;i<=n;i+)/ 显示每一个字符对应的哈夫曼编码 printf("n");printf("Char: %ct",Hfm.ci);printf("Weight: %dt",Hfm.HTi.weight);printf("Code: ");puts

52、(Hfm.HCi);fprint=fopen("CodeFile","rb"); while ( feof(fprint)=0 ) ch=fgetc(fprint); printf("%c",ch); m+;保证每一行输出 50 个字符if (m%50=0)/ printf("n");printf("n"); fclose(fprint);将文件 CodeFile 以紧凑格式显示在终端上,每行 50 个代码。void TreePrint(Huffman Hfm)/int i,n;int m=1;/ 计数器char ch; FILE* fp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论