当前位置:文档之家› 数据结构 用哈夫曼编码实现文件压缩

数据结构 用哈夫曼编码实现文件压缩

《用哈夫曼编码实现文件压缩》
实验报告
课程名称数据结构B
实验学期201 至201 学年第学期学生所在系部计算机学院
年级专业班级
学生姓名学号
任课教师
实验成绩
用哈夫曼编码实现文件压缩
1、了解文件的概念。

2、掌握线性链表的插入、删除等算法。

3、掌握Huffman树的概念及构造方法。

4、掌握二叉树的存储结构及遍历算法。

5、利用Huffman树及Huffman编码,掌握实现文件压缩的一般原理。

微型计算机、Windows 系列操作系统、Visual C++6.0软件
根据ascii码文件中各ascii字符出现的频率情况创建Haffman树,再将各字符对应的哈夫曼编码写入文件中,实现文件压缩。

(1)构造Hufffman树的方法—Hufffman算法
构造Huffman树步骤:
I.根据给定的n个权值{w1,w2,……wn},构造n棵只有根结点的二叉树,
令起权值为wj。

II.在森林中选取两棵根结点权值最小的树作左右子树,构造一棵新的二叉树,置新二叉树根结点权值为其左右子树根结点权值之和。

III.在森林中删除这两棵树,同时将新得到的二叉树加入森林中。

IV.重复上述两步,直到只含一棵树为止,这棵树即哈夫曼树。

(2)Huffman编码:数据通信用的二进制编码
思想:根据字符出现频率编码,使电文总长最短
编码:根据字符出现频率构造Huffman树,然后将树中结点引向其左孩子的分支标“0”,引向其右孩子的分支标“1”;每个字符的编码即为从根到每个叶子的路径上得到的0、1序列。

(3) 解压
根据存放在文件中的编码表和文件压缩后的编码,进行一对一的翻译过程。

压缩的代码
#include<stdio.h>
#include<stdlib.h>
#include<malloc.h>
#include<string.h>
typedef struct
{unsigned int weight;
unsigned int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
void Select(HuffmanTree HT,int n,int *s1,int *s2){
int i;
unsigned int t;
t=10000;
for(i=1;i<=n;i++)
if(HT[i].parent==0&&HT[i].weight<t){
t=HT[i].weight;
*s1=i;
}
t=10000;
for(i=1;i<=n;i++)
if(HT[i].parent==0&&HT[i].weight<t&&i!=*s1){
t=HT[i].weight;
*s2=i;
}
}
void HuffmanCoding(HuffmanTree &HT,HuffmanCode &HC,int *w,int n) {
int m,i,s1,s2;
HTNode *p;
char *cd;
unsigned int c,f;
int start;
if(n<=1) return;
m=2*n-1;
HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
for(p=HT+1,i=1;i<=n;++i,++p,++w)
{
(*p).weight=*(w+1);
(*p).parent=0;
(*p).lchild=0;
(*p).rchild=0;
}
for(;i<=m;++i,++p)
{(*p).weight=0;
(*p).parent=0;
(*p).lchild=0;
(*p).rchild=0;
}
for(i=n+1;i<=m;++i)
{
Select(HT,i-1,&s1,&s2);
HT[s1].parent=i;
HT[s2].parent=i;
HT[i].lchild=s1;
HT[i].rchild=s2;
HT[i].weight=HT[s1].weight+HT[s2].weight;
}
HC=(HuffmanCode)malloc((n+1)*sizeof(char *)); cd=(char *)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=1;i<=n;i++)
{ start=n-1;
for(c=i,f=HT[i].parent;f!=0;c=f,f=HT[f].parent)
if(HT[f].lchild==c)
cd[--start]='0';
else
cd[--start]='1';
HC[i]=(char *)malloc((n-start)*sizeof(char));
strcpy(HC[i],&cd[start]);
}
free(cd);
}
void main()
{int *w;
int i,n,m;
HuffmanTree HT=NULL;
HuffmanCode HC=NULL;
printf("请输入赫夫曼树的结点个数:");
scanf("%d",&n);
w=(int *)malloc((n+1)*sizeof(int));
m=2*n-1;
printf("请输入结点的权值为:\n");
for(i=1;i<=n;i++)
scanf("%d",w+i);
printf("赫夫曼编码:\n");
HuffmanCoding(HT,HC,w,n);
for(i=1;i<=n;i++)
{
printf("%s\n",HC[i]);
}
}
七、测试结果及分析:
八、教师评语:
教师评价
评定项目 A B C D 评定项目 A B C D 算法正确界面美观,布局合理
程序结构合理操作熟练
语法、语义正确解析完整
实验结果正确文字流畅
报告规范题解正确
其他:
评价教师签名:
年月日。

相关主题