设计一个利用哈夫曼算法的编码系统_第1页
设计一个利用哈夫曼算法的编码系统_第2页
设计一个利用哈夫曼算法的编码系统_第3页
设计一个利用哈夫曼算法的编码系统_第4页
设计一个利用哈夫曼算法的编码系统_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论