哈夫曼编码与解码C语言(6页).doc

上传人:1595****071 文档编号:51400479 上传时间:2022-10-18 格式:DOC 页数:6 大小:133.50KB
返回 下载 相关 举报
哈夫曼编码与解码C语言(6页).doc_第1页
第1页 / 共6页
哈夫曼编码与解码C语言(6页).doc_第2页
第2页 / 共6页
点击查看更多>>
资源描述

《哈夫曼编码与解码C语言(6页).doc》由会员分享,可在线阅读,更多相关《哈夫曼编码与解码C语言(6页).doc(6页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、-哈夫曼编码与解码C语言-第 6 页#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

2、char ch; /*叶子结点字符*/ 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=N

3、ULL) return ; for(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);

4、if(ch= |ch=a|ch=A) 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小的则将其下标记录下来

5、,循环完之后找到最小的*/ k=j; 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;/*一直跟随新生成的结点,最后新生成的

6、结点为根结点*/ return root;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(code

7、codenum.codestr,codestr); 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*/ GetHafu

8、Code(ht,htroot.rchild,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

9、=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); /*若没有退出则继续打印菜单提示供选择*/ printf(nn=Menu=n); printf(chose 1:encoden); printf(chose 2:decoden); printf(chose 3:exitn);getch(); scanf(%d,&control);

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 合同协议

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com