哈夫曼树及编码综合实验报告
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
华北科技学院
《用哈夫曼编码实现文件压缩》实验报告
{ //parent 为 0 且 weight 最小的二个结点,第二个序号为 s2 if((*HT)[i].parent==0 && i!=(*s1)) { if((*HT)[i].weight<(*HT)[min].weight) min=i; }
3、答辩情况:
基本操作: A( ),B( ),C( ),D( ),F( ) 代码理解: A( ),B( ),C( ),D( ),F( ) 4、报告规范度: A( ),B( ),C( ),D( ),F( ) 5、学习态度: A( ),B( ),C( ),D( ),F( )
总评成绩:_________________________________
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';
流程图如下
开始(主函数)
输入字符个数 及相应权值
输出每个字符的权值
建立哈夫曼树
输出哈夫曼树,并显示 双亲权值和左右孩子
输出哈夫曼编码 六、系统实现及测试结果:
1.输入哈夫曼字数及相应权值
华北科技学院
《用哈夫曼编码实现文件压缩》实验报告
相应代码
int main()
{
HuffmanTree HTree;
三、实验设备与环境:
微型计算机、Windows 7 操作系统 、Visual C++6.0 软件 四、实验内容:
输入的字符创建 Huffman 树,并输出各字符对应的哈夫曼编码。
五. 系统设计 输入字符的个数和各个字符以及权值,将每个字符的出现频率作为叶子结点构建 Huffman 树,规定哈夫曼树的左分支为 0,右分支为 1,则从根结点到每个叶子 结点所经过的分支对应的 0 和 1 组成的序列便为该结点对应字符的哈夫曼编码。
//叶子结点初始化并放入 1-n 号单元 //非叶子结点初始化
printf("\n 哈弗曼树的构造过程如下所示:\n");
printf("HT 初态:\n 结点 weight parent lchild rchild");
for(i=1;i<=m;i++)
//完成构造哈弗曼树算法的地 1 个步骤
printf("\n%4d%8d%8d%8d%8d",i,(*HT)[i].weight,(*HT)[i].parent,(*HT)[i] .lchild,(*HT)[i].rchild);
//从叶子到根逆向求每个字符的哈弗曼编码 *HC=(HuffmanCode)malloc((n+1)*sizeof(char*)); cd=(char*)malloc(n*sizeof(char));
//分配 n 个编码的头指针 //分配求编码的工作空间
华北科技学院
《用哈夫曼编码实现文件压缩》实验报告
//释放工作空间
for(i=1;i<=n;i++) printf("<%2d>编码:%s\n",(*HT)[i].weight,(*HC)[i]);
}//HuffmanCoding
七、实验结果分析:
编程过程遇到很多问题,一些知识掌握不够全面,好多细节考虑的也不是 很周到,尤其是遍历查找最小权值的过程,心里只有个大概思路,但总是写不对, 后来查了资料和向同学请求帮助,对这个有了更好的掌握,同时分析问题的能力 也略有提高。所以在以后的学习中,要更加认真,细心,不断地练习,努力。
指导教师:
兰芸
华北科技学院
《用哈夫曼编码实现文件压缩》实验报告
一、 实验题目:
用哈夫曼编码实现文件压缩
二、实验目的:
1、了解文件的概念。 2、掌握线性链表的插入、删除等算法。 3、掌握 Huffman 树的概念及构造方法。 4、掌握二叉树的存储结构及遍历算法。 5、利用 Huffman 树及 Huffman 编码,掌握实现文件压缩的一般原理。
HuffmanCode HCode;
int *w, i;
int n,wei;
//编码个数及权值
printf("请输入需要哈夫曼编码的字符个数:");
scanf("%d",&n);
w=(int*)malloc((n+1)*sizeof(int));
for(i=1; i<=n;i++)
{ printf("请输入第%d 字符的权值:",i);
printf("\n%4d%8d%8d%8d%8d",j,(*HT)[j].weight,(*HT)[j].parent,(*HT)[j].lchild,(*HT)[j].r
child); printf("
按任意键,继续.....");
getch();
}
4.输出哈弗曼编码
相应代码 printf("\n%d 个字符的哈弗曼编码如下:\n",n);
} *s2=min; }//endSelect
for(i=n+1;i<=m;i++) {
Select(HT,i-1,&s1,&s2); //在 HT[1..i-1]中选择 parent 为 0 且 weight 最小的二个结点
(*HT)[s1].parent=i; (*HT)[s2].parent=i; (*HT)[i].lchild=s1; (*HT)[i].rchild=s2;
//从叶子到根逆向求编码
else cd[--start] ='1';
(*HC)[i]=(char*)malloc((n-start)*sizeof(char)); strcpy((*HC)[i],&cd[start]);
//为第 i 个字符编码分配空间 //从 Cd 复制编码(串)到 HC
} free(cd);
fflush(stdin);
scanf("%d",&wei);
w[i]=wei;
}
HuffmanCoding(&HTree,&HCode,w,n);
return 1;
} 2.输出 HT 初态(每个字符的权值)
华北科技学院
《用哈夫Βιβλιοθήκη Baidu编码实现文件压缩》实验报告
相应代码 void HuffmanCoding(HuffmanTree *HT,HuffmanCode *HC,int *w,int n){
华北科技学院
《用哈夫曼编码实现文件压缩》实验报告
《用哈夫曼编码实现文件压缩》
实验报告
课程名称
数据结构 B
实验学期 2017 至 2018 学年 第 一 学期
学生所在院部 计算机学院
年级 2016 专业班级 信管 B162
学生姓名 学号
成绩评定:
1、工作量: A( ),B( ),C( ),D( ),F( ) 2、难易度: A( ),B( ),C( ),D( ),F( )
//将选取根结点权值最小的树作为左右子树 (*HT)[i].weight=(*HT)[s1].weight+(*HT)[s2].weight;
//置新二叉树的根结点权值为其左,右子树上根结点之和 printf("\nselect: s1=%d s2=%d\n",s1,s2);
//根结点权值最小的树在 HT 中的位置 printf(" 结点 weight parent lchild rchild "); for(j=1;j<=i;j++) //输出选取根结点权值最小的树的过程
for(i=1;i<=n;i++) {
(*HT)[i].weight=w[i]; (*HT)[i].parent=0; (*HT)[i].lchild=0; (*HT)[i].rchild=0; } for(i=n+1;i<=m; i++) { (*HT)[i].weight=0; (*HT)[i].parent=0; (*HT)[i].lchild=0; (*HT)[i].rchild=0; }
printf(" 按任意键,继续....."); getch();
3.建立哈夫曼树
华北科技学院
中间一些截图此处省略
《用哈夫曼编码实现文件压缩》实验报告
相应代码 void Select(HuffmanTree *HT, int m, int *s1,int *s2) { int i,min; for(i=1;i<=m;i++) { //在(*HT) [1..i-1]中选择 parent 为 0 且 weight 最小的二个结点 if ((*HT)[i].parent==0) { min=i; i=m+1; } } for(i=1;i<=m;i++) { //parent 为 0 且 weight 最小的二个结点,第一个序号为 s1 if((*HT)[i].parent==0) { if((*HT)[i].weight<(*HT)[min].weight) min=i; } } *s1=min; for(i=1;i<=m;i++) { //在(*HT) [1..i-1]中选择 parent 为 0 且 weight 最小的二个结点 if((*HT)[i].parent==0 && i!=(*s1)) { min=i; i=m+i; } } for(i=1;i<=m;i++)
//w 存放 n 个字符的权值(均>0),构造赫夫曼树 HT,并求出 n 个字符的赫夫曼 编码 HC.
int i,j,m,s1,s2,start; char *cd; unsigned int c,f; if(n<=1) return; m=2*n-1; *HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); //0 号单元未用