版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、/huffmaneunction. hinclude <stdio. h>#dofinc max_node_num 512typcdcf struct int bitnuin; int parent; int lchild; int rchild; int weight;/bool code1024 ;/每个字符的编码最大支持1024个单位长度bool* code;int codelength;bool isleaf;int floor;huffmannode;class iiuffmanfunctionprivate:bool bi t (char c, int num); lo
2、ng getfilesize(file* stream);bool ini tia 1 izclluffmantrce(iluffmannodc* huffmantrce, const char* sourceei lc); bool dcstroylluffmantrce (lluffmannodc* huffmantrce);int stat ist icsofhuffmannodes (:iuf finannode* huffmantree, char* sourcefi le);bool gctfirstandsecondminnode(int* firstminnode, int*
3、secondminnodc, const huffmannode*huffmantree, const int* issigned);bool gcneratelluffinancodc(huffmannode* huffmantrcc, const int index);bool sethuffmanh1oor(hufrmannode* huffmantree, const int index);int generatehuffmantree(lluffmannode* huffmantree, int* issigned);int generateeilecodc(const kuffma
4、nnodc* huffmantree,const char* sourceeile, bool*filecode):bool createcompressfile(const char* destfile,const bool* filecode, int filecodelength);public:bool compressfile(char* sourcefile, char* destfile); bool uncompressfile (char* sourcefile, char* destfile):huffmanfunctiono ;"huffmanfunctiono
5、 ;;/ stdafx.h :标准系统包含文件的包含文件, /或是经常使用怛不常更改的 /特定于项目的含文件 /ttpragma once#include <stdio. h>#includc <tchar. h>includestring, h ttinclude "huffmanfunction. h"/ todo:在此处引用程序耑耍的其他尖文件/ huffmanclass. cpp :定义控制台应用程序的入口点。 /#includc "stdafx. h" int main(int argc,char *argv)if (a
6、rgc!=4)printf ("输入不合法1<); return 0;elsehuffmanfunction* function = new huffmanfunctiono ; if (!strcmp(argv1, -c")function->comprcsseiic(argv2,argv3); else if (! strcmp (argv 1,function->uncompressfile(argv2, argv3);elseprintf (输入不合法n); return 0;return 1;#include "huffman卜unct
7、ion.h"include <stdio. h>include <stdlib. h>huffman function: : i luf f maneunct i on ()huffnianfunct ion:、lluffmanfunct ion 0/获得字符的某一位bool huffmanfunclion: : bi t (char c, int rium)return (c&(l«num) >>num;/获得文件人小long huffnicineunction: :getfilesize(file* stream)long c
8、urpos, length; curpos = ftoil (stream): fscck(stream, 0,seek_end): length = ftel1 (stream): fseek(stream, curpos, seek_set); return length;bool huffmanfunct ion: ini tializehuffmcintree(huffmannode* huffmantree, const char* sourcefile) file* file = fopen(sourcefile, rb"); if (file = null)return
9、 false;long size = getfilesize(file);/获得 source 的文件人小 fclose(file);for (int i=0;imax_node_mjm;i+)huffmantreeti. code = (bool*)rnalloc (size):/动态生成编码数组huffmantrccti. weight = 0;huf'f'mantrcci. floor = 0;huffniantreci. codclength = 0;huf fnicintree i. parent = -1;huffmantreci. lchiid = -1; huf
10、fmantreeti. rchild = -1; huffmantreei. isleaf = false;return true:bool iiuffmanfunction:destroyiluffinantree(iiuffmannode* huffmantree)for(int i =0;i<max_node_num;i+)free(huffmantreei. code);return true;/返回的是文件中字符的数量int huffmanfunction:statislicsofhuffmannodes(huffmannode* huffmantree, char* sour
11、cefile)int count = 0;file* file = fopon(sourccpilc, rb);/读取字符,统计词频int index;while(index = fgetc(file)!=e0f)huffmantreeindex. wcight+; count+;huffmantreeindex. isleaf = true;fclosc(fi1c): return count:bool huffmanfunction:getfirstandsecondminnodc(int*irstminnode, int* secondminnode, const huffmannode
12、* huffmantree, const int* issigned)int firstminnum = 10000; int secondminnum = 10000;for (int i=0;i<max_n0de_num;i+)if (issigncdi =0&&liuffmantreci. weight>0&&liuffmantrcci. weight<first.minnum)*secondminnode = *fi rstminnode;secondminnum = fi rstminnum;*f?irstiinnode = i:fi
13、rstminnum 二 hufiniantreei. weight;elseif (issignedi =0&&huffmantreei weight>o&&huffmantreei. weight<secondminnum) *sccondminnode = i;secondminnum = huffmanti'cci. weight;return true;bool huffmcineunclion:generatehuffmancodechuffmcinnode* huffmantree, const int index)/如果是根节点
14、,直接返回if (huffmantrceindcx. floor = 0)return true;c l sc int parent 二 huffmantreeindex, parent;generatehuffmancodc (huf fmantrec, parent) ;/先牛成父 p点的 codefor (int i=0; i<huffmantree parent, floor; i+)/把父节点的 code 复制至 lj index 节点 huffmantreeindex. codei = huffmantreeparent. codei; huffmantreeindex. c
15、odelength+;/根据是左了节点还是右了节点生成codeint codclcngth = huffmantreeindex. codolcngth;if (huffmantreeparent, lchild =二 index)huffmantreeindex. codecodelength =0;else if (huffmantreeparent. rchi1d = index)hu f fmant reei ndex. codecodelength = 1;huffmantreeindex. codelength+;return true;bool huffmanfunct ion:
16、 :sethuffmanfloor (huffmcinnode* huffmantree, const int index) if(index<0|index>=maxjode num)return false;elseif (huffmantreeindex, floor > 0)int parent = huirmantreeindex.parent;huffmantreeindex, floor = hui'finantreeparent, floor + 1;sethuffmanfloor(huffmantrcc, huffmantrccindex. lchi
17、ld); sethuffmanfloor(huffmantrce, huffmantrccindex. rchi1d); return true;/返回的足根节点的索引int iluffmanfunction:generatehuffmantree(iluffmannode* huffraantree, int* issigned) /先统计有多少个初始叶子节点int nodecount = 0;for(int i-0;i<=255;i+)if (huifinantree i. weight>0)nodecount+;)/pj 生成 huff man 树int ptr = 256;
18、/ptr指向下一个可用节点 while(nodecount1)/获得第一小和第二小fl.未挂载的节点int firstminnode,secondminnode;getfirstandsecondminnode (&firstminnode, &secondminnode, huitniaritree, issigned);/给父节点赋值huffmantreeptr. weight = huffnkintreefirstminnode. weight + huffmantreesecondminnode. weight;huffmantreeptr. lchild = firs
19、tminnode; huffmantrccptr. rchiid = secondminnode;/给第一小节点赋值huf fmantree first.minnodej. floor = l;/floor 赋 1 和根节点区别 huffmantreefirstminnode. parent = ptr;/给第二小节点赋值huf fmantree secondminnode. floor = l;/flooi赋 1 和根节点区别 hufimantreesecondminnode. parent = ptr;i ssi gncdf i rstmi nnode = 1; issignedsecon
20、dminnode = 1; ptr+;nodecount-;/生成每个节点的层数sethuffmanfloor (tinf fmantree, ptr-1);/再生成huff man编码for(int i_0;i<256;i+)if(hucfmantreei. isleaf)generatekuf fmancodc (huri'mantree, i);return plr-1;)/返冋的是文件编码的长度int huffmanl;unction: :gcneratefi 1 ccodc(const iluffmannode* huffmemtrcc, const char* sou
21、rccfi1c, bool* fi1ccodc)int count = 0;file* file = fopen(sourcefile, rb"); if(file = null)return 0;int byte;while (byte = fgetc(file)!=e0f)for (int i =0;i <huffmantrccbyte. codelength;i+)filecodecount+ = huffmantreebyte codei:fclose(file): return count; bool iluffnianb'unction: :creatcco
22、mpressei lc(const char* dcstl'i ic, const bool* fi iccodc, int fi lccodclcngth)file* file = fopen(destfile, "wb"); int byte;for (int i=0;i<fi1ccodclcngth;)byte = 0;for (int j=7; j>=0; j)if(i=filecodelength)break;>byte += filecodeij; i+;fputc(byte, file):fclose(file); return tr
23、ue;bool iluffmanfunction: comprosspi 1 c (char* sourccfi 1c, char* dcst.fi lc)/定义-个哈夫曼树和表示节点是否已挂载的数组 huffmannode huffmantreemax node num; int issigncdmax_node_nlm = 0;/初始化huff man树i f (! ini tial izehuffmantree (huf fmcintree, sourcehi le)printf ("初始化错误什"); return false;/统计词频int bytenum =
24、statisticsofhuffmannodes(huffmantree,sourcefile); if (!bytcnum)printf ("统计词频错误n"); return false;/生成huff man编硏int roottndex = generatchuffmantree(huffmantree, issigncd): if (!rootlndex)printf ("生成哈夫曼编码错误n"); return false;/生成文件编码bool* filecode =(boo 1*)ma 11oc(8*bytcnum);int fileco
25、delength = generatepilecode(huffmantree, sourcefile, filecode): huffmantree01. bitnum = filecodelength; if (filecodelength = 0)printf ("生成文件编码错误1<); return false;if (!createconipressei le(destfi 1 e, fi 1 ecode, filecodelength)printf f生成压缩文件错误rf); return false;free(filecode);file* file = fop
26、en(huffmantree,'vb);fwri te (huffmantree, s i zcof (1 luff mannode), maxxodenum, file); fclose(file):if (! destroyhuf fmcintree (huffmcintree)printf ("不能释放资源"); return false;return true;bool huffmanfunction: :uncompressfi lc(char* sourcci;i 1 c, char* dcstei le) huffmannode huffmantreemax_node_num;p'll卜:氺 file = fopen(huffmantree,rb);fread(huffmantree, sizcof(huffmannode), max_node_num, file);fcl
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 通辽市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及完整答案详解一套
- 莆田市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及一套参考答案详解
- 2025年广东省辅警招聘公安基础知识考试题库及答案
- 阜阳市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)及答案详解(名师系列)
- 石家庄市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)完整答案详解
- 2025年高血压危象的急救、诊疗及护理考核试题及答案
- 2025年高危儿管理培训试卷课前及答案
- 福州市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(基础题)
- 2026年茂名市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(完整版)
- 鞍山市农村信用社联合社秋季校园招聘笔试备考题库(浓缩500题)附答案详解(综合题)
- 2025年10月自考00226知识产权法真题及答案
- 餐饮服务员技能培训教材范本
- 标准离婚协议书范本下载
- 【《互联网广告联盟风控体系研究》17000字(论文)】
- GB/T 46199-2025非开挖铺设用球墨铸铁管
- 2025年河南省信阳市公安辅警招聘知识考试题(含答案)
- NB-T 11559.2-2024 水电工程有限元数值分析导则 第2部分:土石坝
- 房地产营销渠道策略指南
- 道路交通运输行业安全管理员专项教育培训
- 化工行业安全事故
- 2025年国防教育知识考试题库及完整答案
评论
0/150
提交评论