- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构与程序设计实验
实 验 报 告
课程名称 数据结构与程序设计实验 课程编号 0906550 实验项目名称 文件压缩 学号 2014061221 年级 2014 姓名 马攀 专业 计算机科学与技术 学生所在学院 计算机学院 指导教师 杨静 实验室名称地点 21B276
哈尔滨工程大学
实验报告四
实验课名称:数据结构与程序设计实验 实验名称:文件压缩 班级: 学号: 姓名: 时间:2016.04.21 一、问题描述
哈夫曼编码是一种常用的数据压缩技术,对数据文件进行哈夫曼编码可大大缩短文件的传输长度,提高信道利用率及传输效率。要求采用哈夫曼编码原理,统计文本文件中字符出现的词频,以词频作为权值,对文件进行哈夫曼编码以达到压缩文件的目的,再用哈夫曼编码进行译码解压缩。
? 统计待压缩的文本文件中各字符的词频,以词频为权值建立哈夫曼树,
并将该哈夫曼树保存到文件HufTree.dat 中。
? 根据哈夫曼树(保存在HufTree.dat 中)对每个字符进行哈夫曼编码,并
将字符编码保存到HufCode.txt 文件中。
? 压缩:根据哈夫曼编码,将源文件进行编码得到压缩文件CodeFile.dat。
? 解压:将CodeFile.dat 文件利用哈夫曼树译码解压,恢复为源文件。
二、数据结构设计
由于哈夫曼树中没有度为1的结点,则一棵树有n个叶子结点的哈夫曼树共有2n-1个结点,可以存储在一个大小为2n-1的一维数组中,而且对每个结点而言,即需知双亲结点的信息,又需知孩子结点的信息,由此可采用如下数据结构。
1.使用结构体数组统计词频,并存储:
typedef struct Node{
int weight; //叶子结点的权值
char c; //叶子结点
int num; //叶子结点的二进制码的长度
}LeafNode[N];
2.使用结构体数组存储哈夫曼树:
typedef struct{
unsigned int weight;//权值
unsigned int parent, LChild, RChild;
}HTNode,Huffman[M+1]; //huffman树
3.使用字符指针数组存储哈夫曼编码表:
typedef char *HuffmanCode[2*M]; //haffman编码表
三、算法设计
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(读入的字符串是: %s\n\n, ch);
Fclose(in_file);
int len = strlen(ch);
ch[len-1] = \0;
}
2.统计叶子结点的字符和权值并存储
void CreateLeaf(char ch[], int *ch_len, LeafNode leaves, int *leaf_num){
int len,j,k;
int tag;
*leaf_num=0;//叶子节点个数
//统计字符出现个数,放入CW
for(len=0; ch[len]!=\0; len++){//遍历字符串ch[]
tag=1;
for(j=0; jlen; j++){
if(ch[j]==ch[len]){
tag=0;
break;
}
}
if(tag){// *leaf_num =0 不用
leaves[++*leaf_num].c=ch[len];
leaves[*leaf_num].weight=1;
for(k=len+1; ch[k]!=\0; k++)//在之后的字符串中累计权值
if(ch[len]==ch[k])
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=
您可能关注的文档
最近下载
- 25题技术研发工程师岗位常见面试问题含HR问题考察点及参考回答.docx VIP
- 2025年《开学第一课》.ppt VIP
- 烟草物流师3级专业知识复习提纲下发版课件.docx
- Grundfos格兰富计量泵SMART Digital S, DDA, DDC, DDE up to 30 lph (Data Booklet)产品选型手册.pdf
- 2023年新版GMP成品运输确认.docx VIP
- 河北省阜平县石漕沟水库枢纽工程可行性研究报告的审查意见.docx
- 22G101 三维彩色立体图集.docx VIP
- 预留预埋施工.pdf VIP
- 某公司卓越绩效管理手册.pdf VIP
- 中国石化零售管理系统站级平台用户操作手册.doc VIP
文档评论(0)