数据结构实验报告-文件压缩.doc

上传人:大米 文档编号:397341032 上传时间:2023-02-15 格式:DOC 页数:19 大小:142KB
返回 下载 相关 举报
数据结构实验报告-文件压缩.doc_第1页
第1页 / 共19页
数据结构实验报告-文件压缩.doc_第2页
第2页 / 共19页
数据结构实验报告-文件压缩.doc_第3页
第3页 / 共19页
数据结构实验报告-文件压缩.doc_第4页
第4页 / 共19页
数据结构实验报告-文件压缩.doc_第5页
第5页 / 共19页
点击查看更多>>
资源描述

《数据结构实验报告-文件压缩.doc》由会员分享,可在线阅读,更多相关《数据结构实验报告-文件压缩.doc(19页珍藏版)》请在金锄头文库上搜索。

1、数据结构与程序设计实验实 验 报 告课程名称数据结构与程序设计实验课程编号0906550实验项目名称 文件压缩学号年级姓名专业计算机科学与技术学生所在学院计算机学院指导教师杨静实验室名称地点21B276哈尔滨工程大学实验报告四实验课名称:数据结构与程序设计实验实验名称:文件压缩班级:学号:姓名: 时间:2016.04.21一、问题描述 哈夫曼编码是一种常用的数据压缩技术,对数据文件进行哈夫曼编码可大大缩短文件的传输长度,提高信道利用率及传输效率。要求采用哈夫曼编码原理,统计文本文件中字符出现的词频,以词频作为权值,对文件进行哈夫曼编码以达到压缩文件的目的,再用哈夫曼编码进行译码解压缩。l 统计

2、待压缩的文本文件中各字符的词频,以词频为权值建立哈夫曼树,并将该哈夫曼树保存到文件HufTree.dat 中。l 根据哈夫曼树(保存在HufTree.dat 中)对每个字符进行哈夫曼编码,并将字符编码保存到HufCode.txt 文件中。l 压缩:根据哈夫曼编码,将源文件进行编码得到压缩文件CodeFile.dat。l 解压:将CodeFile.dat 文件利用哈夫曼树译码解压,恢复为源文件。二、数据结构设计 由于哈夫曼树中没有度为1的结点,则一棵树有n个叶子结点的哈夫曼树共有2n-1个结点,可以存储在一个大小为2n-1的一维数组中,而且对每个结点而言,即需知双亲结点的信息,又需知孩子结点的信

3、息,由此可采用如下数据结构。1.使用结构体数组统计词频,并存储: typedef struct Nodeint weight; /叶子结点的权值char c; /叶子结点int num; /叶子结点的二进制码的长度LeafNodeN;2.使用结构体数组存储哈夫曼树: typedef structunsigned int weight;/权值unsigned int parent, LChild, RChild;HTNode,HuffmanM+1; /huffman树3.使用字符指针数组存储哈夫曼编码表:typedef char *HuffmanCode2*M; /haffman编码表三、算法设

4、计1.读取文件,获得字符串void read_file(char const *file_name, char *ch)FILE *in_file = Fopen(file_name, r);unsigned int flag = fread(ch, sizeof(char), N, in_file);if(flag = 0)printf(%s读取失败n, file_name);fflush(stdout);printf(读入的字符串是: %snn, ch);Fclose(in_file);int len = strlen(ch);chlen-1 = 0;2.统计叶子结点的字符和权值并存储vo

5、id CreateLeaf(char ch, int *ch_len, LeafNode leaves, int *leaf_num)int len,j,k;int tag;*leaf_num=0;/叶子节点个数/统计字符出现个数,放入CWfor(len=0; chlen!=0; len+)/遍历字符串ch tag=1;for(j=0; jlen; j+)if(chj=chlen)tag=0;break;if(tag)/ *leaf_num =0 不用leaves+*leaf_num.c=chlen;leaves*leaf_num.weight=1;for(k=len+1; chk!=0; k

6、+)/在之后的字符串中累计权值if(chlen=chk)leaves*leaf_num.weight+;/权值累加*ch_len=len;/字符串长度3创建HuffmanTree,并存储创建:void CreateHuffmanTree(Huffman ht,LeafNode w,int n)int i,j;int s1,s2;/初始化哈夫曼树for(i=1;i=n;i+)hti.weight =wi.weight;hti.parent=0;hti.LChild=0;hti.RChild=0;for(i=n+1;i=2*n-1;i+)hti.weight=0;hti.parent=0;hti.

