问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

求c++编写的算术编码压缩文本程序、可以显示压缩率的

发布网友 发布时间:2022-04-30 03:38

我来回答

1个回答

热心网友 时间:2023-10-09 22:24

------------------------------------------------------------------HuffTree.h文件:/**四川大学.软件学院**文件名称:HuffTree.h*摘要:利用有序表,建立哈夫曼树**作者:高云翔*完成日期:2008.11.14*/#ifndefHUFFTREE_H#defineHUFFTREE_H//由于SAList类要用到HuffTree类,此处即为虚定义classHuffTree;//有序表类的声明classSAList{intfence;intmaxSize;intlistSize;public:SAList(intsize=0);~SAList();HuffTree**listArray;voidsetStart();voidnext();intgetLength();boolinsert(HuffTree*item);//排序插入HuffTree*remove();boollessThan(HuffTree*x,HuffTree*y);};//哈弗曼树结点的类声明classHuffTreeNode{public:unsignedcharvalue;unsignedlongintweight;unsignedintleftOrRight;//若为左儿子,则值为0,若为右儿子,则值为1HuffTreeNode*parent;HuffTreeNode*leftChild;HuffTreeNode*rightChild;boolisLeaf;};//哈夫曼树的声明classHuffTree{public:HuffTreeNode*subRoot;HuffTree();HuffTree(unsignedcharval,unsignedlongintfreq);HuffTree(HuffTree*l,HuffTree*r);HuffTree*buildHuffTree(SAList*sal,SAList*copy);};#endif--------------------------------------------------------------------HuffTree.cpp文件://哈夫曼树的实现#include#include"HuffTree.h"//有序表类的声明SAList::SAList(intsize){maxSize=size;listSize=fence=0;listArray=newHuffTree*[maxSize];}SAList::~SAList(){delete[]listArray;}voidSAList::setStart(){fence=0;}voidSAList::next(){if(fenceweightsubRoot->weight;}//哈夫曼树的实现HuffTree::HuffTree(){subRoot=newHuffTreeNode;subRoot->weight=0;}HuffTree::HuffTree(unsignedcharval,unsignedlongintfreq){subRoot=newHuffTreeNode;subRoot->value=val;subRoot->weight=freq;subRoot->isLeaf=true;}HuffTree::HuffTree(HuffTree*l,HuffTree*r){subRoot=newHuffTreeNode;subRoot->leftChild=l->subRoot;subRoot->rightChild=r->subRoot;subRoot->leftChild->parent=subRoot->rightChild->parent=subRoot;subRoot->weight=l->subRoot->weight+r->subRoot->weight;subRoot->isLeaf=false;}HuffTree*HuffTree::buildHuffTree(SAList*sal,SAList*copy){HuffTree*temp1,*temp2,*temp3;temp1=temp2=temp3=newHuffTree;for(inti=sal->getLength();i>1;i--){sal->setStart();temp1=sal->remove();temp2=sal->remove();temp1->subRoot->leftOrRight=0;temp2->subRoot->leftOrRight=1;temp3=newHuffTree(temp1,temp2);if(temp1->subRoot->isLeaf)copy->insert(temp1);if(temp2->subRoot->isLeaf)copy->insert(temp2);sal->insert(temp3);}returntemp3;}------------------------------------------------------------------HuffmanCodeing.h文件:/**四川大学.软件学院**文件名称:HuffmanCodeing.h*摘要:利用哈夫曼树,对文件内容进行哈夫曼编码与译码**作者:高云翔*完成日期:2008.11.21*/#ifndefHUFFMANCODING_H#defineHUFFMANCODING_H#include#include"HuffTree.h"usingnamespacestd;//栈结构structLink{unsignedintelement;Link*next;Link(constunsignedint&elemval,Link*nextval=NULL);Link(Link*nextval=NULL);};structLStack{Link*top;intsize;LStack(){size=0;top=NULL;}~LStack(){clear();}voidclear();boolpush(constunsignedint&item);boolpop(unsignedint&it);};//缓冲区structBuffer{unsignedcharbyte;//表示字节,每个字节由8个位组成unsignedintbits;//表示位(比特)voidclear();//清空缓存区};//临时保存叶子结点的数域structSave{unsignedcharch;unsignedlongintval;};classHuffmanCoding{private:SAList*list,*copy;//有序表HuffTree*tree;//哈夫曼树Bufferbuffer;//缓存区LStack*stack;//栈Savesave;//临时保存叶子结点的数域FILE*sourceFile;//表示源文件FILE*targetFile;//表示目标文件unsignedlonginttotal;//表示要进行编码的文件的总字节数(number#include#include"HuffmanCoding.h"usingnamespacestd;Link::Link(constunsignedint&elemval,Link*nextval){element=elemval;next=nextval;}Link::Link(Link*nextval){next=nextval;}voidLStack::clear(){while(top!=NULL){Link*temp=top;top=top->next;deletetemp;}size=0;}boolLStack::push(constunsignedint&item){top=newLink(item,top);size++;returntrue;}boolLStack::pop(unsignedint&it){if(size==0)returnfalse;it=top->element;Link*temp=top;top=top->next;size--;deletetemp;returntrue;}voidBuffer::clear(){bits=0;byte=0;}voidHuffmanCoding::code(){char*sourceFileName=newchar[];char*targetFileName=newchar[];total=0;numOfLeaf=0;cout>sourceFileName;sourceFile=fopen(sourceFileName,"rb");//判断源文件是否存在,不存在则要求用户重新输入while(sourceFile==NULL){cout>sourceFileName;sourceFile=fopen(sourceFileName,"rb");}fgetc(sourceFile);//判断文件内容是否为空,若为空则退出程序if(feof(sourceFile)){cout>targetFileName;targetFile=fopen(targetFileName,"wb");//判断目标文件是否可以建立while(targetFile==NULL){cout>targetFileName;targetFile=fopen(targetFileName,"wb");}coutbuildHuffTree(list,copy);//利用已建立的有序表,建立哈夫曼树//开始编码,并将编码后的内容输出到目标文件rewind(sourceFile);//将文件指针重新指向文件内容起始处unsignedchartempChar=fgetc(sourceFile);//取文件内容的下一个字符unsignedinttempInt;HuffTreeNode*tempTreeNode;stack=newLStack();buffer.clear();//清空缓存区//当文件内容全部被扫描完,循环结束while(!feof(sourceFile)){//搜索匹配tempChar的叶子的值for(inti=0;igetLength();i++){if(tempChar==copy->listArray[i]->subRoot->value){stack->clear();tempTreeNode=copy->listArray[i]->subRoot;while(tempTreeNode!=tree->subRoot){stack->push(tempTreeNode->leftOrRight);tempTreeNode=tempTreeNode->parent;}//endwhilewhile(stack->pop(tempInt)){write(tempInt);}break;}//endif}//endfortempChar=fgetc(sourceFile);}//endwhile//如果缓存区还有剩余的位,则添加0到缓存区,直到够满8个位建立个字符,并向目标文件写入该字符if(buffer.bits>0){for(unsignedinti=buffer.bits;i>sourceFileName;sourceFile=fopen(sourceFileName,"rb");//判断源文件是否存在,不存在则要求用户重新输入while(sourceFile==NULL){cout>sourceFileName;sourceFile=fopen(sourceFileName,"rb");}fgetc(sourceFile);//判断文件内容是否为空,若为空则退出程序if(feof(sourceFile)){cout>targetFileName;targetFile=fopen(targetFileName,"wb");//判断目标文件是否可以建立while(targetFile==NULL){cout>targetFileName;targetFile=fopen(targetFileName,"wb");}coutbuildHuffTree(list,copy);//利用已建立的有序表,建立哈夫曼树//译码开始buffer.clear();//清空缓存区unsignedinttempInt;HuffTreeNode*tempTreeNode;while(total>0){tempTreeNode=tree->subRoot;while(!tempTreeNode->isLeaf){tempInt=read();if(tempInt==0){tempTreeNode=tempTreeNode->leftChild;}else{tempTreeNode=tempTreeNode->rightChild;}}fputc(tempTreeNode->value,targetFile);total--;}cout0)numOfLeaf++;}//将源文件的字符总数及叶子结点总数保存到目标文件fwrite(&total,sizeof(unsignedlongint),1,targetFile);fwrite(&numOfLeaf,sizeof(unsignedint),1,targetFile);//建立叶子结点有序表list=newSAList(numOfLeaf);copy=newSAList(numOfLeaf);//依次扫描ch,将权值不为0的字符插入到叶子结点有序表中//并将此字符及其权值保存到目标文件for(intk=0;k0){temp=newHuffTree(k,ch[k]);list->insert(temp);save.ch=k;save.val=ch[k];fwrite(&save,sizeof(save),1,targetFile);}}}//利用建立的缓存,向目标文件中输出字符voidHuffmanCoding::write(unsignedintc){++buffer.bits;buffer.byte=(buffer.byteinsert(temp);}}//从压缩文件中读取一个比特unsignedintHuffmanCoding::read(){if(buffer.bits==0){buffer.bits=8;buffer.byte=fgetc(sourceFile);}if(buffer.byte&(1<<(buffer.bits-1))){buffer.bits--;return1;}else{buffer.bits--;return0;}}-------------------------------------------------------------------Driver.cpp文件:#include"HuffmanCoding.h"intmain(){HuffmanCodingh;h.code();h.decode();system("PAUSE");return0;}一共5个文件,文件名已经给你了,你直接拷贝就可以,绝对我自己的原创,我还没给别人看过,希望你能利用好这段代码
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
找专业防水队做完还漏水怎么维权 法院会受理房屋漏水造成的纠纷吗? 巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 怎么在地图上的位置上判断经纬度(判断经度的时候应该看哪一条线来判断,是横着的,还是竖着的线,应该 为什么例如计算时间:经度每相差一度,就差4分钟。不是横纬竖经吗? 经线有多少条?纬线有多少条? 地球是横经竖伟还是横伟竖经? 横经竖纬对不对呀? 到底是横经竖纬还是横纬竖经?我晕了 横纬竖经判断经线的方法能适用所有地图吗? 经线和纬线是怎么标注的? 是横经竖纬还是横纬竖经? 横经竖纬吗?地理经纬线 不是横纬竖经吗,为啥跨纬度是南北跨经度是东西啊? 横纬竖经对不对呢? 横经竖纬,这句话对吗? 横经竖纬还是横纬竖经? termux在安装ubuntu运行的时候出现了oups: cannot find name for 横纬竖经还是横经竖纬? termux上安装Metasploit安装完了无法运行,这是安装失败了么 启动VNC出现The USER environment variable is not set? termux 安装akshare 如何用termux安装ubuntu最简单 图像的编码处理 如何编码1+2=? 对比H.261标准、M-JPEG标准(MPEG-1标准、MPEG-2标准、MPEG-4标准),MP... 能帮我看下这个算术编码有什么问题吗?为什么我输入的数值进行编码之后,再议码得出的结果不一样! 牛油果学名叫什么? 牛油果学名叫什么呢? 牛油果的作用与效果是什么? 湖南溥天商标代理有限公司衡阳分公司怎么样? 九阴真经不能打字是怎么回事? 九阴真经切换不了拼音打字 九阴真经3diso打字时键盘收不下去怎么办 九阴真经手游打字老卡咋回事,打一字界面要么不出来,要么等好久才弹出,要么出来正输入就返回咋回事? 九阴真经 怎么打字 我打字的时候切不到输入法 苹果和安卓可以一起玩九阴真经3D么 求指点 九阴真经中为什么不能打入中文 搜狗拼音在九阴真经副本里无法打字? 九阴真经3D进不去怎么办 无法连接解决方法 为什么九阴真经3d手游出招感觉迟钝 IOS九阴真经3D怎么在 电脑上运行 《九阴真经3D》12月15日iOS19-23服数据互通公告