实验六 哈夫曼编码和译码的算法设计与实现
更新时间:2024-01-19 20:19:01 阅读量: 教育文库 文档下载
- 实验六实验报告表推荐度:
- 相关推荐
实验名称 实验日期 实验六 哈夫曼编码和译码的算法设计与实现
实验方案 实验操作 实验成绩 2012-04-22 实 验 信息系统设计与仿室 真室I 实验台号 34号 班级姓信工11-1BF 李煌名 峰
实验结果
一、实验目的
1、根据算法设计需要,掌握哈夫曼编码的二叉树结构表示方法; 2、编程实现哈夫曼编译码器; 3、掌握贪心算法的一般设计方法。
二、预习与参考
1、认真阅读数据结构教材和算法设计教材内容, 熟悉哈夫曼编码的原理; 2、设计和编制哈夫曼编译码器。 [参考数据类型或变量] typedef ElemType char; typedef struct node{ int w; int flag; ElemType c;
struct node *plink,*llink,*rlink;
char code[m]; }Node;
Node *num[n], *root; [参考子程序接口与功能描述]
void SetTree( NODE *root )
功能: 从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树 void EnCode( Node *p )
功能: 利用已建好的哈夫曼树,对输入的正文进行编码
void DeCode( void )
功能: 利用已建好的哈夫曼树,将输入的代码进行译码
三、实验要求
上机实验时,一人一组,独立上机,熟练运用二叉树与贪心思想对数据进行压缩。
四、实验步骤
1、 设计SetTree的测试方案和程序,输入测试数据,修改并调试程序,直至正确为止; 2、 设计EnCode的测试方案和程序,输入测试数据,修改并调试程序,直至正确为止; 3、 设计DeCode的测试方案和程序,输入测试数据,修改并调试程序,直至正确为止; 4、 将你的程序整理成功能模块存盘备用。 5、 将写的程序如下: #include
#define maxn 20 //最大结点数目 #define inf 0xfffffff //无穷大
typedef struct node {
double w; int flag; int c;
struct node *plink,*llink,*rlink; char code[maxn]; int codelen; node() //初始化节点 {
flag=0; llink=NULL; plink=NULL; rlink=NULL; codelen=0;
} }node;
node *num[2*maxn-1];//指针数组 int n;
void SetTree(node *&root)//从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树 {
int i,m,j;
scanf(\输入结点个数n for(i=0;i num[i]=new node(); num[i]->c=i; scanf(\输入结点的权值 } m=n; double min1,min2; int pos1=0,pos2=0; for(i=0;i min1=inf; min2=inf; for(j=0;j if(num[j]->flag==0) { if(num[j]->w min1=num[j]->w; pos2=pos1; pos1=j; } else if(num[j]->w min2=num[j]->w; pos2=j; } } } num[pos1]->flag=1; //将pos1和pos2合并在新结点中,作为新节点的子节点 num[pos2]->flag=1; num[n]=new node(); //新节点编号从n开始 num[n]->c=-1; ////添加代码,建立新结点n//// //建立新结点n num[n]->w=num[pos1]->w+num[pos2]->w; num[n]->llink=num[pos1]; num[n]->rlink=num[pos2]; num[pos1]->plink=num[n]; num[pos2]->plink=num[n]; n++; } root=num[n-1]; n=m; } void EnCode(node *root,int deep,char code[]) //利用已建好的哈夫曼树,对输入的文本进行编码 { int i; if(root->c!=-1) { for(i=0;i root->code[i]=code[i]; } root->codelen=deep; return; } code[deep]='0'; //左节点编码为0 EnCode(root->llink,deep+1,code); code[deep]='1'; //右节点编码为1 EnCode(root->rlink,deep+1,code); } void DeCode(node *root,char code[]) //利用已建好的哈夫曼树,对输入的代码进行译码 { int i; node *temproot=root; int len=strlen(code); int ans[maxn],anslen=0; for(i=0;i ////添加代码,根据code[i]的值确定temproot的指向//// //根据code[i]的值确定temproot的指向 if(code[i]=='0') temproot=temproot->llink; else temproot=temproot->rlink; if(temproot->c!=-1) { ans[anslen++]=temproot->c; temproot=root; } if(temproot->llink==NULL && temproot->rlink==NULL) { printf(\你输入的数据不存在于该哈弗曼树中!\\n\ return; } } printf(\输入数据的译码为:\\n\ for(i=0;i printf(\ } printf(\} void print() { int i,j; for(i=0;i printf(\ for(j=0;j printf(\ printf(\ } } int main() { freopen(\ SetTree(root); char code[maxn*maxn]; EnCode(root,0,code); print(); printf(\按上面的编码规则输入代码:\\n\node *root=NULL; root=new node(); freopen(\ scanf(\DeCode(root,code); return 0; } 五、测试 输入 8 0.6 0.2 0.05 0.05 0.03 0.03 0.03 0.01 输出 0.6: 0 0.2: 10 0.05: 1100 0.05: 1111 0.03: 11010 0.03: 11011 0.03: 11101 0.01: 11100 六、实验报告要求 1、 阐述实验目的和实验内容; 2、 提交实验程序的功能模块; 3、 记录最终测试数据和测试结果。 七、心得 在实验中我掌握哈夫曼编码的二叉树结构表示方法。
正在阅读:
实验六 哈夫曼编码和译码的算法设计与实现01-19
2019《试吧》高中全程训练计划·生物课练6 ATP的主要来源 - 细胞02-29
中国石油天然气集团公司安全目视化管理规范11-02
长沙名校小升初分析报告(宣传版)09-21
常用机电设备常见故障及处理方法05-03
毕业论文 _论资本结构优化08-31
25m简支T梁计算(24.5m)01-29
中共重庆市委法制建设领导小组关于开展百千万普法示范工程03-08
吉林大学计算机导师01-21
太阳能光伏发电 本科毕业论文05-17
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 哈夫曼
- 译码
- 算法
- 编码
- 实验
- 实现
- 设计