1、#define MAXSIZE1 50#define MAXSIZE2 500int t,count,num; uint wMAXSIZE1;char cMAXSIZE1,dataMAXSIZE2;typedef struct char ch;unsigned int weight;unsigned int parent,lchild,rchild;HTNode,*HuffmanTree;typedef char *HuffmanCode;/*/void Start_Screen() printf( nn); |-|n |-| n |-|n | |n | 005 哈夫曼编译码 |n | |n
2、| |n | 006 1哈夫曼编码 |n | 016 2显示哈夫曼编码 |n | 016 3输入文本编译报文 |n | 016 4输入报文编译文本 |n | 016 5已有文本编译报文 |n | 016 6已有报文编译文本 |n | 016 7退出系统 |n | 制作人:邓俊辉 |n |-|n 016 请输入您的选择选择: scanf(%d,&t);/选择权值最小且parent为0的二叉树,返回其序号int Min(HuffmanTree bt,int m) int i,temp; uint k; for(i=0;im;i+) /取k等于首个parent为0的权值 if(bti.parent=
3、0) k=bti.weight; temp=i; break; for(i=i+1;i+) /逐个与其他权值进行比较,并返回在parent为0下权值最小的序号 if(bti.weight ch=ci;weight=wi;parent=0;lchild=p-rchild=-1; /初始化二叉树结点,parent置为0,lchild,rchild均置为-1 p+; for(i=n;num;i+) /构造n-1个空二叉树用于存储新树根结点ch=*;i+) Select(*HT,i,&s1,&s2); (*HT)s1.parent=(*HT)s2.parent=i; (*HT)i.lchild=s1;
4、 (*HT)i.rchild=s2; (*HT)i.weight=(*HT)s1.weight + (*HT)s2.weight;/从叶子节点到根节点逆向求哈弗曼编码HuffmanCode HuffmanCoding(HuffmanTree HT,int n) int i,f,top; uint t; HuffmanCode HC; char *hc; HC=(HuffmanCode )malloc(n*sizeof(char *); /动态申请指针存储哈夫曼编码 hc=(char *)malloc(n*sizeof(char); /申请哈夫曼编码的工作空间 hcn-1=0 top=n-1;
5、t=i; f=HTi.parent; while(f!=0) if(HTf.lchild = t) hc-top=0 else hc-top=1 t=f; f=HTt.parent; HCi=(char *)malloc(n-top)*sizeof(char); /为已申请的指针分配一维数组存储哈夫曼编码 strcpy(HCi,&hctop); free(hc); return HC;/输出哈夫曼树void PrintHuffmanTree(HuffmanTree ht,int n) int i,m; m=2*n-1;t哈夫曼树及哈弗曼编码nn 序号 字符 权值 双亲 左孩子 右孩子n pri
6、ntf( %2d %c %5d,i,hti.ch,hti.weight); %5d %5d %5dn,hti.parent,hti.lchild,hti.rchild);/输出哈夫曼编码void PrintHuffmanCode(HuffmanTree ht,HuffmanCode hc,int n) int i; 字符t哈弗曼编码n %c %sn,ht-ch,hci); ht+;nnnnnnnnn/将哈夫曼树的初始信息写入文件void WriteHuffmanTree() FILE *fp; uint we; char ch;请输入你需要的字符和权值,用#结束输入:n if(fp=fopen
7、(DataFile.data,w)=NULL)nError on open %s!a exit(1);n%cch); while(ch!=#) scanf(we); fprintf(fp,%c,ch);%5dn,we); ch=getchar(); fclose(fp);/读哈夫曼树的初始信息void ReadHuffmanTree() int i=0; count=0;r /表示程序非正常退出 while(!feof(fp) fscanf(fp,ci); if(ci=n) continue; /读到换行符,跳过,读下一行%5dwi); count+; i+;/将内容写入文件void Writ
8、eDataFile(char *fileName) num=0; if(fp=fopen(fileName,fileName); num+;/读文件内容void ReadDataFile(char *fileName) if(datai=) continue;datai); datai=/编码,用已及建好的哈夫曼树,对所输入的文件进行编码形成报文void EnCoding(HuffmanCode hc) int i=0,j;请输入您需要进行编码的文本,以#结束: WriteDataFile(ToBeTran.data ReadDataFile(Code.txt ) putchar( for(j
9、=0;jlchild!=-1) p=&htp-lchild; else if(datai=rchild!rchild; else fprintf(fp,p- printf( if(datai! i-;/编码,用已及建好的哈夫曼树,对已有的文件进行编码形成报文void AlEnCoding(HuffmanCode hc) FILE *fp1,*fp2; if(fp1=fopen(feof(fp1) datai=fgetc(fp1); num=i; fclose(fp1); if(fp2=fopen( fprintf(fp2, printf( break; fclose(fp2);/译码,用用已及
10、建好的哈夫曼编码,对已有的报文进行解译形成文本void AlDeCoding(HuffmanTree ht)an datai-1= putchar( continue; fprintf(fp2, p=& if(datai! i-;void main() HuffmanTree HT; Start_Screen(); ReadHuffmanTree(); /读哈夫曼树原始信息 CreateHuffmanTree(&HT,count); /创建哈夫曼树 HC=HuffmanCoding(HT,count); /创建哈夫曼编码 while(1) switch(t) case 1: WriteHuff
11、manTree(); /更新哈夫曼树信息 ReadHuffmanTree(); /读哈夫曼树初始化信息 CreateHuffmanTree(& HC=HuffmanCoding(HT,count); case 2: PrintHuffmanTree(HT,count); /输出哈夫曼树 PrintHuffmanCode(HT,HC,count); /输出哈夫曼编码 exit(0); /表示程序正常退出 case 3: EnCoding(HC); /编码,对所输入的文本进行编码形成报文 case 4: DeCoding(HT); /译码,对所输入的报文进行解译形成文本 case 5: AlEnC
12、oding(HC); /编码,对所已有的文本进行编码形成报文 case 6: AlDeCoding(HT); /译码,对所已有的报文进行解译形成文本 case 7: exit(0); default:a system(cls Start_Screen(); Start_Screen(); 七、 实验结果:运行后各文件内容如下:DataFile.data文件A 64 B 13 C 22 D 32 E 103 F 21 G 15 H 47 I 57 J 1 K 5 L 32 M 20 N 57 O 63 P 15 Q 1 R 48 S 51 T 80 U 2 3 V 8 W 18 X 1 Y 16 Z 1 138CodeFile.data文件111010*00110 1010110001000010010010011001000100101001111100 101010110100110 1010111111001000111 1010111111101010010001101100100010001101111010100ToBeTran.data文件THIS PROGRAM IS MY FAVORITECode.txt文件110100*1111100010001010011000010010101011001011101100011111110010100011
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1