版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、设计一个利用哈夫曼算法的编码系统,重复地显示并处理以下项目,直到选择退出为止。【基本要求】1) 将权值数据存放在数据文件(文件名为data.txt,位于执行程序的当前目录中)2) 初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;3) 编码:利用建好的哈夫曼树生成哈夫曼编码;4) 输出(1)各个字符的编码;(2);#include#include#include#define M 50#define MAX 1000;typedef structint weight;/结点权值 int parent,lchild,rchild;HTNODE,*HUFFMANTREE;typede
2、f char* HUFFMANCODE;/动态分配数组存储哈夫曼编码表HUFFMANTREE huffmantree(int n,int weight)/构建哈夫曼树int m1,m2,k;int i,j,x1,x2;HUFFMANTREE ht;ht=(HUFFMANTREE)malloc(2*n)*sizeof(HTNODE);for(i=1;i(2*n);i+)/初始化哈夫曼树中各结点的数据,没初始值的赋值为0hti.parent=hti.lchild=hti.rchild=0;if(i=n)hti.weight=weighti;elsehti.weight=0;for(i=1;in;i
3、+)/每一重循环从森林中选择最小的两棵树组建成一颗新树m1=m2=MAX;x1=x2=0;for(j=1;j(n+i);j+)if(htj.weightm1)&(htj.parent=0)m2=m1;x2=x1;m1=htj.weight;x1=j;else if(htj.weightm2)&(htj.parent=0)m2=htj.weight;x2=j;k=n+i;htx1.parent=htx2.parent=k;htk.weight=m1+m2;htk.lchild=x1;htk.rchild=x2;return ht;void huffmancoding(const int n,HU
4、FFMANCODE hc,HUFFMANTREE ht,char str)int i,start,child,father;char *cd;hc=(HUFFMANCODE)malloc(n+1)*sizeof(char*);/分配n个字符编码的头指针cd=(char*)malloc(n*sizeof(char);/分配求编码的工作空间cdn-1=0;/编码结束符for(i=1;i=n;+i)/逐个字符求哈夫曼编码start=n-1;for(child=i,father=hti.parent;father!=0;child=father,father=htfather.parent)/*从叶子
5、结点到根结点求逆向编码*/if(htfather.lchild=child)cd-start=0;elsecd-start=1;hci=(char*)malloc(n-start)*sizeof(char);/为i个字符编码分配空间strcpy(hci,&cdstart);/从cd复制哈夫曼编码串到hcfree(cd);/释放工作空间for(i=1;i=n;+i)printf(%c的编码:,stri);printf(%sn,hci);void main()int i,j,k;char str50;int weight50;printf(请输入字符(一次性连续输入所求的字符):);/*如:abc
6、jhjg不要输成ab cj hig,即字符间不加空格*/gets(str); for(j=0;j0;j-)strj=strj-1;strn+1=0;for(k=0;k0;k-)weightk=weightk-1;weight0=0;HUFFMANCODE hc=NULL;HUFFMANTREE ht;ht=huffmantree(n,weight);huffmancoding(n,hc,ht,str);补充:噢,我忘了你需要存档。现在太晚,明天再改一下。补充:这个是带有存盘的程序。#include#include#include#define M 50#define MAX 1000;type
7、def int Elempe;typedef structint weight;/结点权值 int parent,lchild,rchild;HTNODE,*HUFFMANTREE;typedef char* HUFFMANCODE;/动态分配数组存储哈夫曼编码表HUFFMANTREE huffmantree(int n,int weight)/构建哈夫曼树int m1,m2,k;int i,j,x1,x2;HUFFMANTREE ht;ht=(HUFFMANTREE)malloc(2*n)*sizeof(HTNODE);for(i=1;i(2*n);i+)/初始化哈夫曼树中各结点的数据,没初
8、始值的赋值为0hti.parent=hti.lchild=hti.rchild=0;if(i=n)hti.weight=weighti;elsehti.weight=0;for(i=1;in;i+)/每一重循环从森林中选择最小的两棵树组建成一颗新树m1=m2=MAX;x1=x2=0;for(j=1;j(n+i);j+)if(htj.weightm1)&(htj.parent=0)m2=m1;x2=x1;m1=htj.weight;x1=j;else if(htj.weightm2)&(htj.parent=0)m2=htj.weight;x2=j;k=n+i;htx1.parent=htx2.
9、parent=k;htk.weight=m1+m2;htk.lchild=x1;htk.rchild=x2;return ht;void huffmancoding(const int n,HUFFMANCODE hc,HUFFMANTREE ht,char str)int i,start,child,father;char *cd;hc=(HUFFMANCODE)malloc(n+1)*sizeof(char*);/分配n个字符编码的头指针cd=(char*)malloc(n*sizeof(char);/分配求编码的工作空间cdn-1=0;/编码结束符for(i=1;i=n;+i)/逐个字符
10、求哈夫曼编码start=n-1;for(child=i,father=hti.parent;father!=0;child=father,father=htfather.parent)/*从叶子结点到根结点求逆向编码*/if(htfather.lchild=child)cd-start=0;elsecd-start=1;hci=(char*)malloc(n-start)*sizeof(char);/为i个字符编码分配空间strcpy(hci,&cdstart);/从cd复制哈夫曼编码串到hcfree(cd);/释放工作空间for(i=1;i=n;+i)printf(%c的编码:,stri);
11、printf(%sn,hci);void Save(int a,const int& n)FILE *fp;int i,count=0,flag=1;fp=fopen(data.txt,wb+);for(i=1;i=n;i+)if(fwrite(&ai,sizeof(1),1,fp)=1)count+;elseflag=0;printf(数据保存失败!n);break;if(flag)printf(n数据保存成功!(有%d个权值已保存)n,count);fclose(fp);void main()FILE fp;int i,j,k;char str50;int weight50;printf(
12、请输入字符(一次性连续输入所求的字符):);/*如:abcjhjg不要输成ab cj hig,即字符间不加空格*/gets(str); for(j=0;j0;j-)strj=strj-1;strn+1=0;for(k=0;k0;k-)weightk=weightk-1;weight0=0;HUFFMANCODE hc=NULL;HUFFMANTREE ht;ht=huffmantree(n,weight);huffmancoding(n,hc,ht,str);Save(weight,n);#include#include#define max 50struct aint weight;int
13、parent,lchild,rchild;struct bchar cdmax;int start;void main()struct a ht2*max;struct b hcdmax,d;int i,k,n,c,s1,s2,m1,m2,f;printf(输入n:);scanf(%d,&n);for(i=1;i=n;i+)printf(输入权值:);scanf(%d,&hti.weight);hti.parent=0;for(;i=2*n-1;i+)hti.parent=hti.lchild=hti.rchild=0;for(i=n+1;i=2*n-1;i+)m1=m2=30000;s1=s2=0;for(k=1;k=i-1;k+)if(htk.parent=0 & htk.weightm1)m2=m1;s2=s1;m1=htk.weight;s1=k;else if(htk.parent=0 & htk.weightm2)m2=htk.weight;s2=k;hts1.parent=hts2.parent=i;hti.lchild=s1;hti.rchild=s2;hti.weight=hts1.weight+hts2.weight;for(i=1;i=n;i+)d.start=n-1;c
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 四川省乐至县联考2025-2026学年初三第三次诊断语文试题含解析
- 2026届天津市新华圣功校初三尖子生班3月调研考试语文试题含解析
- 落实教育公平助学承诺书(5篇)
- 河北省秦皇岛青龙县联考2026届下学期初三年级期末考试(联考卷)英语试题含解析
- 快乐运动的演讲比赛稿15篇
- 企业沟通渠道评估模板优化交流
- 文档编写格式规范工具包
- 物资采购合规管控承诺书6篇
- 环保建材绿色生产承诺书范文5篇
- 多平台文档编辑格式规范
- 椎管内肿瘤护理
- 浙江省金华市2025年4月九年级学业水平监测试卷英语一模(含答案)
- 军队器材报废管理办法
- 肿瘤科副主任竞聘
- 2024年江苏省南京市中考英语试卷真题(含答案)
- 新疆金大禹环境科技有限公司长丝无纺布配套技改20万吨-年差别化低熔点聚酯纤维项目环评报告
- DBJ04-T306-2025 建筑基坑工程技术标准
- 图情专硕复试题目及答案
- 《肝癌中医药》课件
- GB/T 4446-2025造船与海上结构物系泊绞车
- (人教2024版)英语七年级下册全册词形转换高清打印(默写版+背诵版)
评论
0/150
提交评论