7、LChild=0;hti.RChild=0;for(i=n+1;i=2*n-1;i+)for(j=1;j=i-1;j+)if(!htj.parent)break;s1=j; /找到第一个双亲为零的结点for(;jhtj.weight?j:s1;hts1.parent=i;hti.LChild=s1;for(j=1;j=i-1;j+)if(!htj.parent)break;s2=j; /找到第二个双亲为零的结点for(;jhtj.weight?j:s2;hts2.parent=i;hti.RChild=s2;hti.weight=hts1.weight+hts2.weight;/权值累加存储:

8、void save_HufTree(Huffman ht, LeafNode le, int ln)int i;FILE *HufTree = Fopen(HufTree.dat, a);CreateHuffmanTree(ht, le, ln);printf(n哈夫曼树n);printf(编号 权值 parent LChild RChildn);/fputs(编号|权值|parent|LChild|RChildn, HufTree);for(i=1; i=2*ln-1; i+) /*打印Huffman树的信息*/printf(%dt%dt%dt%dt%dn, i, (ht)i.weight,

9、 (ht)i.parent, (ht)i.LChild, (ht)i.RChild);fprintf(HufTree, %d | %d | %d | %d | %dn, i, (ht)i.weight, (ht)i.parent, (ht)i.LChild, (ht)i.RChild);Fclose(HufTree);printf(哈弗曼树已保存至HufTree.datn);4.读取哈夫曼树至新的结构体数组void read_HufTree(Huffman ht) /记得从1开始存储int i = 1, j;FILE *HufTree = Fopen(HufTree.dat, r);while

10、(fscanf(HufTree, %d | %d | %d | %d | %dn,&j, &(ht)i.weight), &(ht)i.parent), &(ht)i.LChild), &(ht)i.RChild) = 5)/printf(%dt%dt%dt%dn, (ht)i.weight, (ht)i.parent, (ht)i.LChild, (ht)i.RChild);i+;Fclose(HufTree);printf(已从HufTree.dat读取哈弗曼树n);5.根据哈夫曼树生成每个叶子结点的编码 void CrtHuffmanNodeCode(Huffman ht, char c

11、h, HuffmanCode code_of_leaf, LeafNode weight, int m, int n)int i,c,p,start;char *cd;cd=(char *)malloc(n*sizeof(char);cdn-1=0;/末尾置0for(i=1;i=n;i+)start=n-1; /cd串每次从末尾开始c=i;p=hti.parent;/p在n+1至2n-1while(p) /沿父亲方向遍历,直到为0start-;/依次向前置值if(htp.LChild=c)/与左子相同,置0cdstart=0;else /否则置1cdstart=1;c=p;p=htp.pare

12、nt;weighti.num=n-start; /二进制码的长度(包含末尾0)code_of_leafi=(char *)malloc(n-start)*sizeof(char);strcpy(code_of_leafi,&cdstart);/将二进制字符串拷贝到指针数组code_of_leaf中free(cd);/释放cd内存6.保存每个叶子结点的信息void save_HufCode(Huffman ht, char *ch, HuffmanCode code_of_leaf, LeafNode leaves, int ch_len, int leaf_num)int i;FILE *Hu

13、fCode = Fopen(HufCode.txt, a);CrtHuffmanNodeCode(ht, ch, code_of_leaf, leaves, ch_len, leaf_num); /叶子结点的编码printf(n每个叶子节点的前缀码n); /打印叶子结点的编码for(i=1; i=leaf_num; i+)printf(%c: %sn,leavesi.c, code_of_leafi);fprintf(HufCode, %c: %sn, leavesi.c, code_of_leafi);Fclose(HufCode);printf(每个叶子节点的前缀码已保存至HufCode.tx

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 办公文档 > PPT模板库 > 总结/计划/报告

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号