教学文库网 - 权威文档分享云平台
您的当前位置:首页 > 精品文档 > 高等教育 >

哈夫曼编码上机实验报告

来源:网络收集 时间:2026-05-15
导读: 第四次上机实验报告 姓名:康辉 学号:15180210013 班级:1518021 一、题目要求 对输入的一串电文字符(A B C D E F G H 8 个字符,其概率分别为 0.05, 0.29, 0.07, 0.08, 0.14, 0.23, 0.03, 0.11)实现Huffman编码,再对Huffman编码生成的代码串进行译码,输

第四次上机实验报告

姓名:康辉 学号:15180210013 班级:1518021 一、题目要求

对输入的一串电文字符(A B C D E F G H 8 个字符,其概率分别为 0.05, 0.29, 0.07, 0.08, 0.14, 0.23, 0.03, 0.11)实现Huffman编码,再对Huffman编码生成的代码串进行译码,输出电文字符串。实现功能如下: ? Huffman树的建立 ? Huffman编码的生成 ? 编码文件的译码 二、程序思路

设置一个数组v存放待编码元素,一个数组w存放权值,n为元素个数,ht为创建的哈夫曼树,hc为指针数组存储哈夫曼编码,这些作为函数参数传递到函数haffcoding中,创建编码树,然后按权值进行编码,这些都在一个函数中实现。 哈夫曼树节点: typedef struct { char data;

Int weight;

Int parent,lchild,rchild;

}htnode,huffmantree; 三、程序设计中遇到的问题

1、 选择一个数组来存储来存放编码,但是指针数组运用的不够熟练,造成值传递时

出错。最后查看c语言书籍得以解决.

2、 在选择所有权值中最小,次小的时候出现错误,造成乱序,编出来的编码不正确,

最后通过单步调试找出错误。

3、 hc=(huffmancode)malloc((n+1)*sizeof(char *));这里第一次分配空间为char

型,对指针数组很不熟悉造成的。

4、 还有其他的很多问题在程序中都有注释加重点。 四、程序源码

#include

#include

#include

#define length sizeof(htnode)

typedef struct htnode

{

char data;

int weight;

int parent,lchild,rchild;

}htnode,*huffmantree; //哈夫曼存储结构

typedef char **huffmancode; //存储哈夫曼编码表

void huffmancoding(huffmantree ht,huffmancode &hc,int *w,char *v,int n)//v是待编码元素数组,w是每个元素的权值,构造哈夫曼树ht,hc存放哈夫曼编码

{

int i,m,s1,s2,min1,min2,j;

char *cd;

int start,c,f;

if(n<=1) return;

m=2*n-1;

ht=(huffmantree)malloc((m+1)*length); //有n个叶子节点的hfuumantree需要

2n-1个结点存储

for(i=1;i<=n;++i,++w,++v) //对n个元素进赋值,权值,父亲左右孩子标记为0

{

0;

ht[i].data=*v;ht[i].weight=*w;ht[i].lchild=0;ht[i].parent=0;ht[i].rchild=

}

for(;i<=m;++i) //对后m-n个非叶子节点标记

{

ht[i].data=0;ht[i].weight=0;ht[i].lchild=0;ht[i].parent=0;ht[i].rchild=0 ;

}

for(i=n+1;i<=m;++i) //建树

{

s1=s2=0;min1=min2=32767;

for(j=1;j<=i-1;++j)

{

if(ht[j].parent==0)

{if(ht[j].weight

{min2=min1;min1=ht[j].weight;s2=s1;s1=j;} //此第一次处排序出错

else if(ht[j].weight

{min2=ht[j].weight;s2=j;}}

}

ht[s1].parent=i;ht[s2].parent=i;

ht[i].lchild=s1;ht[i].rchild=s2;

ht[i].weight=min1+min2;

}

//一下为从叶子结点到根节点求哈夫曼编码

hc=(huffmancode)malloc((n+1)*sizeof(char *)); //分配n个字符编码的头指针

向量

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)); //为第i个字符编码分配

空间

strcpy(hc[i],cd+start);

}

free(cd);

} //huffmancoding

int main()

{

printf(\哈夫曼编码*********** by-KangHui\\n\

int n,i;

char *v; //存字符

int *w; //权值

…… 此处隐藏:118字,全部文档内容请下载后查看。喜欢就下载吧 ……
哈夫曼编码上机实验报告.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.jiaowen.net/wendang/616124.html(转载请注明文章来源)
Copyright © 2020-2025 教文网 版权所有
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:78024566 邮箱:78024566@qq.com
苏ICP备19068818号-2
Top
× 游客快捷下载通道(下载后可以自由复制和排版)
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
VIP包月下载
特价:29 元/月 原价:99元
低至 0.3 元/份 每月下载150
全站内容免费自由复制
注:下载文档有可能出现无法下载或内容有问题,请联系客服协助您处理。
× 常见问题(客服时间:周一到周五 9:30-18:00)