5.哈夫曼編码和译码的算法设计与实现.doc

5.哈夫曼編码和译码的算法设计与实现.doc

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
5.哈夫曼編码和译码的算法设计与实现

实验名称 哈夫曼编码和译码的算法设计与实现 实验方案 实验成绩 实验日期 实 验 室 信息系统设计与仿真室I 实验操作 实验台号 班级姓名 通信一班 杨林 实验结果 学号 14112300954 序号 27 实验目的 1、掌握哈夫曼编码的二叉树结构表示方法; 2、编程实现哈夫曼编码译码器; 3、掌握贪心算法的设计策略。 实验任务 ① 从文件中读取数据,构建哈夫曼树; ② 利用哈夫曼树,对输入明文进行哈夫曼编码; ③ 利用哈夫曼树,对输入编码译码为明文。 实验设计方案 结构体设计 Huffman树:包括字符,权,父亲下标,左孩子下标,右孩子下标 #define N 29 //26个小写字母,逗号,句号和空格字符. struct treenode{ //静态链表 char c; //char int w; //weight int f; //father int l; //left child index int r; //right child index }; struct treenode htree[2*N-1]; 自定义函数设计 函数原型声明 void input(); //读取文件字符、权值数据 void huffman(); //建立huffman树 void getcode(int i, char *str); //得到单个字符的huffman编码 void encode(char ch); //将明文进行huffman编码 void decode(char *str); //将huffman编码译为明文 ② 读取文件字符、权值数据 void input() { int i; char c; int f; freopen(in.txt,r,stdin); for(i=0;iN;i++) { c=getchar(); //接收字符 scanf(%d,f); //接收权值 getchar(); //接收回车 ht[i].c=c; ht[i].w=f; ht[i].l=ht[i].f=ht[i].r=-1; //初始化父亲、左右孩子下标 } freopen( CON, r, stdin); } ③建立huffman树 //使用贪心法建立huffman树,每次选择权值最小的根结点 void huffman() { void huffman() { int j,k,n; input(); j=0; k=N; for(n=N;n2*N-1;n++){ //建立huffman树,共合并N-1次 int r=0,s=0; ht[n].l=ht[n].f=ht[n].r=-1; while(r2){ //选择两个最小的权值结点 if((ht[k].w==0 || ht[k].wht[j].w) jN){ s+=ht[j].w; if(r==0) ht[n].l = j; //修改父亲、孩子下标 else ht[n].r=j; ht[j].f=n; j++; } else{ s+=ht[k].w; if(r==0) ht[n].l = k; //修改父亲、孩子下标 else ht[n].r=k; ht[k].f=n; k++; } r++; } ht[n].w=s; //修改权值 } } ④ 根据字符下标找到字符的huffman编码 //根据字符所在的下标,从叶子结点往上搜索到根节点,然后逆置得到该字符的huffman编码 void getcode(int i, char *str){ int n,j,l=0; for(n=i;ht[n].f!=-1;n=ht[n].f){ //沿着父亲往上搜索 int m=ht[n].f; if(n==ht[m].l) str[l++]=0; //左孩子记为0 else str[l++]=1; //右孩子记为1 } for(j=0;j=(l-1)/2;j++){ //将编码逆置 char t; t=str[j]; str[j]=str[l-1-j]; str[l-1-j]=t; } st

文档评论(0)

cv7c8hj6b4I + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档