




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、设计一个利用哈夫曼算法的编码系统,重复地显示并处理以下项目,直到选择退出为止。【基本要求】1) 将权值数据存放在数据文件(文件名为data.txt,位于执行程序的当前目录中)2) 初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;3) 编码:利用建好的哈夫曼树生成哈夫曼编码;4) 输出(1)各个字
2、符的编码;(2)1111111;#include<stdio.h>#include<string.h>#include<malloc.h>#define M 50#define MAX 1000;typedef struct int weight;/结点权值 int parent,lchild,rchild;HTNODE,*HUFFMANTREE;typedef char* HUFFMANCODE;/动态分配数组存储哈夫曼编码表HUFFMANTREE huffmantree(int n,int weight)/构
3、建哈夫曼树 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+)/初始化哈夫曼树中各结点的数据,没初始值的赋值为0 hti.parent=hti.lchild=hti.rchild=0; if(i<=n) hti.weight=weighti; else
4、; hti.weight=0; for(i=1;i<n;i+)/每一重循环从森林中选择最小的两棵树组建成一颗新树 m1=m2=MAX; x1=x2=0; for(j=1;j<(n+i);j+) if(htj.weight<m1)&&(htj.parent=0) m2=m1;
5、60; x2=x1; m1=htj.weight; x1=j; else if(htj.weight<m2)&&(htj.parent=0) m2=htj.weight; x2=j; k=n+i;
6、 htx1.parent=htx2.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(ch
7、ar*);/分配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)/*从叶子结点到根结点求逆向编码*/ if(htfather.lchi
8、ld=child) cd-start='0' else cd-start='1' hci=(char*)malloc(n-start)*sizeof(char);/为i个字符编码分配空间 strcpy(hci,&cdstart);/从cd复制哈夫曼编码串到hc free(cd);/释放工作空间 for(i=1;i<=n;+i)
9、 printf("%c的编码:",stri); printf("%sn",hci); void main() int i,j,k; char str50; int weight50; printf("请输入字符(一次性连续输入所求的字符):");/*如:abcjhjg不要输成ab cj hig,即字符间不加空格*/ gets(str); for(j=0;j<50;j+)
10、; if(strj='0') break; const int n=j; for(j=n;j>0;j-) strj=strj-1; strn+1='0' for(k=0;k<n;k+) printf("请输入%c的权值:",strk+1); scanf("%d",&weightk);
11、 for(k=n;k>0;k-) weightk=weightk-1; weight0=0; HUFFMANCODE hc=NULL; HUFFMANTREE ht; ht=huffmantree(n,weight); huffmancoding(n,hc,ht,str); 补充:噢,我忘了你需要存档。现在太晚,明天再改一下。 补充:这个是带有存盘的程序。#include<stdio.h>#include<string.h>#include<malloc.h
12、>#define M 50#define MAX 1000;typedef int Elempe;typedef struct int 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;
13、 ht=(HUFFMANTREE)malloc(2*n)*sizeof(HTNODE); for(i=1;i<(2*n);i+)/初始化哈夫曼树中各结点的数据,没初始值的赋值为0 hti.parent=hti.lchild=hti.rchild=0; if(i<=n) hti.weight=weighti; else hti.weight=0; for(i=1;i<n;i+)/每一重循环从森
14、林中选择最小的两棵树组建成一颗新树 m1=m2=MAX; x1=x2=0; for(j=1;j<(n+i);j+) if(htj.weight<m1)&&(htj.parent=0) m2=m1; x2=x1; m1=htj.weight;
15、; x1=j; else if(htj.weight<m2)&&(htj.parent=0) m2=htj.weight; x2=j; k=n+i; htx1.parent=htx2.parent=k; htk.weight=m1+
16、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);/分配求编码的工
17、作空间 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)/*从叶子结点到根结点求逆向编码*/ if(htfather.lchild=child) cd-start='0'
18、; else cd-start='1' hci=(char*)malloc(n-start)*sizeof(char);/为i个字符编码分配空间 strcpy(hci,&cdstart);/从cd复制哈夫曼编码串到hc free(cd);/释放工作空间 for(i=1;i<=n;+i) printf("%c的编码:",stri); pr
19、intf("%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+;
20、 else flag=0; printf("数据保存失败!n"); break; if(flag) printf("n数据保存成功!(有%d个权值已保存)n",count); fclose(fp);void main() FILE fp; int i,j,k; char str50; int weight
21、50; printf("请输入字符(一次性连续输入所求的字符):");/*如:abcjhjg不要输成ab cj hig,即字符间不加空格*/ gets(str); for(j=0;j<50;j+) if(strj='0') break; const int n=j; for(j=n;j>0;j-) strj=strj-1; strn+1='0'&
22、#160;for(k=0;k<n;k+) printf("请输入%c的权值:",strk+1); scanf("%d",&weightk); for(k=n;k>0;k-) weightk=weightk-1; weight0=0; HUFFMANCODE hc=NULL; HUFFMANTREE ht; ht=huffmantree(n,weight); hu
23、ffmancoding(n,hc,ht,str); Save(weight,n);2222222222;#include<stdio.h>#include<stdlib.h>#define max 50 struct a int weight; int parent,lchild,rchild; struct b char cdmax; int start; void main()
24、160; 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&q
25、uot;,&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+)
26、 if(htk.parent=0 && htk.weight<m1) m2=m1; s2=s1; m1=htk.weight; s1=k; else if(htk.parent=0 && htk.weight<m2) m2=htk.weight; s2=k;
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 工程索赔常见问题解答
- 度假酒店监控设备招标3篇
- 定制化投资服务合同3篇
- 全方位会务策划服务协议3篇
- 建筑施工物业管理合同2篇
- 建筑公司全权委托3篇
- 代收货代表协议3篇
- 竹林种植机械化技术与效益分析考核试卷
- 木雕工艺技术与创作考核试卷
- 紧固件行业数字化设计与仿真分析考核试卷
- (二模)济宁市2025年4月高考模拟考试地理试卷
- 首都医科大学附属北京安贞医院招聘考试真题2024
- 抽化粪池合同协议
- 中医养生馆运营方案中医养生馆策划书
- (二模)宁波市2024-2025学年第二学期高考模拟考试 英语试卷(含答案)+听力音频+听力原文
- 高考备考:100个高考常考易错的文言实词(翻译+正误辨析)
- 软件项目交付管理制度
- 食品安全自查、从业人员健康管理、进货查验记录、食品安全事故处置等保证食品安全的规章制度
- 物理实验通知单记录单初二上
- 认识浮力+阿基米德原理
- 防止电力生产重大事故地二十五项反措
评论
0/150
提交评论