哈夫曼编码与解码C语言_第1页
哈夫曼编码与解码C语言_第2页
哈夫曼编码与解码C语言_第3页
哈夫曼编码与解码C语言_第4页
哈夫曼编码与解码C语言_第5页
已阅读5页,还剩2页未读 继续免费阅读

下载本文档

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

文档简介

1、#include stdio.h /*I/O函数*/#includestdlib.h /*其他库函数声明*/int num;/*记录结点数*/int codenum=0;/*已经获得的编码个数*/char filename20=; /*存储文件名*/typedef struct /*哈夫曼结点存储结构*/ char ch; /*结点字符*/ int w; /*结点权值*/ int lchild,rchild; /*左右孩子的数组下标*/HafuNode,*HafuTree;HafuTree ht;/*声明一个指向树结点到指针*/typedef struct char ch; /*叶子结点字符*

2、/ char codestr20; /*字符编码*/HafuCode;HafuCode code27;/*用于存放对应字符到哈夫曼编码*/void InitHafuArry() /*导入文件计算权值,生成只含有叶子结点的HafuNode数组*/ int j,i,k; HafuNode tmpht; FILE *fp; /*定义一指向打开文件的指针*/ char ch;/*用于存储一个字母*/ char location30=D:; ht=(HafuTree)malloc(53*sizeof(HafuNode); /*为哈夫曼数分配内存空间*/ if(ht=NULL) return ; for(

3、i=0;i53;i+) /*初始化所以的数据单元,每个单元自成一棵树*/ hti.w=0; /*权值初始化为0*/ hti.lchild=hti.rchild=-1; /*左右子为空*/ num=0; printf(File name:); scanf(%s,filename); strcat(location,filename); fp=fopen(location,r); if(!fp) /*返回1时即存在文件*/ printf(Open Error); return; while(!feof(fp)/*没到结尾时返回0*/ ch=fgetc(fp); if(ch= |ch=a|ch=A)

4、 printf(%c,ch); if(ch= ) ch=#; for(j=0;jnum;j+) if(htj.ch=ch) break; if(j=num) /*找到新字符*/ htnum.ch=ch; /*将新字符存入并将权值加1*/ htnum.w+; num+; else htj.w+; /*将已有字符权值加1*/ fclose(fp); printf(n); for(i=0;inum;i+) /*对叶子结点按权值进行升序排序*/ k=i; for(j=i+1;jnum;j+) if(htj.whtk.w)/*如果后面发现权值比i小的则将其下标记录下来,循环完之后找到最小的*/ k=j;

5、 if(k!=i) /*如果权值最小的不是第i个元素则交换位置,将小的放到前面*/ tmpht=hti; hti=htk; htk=tmpht; int CreateHafuman(HafuTree ht) /*在数组ht中生成哈夫曼数,返回根节点下标*/ int i,k,j,root; HafuNode hfnode; codenum=0; for(i=0;ik;j-) /*将新结点插入有序数组中*/ if(htj.whfnode.w) htj+1=htj; else break; htj=hfnode; root=j;/*一直跟随新生成的结点,最后新生成的结点为根结点*/ return r

6、oot;void GetHafuCode(HafuTree ht,int root,char *codestr) /*ht是哈夫曼树,root是根结点下标,codestr是来暂时存放叶子结点编码的,一开始为空*/ FILE *out; int len,i; FILE *fp; /*定义一指向打开文件的指针*/ char ch;/*用于存储一个字母*/ char location30=D:; if(htroot.lchild=-1) /*遇到递归终点是叶子结点记录叶子结点的哈夫曼编码*/ codecodenum.ch=htroot.ch; strcpy(codecodenum.codestr,c

7、odestr); codenum+; else /*不是终点则继续递归*/ len=strlen(codestr); codestrlen=0; /*左分支编码是0*/ codestrlen+1=0; /*向左孩子递归之前调整编码序列末尾加0,相当于加了个0(null)其十进制值是0,以便下次循环时添加字符,否则会被覆盖掉*/ GetHafuCode(ht,htroot.lchild,codestr); /*向左递归*/ len=strlen(codestr); codestrlen-1=1;/*右分支编码为1,想右递归之前末尾编码0改为1*/ GetHafuCode(ht,htroot.rc

8、hild,codestr); /*向右递归*/ len=strlen(codestr); codestrlen-1=0; /*左右孩子递归返回后,删除编码标记末尾*/ strcat(location,filename); fp=fopen(location,r); if(!fp) /*返回1时即存在文件*/ printf(Open Error); return; out=fopen(D:code.txt,w+) ; if(!out) /*printf(Write Error); */ return; while(!feof(fp)/*没到结尾时返回0*/ ch=fgetc(fp); /*再打开源文件,对照哈夫曼编码译成编码*/ if(ch= |ch=a|ch=A) if(ch= ) ch=#; /*如果是空格就用#号代替*/ for(i=0;i=0&ch=0&ch=0&ch=1)/*将编码过滤出来*/ printf(%c,ch); /*将密文输出显示*/ fclose(output);/*将打开文件关闭*/ if(control=2) /*如果选择译码,则调用译码函数*/ decodeHafuCode(ht,root); if(control=3) /*如果选择3则退出程序*/ exit(0); /*若

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论