1、21 15 47 57 1 5 20 N O P Q R S T U V W X Y Z 63 48 51 80 23 8 18 16 完整代码如下:#includeiostreamstring#define N 100int *w;char *c,stackN,codeNN;int s1,s2;typedef struct HuffmanTree int weight; int parent; int lchild; int rchild;HuffmanTree,*Huff;void menu(void);void Select(struct HuffmanTree HT,int i);vo
2、id HuffmanTree(Huff &HT,int *w,int n);void visite(Huff HT,int i,int flag,int rear);void translatef(char *scource,char *save,int n);bool uncodef(FILE *fp1,FILE *fp2,Huff HT,int n);int inputHuff();void screanio(int n);void fileio(int n);int initHuff();void Print_tree(int n,Huff HT);void Convert_tree(H
3、uff HT,unsigned char T100100,int tt100100,int s,int *i,int j);void decoding(int n);void coding(int n);void main() int n=0; menu(); Huff HT; char state; do std:coutstate;fflush(stdin); /读取状态 switch(state) caseIn=inputHuff();HuffmanTree(HT,w,n);std:nHuffmanTree 初始化完毕nbreak; caseCcoding(n);Ddecoding(n)
4、;PPrint_tree(n,HT);Q while(state!=);void menu() /显示菜单函数 std:=HuffmanCoding=ninput tt donI ttInit_HUffTreen /初始化huffmantreeC ttCodingn /对ToBeTran.txt文件中的字符进行编码到CodeFile.txt中D ttUnCodingn /对CodeFile.txt中的01序列进行解码到TextFile.txtP ttPrintTreen /打印哈夫曼树Q ttquitn请初始化哈夫曼树再执行后面的操作nint inputHuff() /输入各个字母及其权值 i
5、nt i=1,n=0; int ww28; char cc28; while(1)input the letter(input # to stop): cci=std:cin.get(); if(cci=) break;input the weight:wwi; n+; i+; w=(int *)malloc(sizeof(int)*(n+1); c=(char *)malloc(sizeof(char)*(n+1); for(i=0;in+1;i+) wi=wwi; ci=cci; return n;HT,int *w,int n) /初始化哈夫曼树 int m,i; m=n*2-1; HT
6、=(struct HuffmanTree *)malloc(sizeof(struct HuffmanTree)*(m+1); HT0.lchild=0; HT0.parent=0; HT0.rchild=0; HT0.weight=0; for(i=1;m; HTi.weight=i=n?wi:0; HTi.lchild=HTi.rchild=HTi.parent=0; for(i=n+1;=m; Select(HT,i); HTi.lchild=s1; HTi.rchild=s2; HTi.weight=HTs1.weight+HTs2.weight; HTs1.parent=HTs2.p
7、arent=i;void Select(struct HuffmanTree HT,int i) /在HT1.i-1中选择parent为0且weight为最小的两个结点 int j; for(j=1;j=HTj.weight) s2=s1; s1=j; if(HTs2.weightHTj.weight&j!=s1) s2=j; if(s1=s2)s2=j; void Print_tree(int n,Huff HT) /以凹入法的形式打印树 unsigned char T100100; int tt100100; int i,j,m=0; FILE *fp; Convert_tree(HT,T
8、,tt,0,&m,2*n-1); /将内存中的赫夫曼树转换成凹凸表形式的树,存于数组T中 if(fp=fopen(treeprint.txt,wb+)=NULL) printf(Open file treeprint.txt error!n以凹凸表形式打印已建好的赫夫曼树:=2*n-1;i+) for (j=0;Tij!=0;j+) if(Tij= ) printf( fputc(Tij,fp); else printf(%d,ttij);fprintf(fp,%dnnn fclose(fp);n此字符形式的哈夫曼树已写入文件treeprint.txt中.nnn文件treeprint.txt的
9、打开方式要为写字板,若打开方式为记事本,则无法显示凹凸表的形式nvoid Convert_tree(Huff HT,unsigned char T100100,int tt100100,int s,int *i,int j) /将内存中的赫夫曼树转换成凹凸表形式的树,存于数组T中 int k,l; l=+(*i); for(k=0;k=50) k=0; putchar(n p=fgetc(fp1);bool uncodef(FILE *fp1,FILE *fp2,Huff HT,int n)/通过对树的访问,把文件中01序列转换成一个字母输出。本函数需循环调用,当读到时返回false if(!
10、fp1|!fp2) printf(error exit(0); if(HTn.lchild=0) fputc(cn,fp2); return true; else if(p=EOF) return false; if(p= uncodef(fp1,fp2,HT,HTn.lchild); else if(p= uncodef(fp1,fp2,HT,HTn.rchild); return true;/*以下在初始化哈夫曼树时复制粘贴可用,注意第一个为空格,weight为186,复制粘贴时要包括它.输入以#号结束186A64B13C22D32EF21G15H47I57J1K5LM20NO63PQR48S51T80U23V8W18XY16Z#*/
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1