ImageVerifierCode 换一换
格式:DOCX , 页数:15 ,大小:53.98KB ,
资源ID:25110156      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/25110156.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第四次上机作业.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第四次上机作业.docx

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