赫夫曼编码.docx
- 文档编号:25275183
- 上传时间:2023-06-06
- 格式:DOCX
- 页数:11
- 大小:87.02KB
赫夫曼编码.docx
《赫夫曼编码.docx》由会员分享,可在线阅读,更多相关《赫夫曼编码.docx(11页珍藏版)》请在冰豆网上搜索。
赫夫曼编码
一、详细设计
#include
#include
#include
#include
#include
#defineERROR0
#defineOK1
typedefboolStatus;
#defineSIZE20
typedefFILE*PFILE;
typedefchar*ElemType;
typedefstructHTNode//哈夫曼树结点类型
{intweight;//结点的权值
intparent,lchild,rchild;
//结点的双亲parent,结点的左子树lchild,结点的右子树rchild
}*PHTNode;
structHuffmanTree//哈夫曼树类型
{HTNode*HT;//哈夫曼树
ElemTypech;//哈夫曼树的字符集
intn;//哈夫曼树的字符集个数
};
StatusOpenWriteFile(PFILE&fp,charstring[SIZE])
//打开写的文件
{
if(!
(fp=fopen(string,"wb"))){
cout<<"文件打开失败"< exit(ERROR); cout<<"Pressanykeytoexit"< getch(); } returnOK; } StatusOpenReadFile(PFILE&fp,charstring[SIZE]) //打开读的文件 { if(! (fp=fopen(string,"rb"))){ cout<<"文件打开失败"< cout<<"Pressanykeytoexit"< getch(); exit(ERROR); } returnOK; } StatusPrintFile(charstring[SIZE]) //输出文件名为string的字符 { FILE*fp;charc; OpenReadFile(fp,string); while(! feof(fp)){ for(inti=1;i<=50&&! feof(fp);i++){ c=getc(fp); cout< } cout< } fclose(fp); returnOK; } StatusinitHTree(HuffmanTree&T,intn) //初始化一个n个字符集的哈夫曼树 { T.n=n; if(! (T.HT=newHTNode[2*T.n])){ cout<<"分配哈夫曼树的存储空间失败"< exit(ERROR); } if(! (T.ch=newchar[T.n+1])){ cout<<"分配字符集的存储空间失败"< exit(ERROR); } returnOK; } StatusDestroyHTree(HuffmanTree&T) //销毁哈夫曼树 { delete(T.HT); delete(T.ch); returnOK; } StatusSelect(int&s1,int&s2,intn,PHTNodeH) //从二叉树位置从0~n集合中找到2个根结点的权值最小的位置 { inti,leap=0; for(i=1;i<=n;i++) if(! H[i].parent) if(leap){ if(H[i].weight } else{s1=i;leap=1;} leap=0;H[s1].parent=1; for(i=1;i<=n;i++) if(! H[i].parent) if(leap){ if(H[i].weight } else{s2=i;leap=1;} returnOK; } StatusCreateHTree() //创建哈夫曼树并把结果保存在string为文件名的文件里 { inti,s1,s2;FILE*fp,*cfp;charc,string[SIZE]; HuffmanTreeT;intn; cout<<"请输入字符集的大小(n): "; cin>>n; initHTree(T,n); cout<<"请输入字集的保存路径\\名称: "; cin>>string; OpenReadFile(cfp,string); cout<<"请输入字符集对应的权值: "< for(i=1;i<=T.n;i++){ c=getc(cfp); cout< "; T.ch[i]=c; cin>>T.HT[i].weight; T.HT[i].parent=0; T.HT[i].rchild=0; T.HT[i].lchild=0; } for(;i<2*T.n;i++){ T.HT[i].weight=0; T.HT[i].parent=0; T.HT[i].rchild=0; T.HT[i].lchild=0; } for(i=T.n+1;i<2*T.n;i++){ Select(s1,s2,i-1,T.HT); T.HT[i].lchild=s1;T.HT[i].rchild=s2; T.HT[s1].parent=i;T.HT[s2].parent=i; T.HT[i].weight=T.HT[s1].weight+T.HT[s2].weight; } cout<<"请输入哈夫曼树的保存路径\\名称: "; cin>>string; OpenWriteFile(fp,string); fwrite(&T.n,sizeof(int),1,fp); fwrite(T.HT,sizeof(HTNode),2*T.n,fp); fwrite(T.ch,sizeof(char),T.n+1,fp); fclose(fp);fclose(cfp);DestroyHTree(T); returnOK; } StatusHEncoding(charstring[SIZE]) //哈夫曼编码,并把结果保存在string文件中 { HuffmanTreeT; FILE*fp,*hfp,*cfp; inti,j,k; charch[SIZE],c,*cd; cout<<"请输入保存哈夫曼树的保存路径\\名称: "; cin>>ch; OpenReadFile(hfp,ch); cout<<"请输入要编码文件的保存路径\\名称: "; cin>>ch; OpenReadFile(fp,ch); cout<<"请输入代码文件的保存路径\\名称: "; cin>>string; OpenWriteFile(cfp,string); fread(&T.n,sizeof(int),1,hfp); if(! (cd=newchar[T.n])){ cout<<"编码工作空间分配失败"< exit(ERROR); } initHTree(T,T.n); fread(T.HT,sizeof(HTNode),2*T.n,hfp); fread(T.ch,sizeof(char),T.n+1,hfp); c=getc(fp); while(! feof(fp)){ for(i=1;i<=T.n&&c! =T.ch[i];i++); j=T.n;k=i;while(T.HT[k].parent) if(T.HT[T.HT[k].parent].lchild==k){ cd[--j]='0';k=T.HT[k].parent; } else{ cd[--j]='1';k=T.HT[k].parent; } for(j;j putc(cd[j],cfp); c=getc(fp); } DestroyHTree(T); delete(cd); fclose(cfp); fclose(hfp); fclose(fp); returnOK; } StatusHDecoding(charstring[SIZE]) //哈夫曼译码,并把结果保存在string文件中 {HuffmanTreeT; charch[SIZE],c; FILE*fp,*hfp,*cfp; cout<<"请输入保存哈夫曼树的保存路径\\名称: "; cin>>ch; OpenReadFile(hfp,ch); fread(&T.n,sizeof(int),1,hfp); initHTree(T,T.n); fread(T.HT,sizeof(HTNode),2*T.n,hfp); fread(T.ch,sizeof(char),T.n+1,hfp); voidPrintHTree(HuffmanTreeT); cout<<"请输入代码文件的保存路径\\名称: "; cin>>ch; OpenReadFile(cfp,ch); cout<<"请输入译码文件的保存路径\\名称: "; cin>>string; OpenWriteFile(fp,string); c=getc(cfp); while(! feof(cfp)){ for(inti=2*T.n-1;T.HT[i].lchild&&! feof(cfp);c=getc(cfp)) if(c=='0')i=T.HT[i].lchild; elsei=T.HT[i].rchild; putc(T.ch[i],fp); } fclose(cfp); fclose(hfp); fclose(fp); DestroyHTree(T); returnOK; } voidmain() {charstring[SIZE],c='A'; do{system("cls"); cout<<"*******************************************************************************"< cout<<"本程序的命令: (1)创建哈夫曼树C;\n"; cout<<" (2)对指定的文件现行编码E;\n"; cout<<"(3)对指定的代码进行译码D;\n"; cout<<"(4)退出程序Q."< cout<<"*******************************************************************************"< cout<<"请输入命令(C,E,D,Q): "; cin>>c; switch(c){ case'C': CreateHTree();break; case'E': HEncoding(string);cout<<"哈夫曼编码的结果: "< case'D': HDecoding(string);cout<<"哈夫曼译码的结果: "< } cout<<"请输入任意键继续运行程序"< getch(); }while(c! ='Q'); } 四、用户手册 1、本程序的运行环境为DOS操作系统,执行文件为: 赫夫曼.exe。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 赫夫曼 编码