1、 /* INT_MAX 等*/stdio.h /* EOF(=Z 或F6),NULL */stdlib.h /* atoi() */io.h /* eof() */math.h /* floor(),ceil(),abs() */process.h /* exit() */* 函数结果状态代码*/#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASIBLE -1/* #define OVERFLOW -2 因为在math. h 中已定义OVERFLOW 的值为3,故去掉此行*/typedef int Sta
2、tus; /* Status 是函数的类型,其值是函数结果状态代码,如OK 等*/typedef int Boolean; /* Boolean 是布尔类型,其值是TRUE 或FALSE */3、新建文件/C/C+ Header File,选中“添加到工程的复选按钮”,输入文件名“huffmanDef.h”,按“确定”按钮,在显示的代码编辑区内输入:#define uint unsigned int#define MAXSIZE1 50#define MAXSIZE2 500int t,count,num; /采用全局变量定义count存储字符个数,num存储从文件读取内容的个数uint wM
3、AXSIZE1;char cMAXSIZE1,dataMAXSIZE2; /采用全局变量定义的数组用于存储从文件读取的内容typedef char *HuffmanCode; /动态分配数组存储哈夫曼树编码表void Start_Screen() printf(nnn);t* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *tnt* *tnt* * 哈夫曼编译码系统 * *tnt* 1.更新哈夫曼编码信息 *tnt* 2.显示哈夫曼树及哈夫曼编码 *tnt* 3.将输入的文本编译为报文 *tnt* 4.将输入的报文编译为
4、文本 *tnt* 5.将已有的文本编译为报文 *tnt* 6.将已有的报文编译为文本 *tnt* 7.退出系统 *tnt* 请输入您的选择选择: scanf(%d,&t);4、新建文件/C/C+ Header File,选中“添加到工程的复选按钮”,输入文件名“huffmanAlgo.h”,按“确定”按钮,在显示的代码编辑区内输入:PrintHuffmanTree(HuffmanTree ht,int n) int i,m; m=2*n-1;t哈夫曼树及哈弗曼编码nn 序号 字符 权值 双亲 左孩子 右孩子n for(i=0;ich,hci); ht+;nnnnnnnnn/将哈夫曼树的初始信息
5、写入文件void WriteHuffmanTree() FILE *fp; uint we; char ch;请输入你需要的字符和权值,用#结束输入:n if(fp=fopen(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(
6、fp) fscanf(fp,ci); if(ci=n) continue; /读到换行符,跳过,读下一行%5dwi); count+; i+;/将内容写入文件void WriteDataFile(char *fileName) num=0; if(fp=fopen(fileName,fileName); num+;/读文件内容void ReadDataFile(char *fileName) if(datai=datai); datai=0;/编码,用已及建好的哈夫曼树,对所输入的文件进行编码形成报文void EnCoding(HuffmanCode hc) int i=0,j;请输入您需要进
7、行编码的文本,以#结束: WriteDataFile(ToBeTran.data ReadDataFile(Code.txtnum; ) putchar( for(j=0;jlchild!=-1) p=&htp-lchild; else if(datai=1rchild!rchild; else fprintf(fp,p- printf( p=& if(datai!) i-;/编码,用已及建好的哈夫曼树,对已有的文件进行编码形成报文void AlEnCoding(HuffmanCode hc) FILE *fp1,*fp2; if(fp1=fopen(feof(fp1) datai=fgetc
8、(fp1); num=i; fclose(fp1); if(fp2=fopen( fprintf(fp2, fclose(fp2);/译码,用用已及建好的哈夫曼编码,对已有的报文进行解译形成文本void AlDeCoding(HuffmanTree ht)an datai-1= fprintf(fp2,void main() HuffmanTree HT; HuffmanCode HC; Start_Screen(); ReadHuffmanTree(); /读哈夫曼树原始信息 CreateHuffmanTree(&HT,count); /创建哈夫曼树 HC=HuffmanCoding(HT,
9、count); /创建哈夫曼编码 while(1) switch(t) case 1: WriteHuffmanTree(); /更新哈夫曼树信息 ReadHuffmanTree(); /读哈夫曼树初始化信息 CreateHuffmanTree(& HC=HuffmanCoding(HT,count); break; case 2: PrintHuffmanTree(HT,count); /输出哈夫曼树 PrintHuffmanCode(HT,HC,count); /输出哈夫曼编码 exit(0); /表示程序正常退出 case 3: EnCoding(HC); /编码,对所输入的文本进行编码
10、形成报文 case 4: DeCoding(HT); /译码,对所输入的报文进行解译形成文本 case 5: AlEnCoding(HC); /编码,对所已有的文本进行编码形成报文 break; case 6: AlDeCoding(HT); /译码,对所已有的报文进行解译形成文本 case 7: exit(0); default:a system(cls /清屏 Start_Screen(); Start_Screen(); 5、新建文件/C+ Source File,选中“添加到工程的复选按钮”,输入文件名“huffmanUse.cpp”,按“确定”按钮,在显示的代码编辑区内输入:#inc
11、ludepubuse.hhuffmanDef.hhuffmanAlgo.hHuffmanTree HT;HuffmanCode HC;int Min(HuffmanTree bt,int m) int i,temp; uint k;i+) /取k等于首个parent为0的权值 if(bti.parent=0) k=bti.weight; temp=i; for(i=i+1;i+) /逐个与其他权值进行比较,并返回在parent为0下权值最小的序号 if(bti.weight ch=ci;weight=wi;parent=0;lchild=p-rchild=-1; /初始化二叉树结点,paren
12、t置为0,lchild,rchild均置为-1 p+; for(i=n;i+) /构造n-1个空二叉树用于存储新树根结点ch=* Select(*HT,i,&s1,&s2); (*HT)s1.parent=(*HT)s2.parent=i; (*HT)i.lchild=s1; (*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; char *hc; HC=(HuffmanCode )malloc(n*sizeof(char *); /动态申请指针存储哈夫曼编码 hc=(char *)malloc(n*sizeof(char); /申请哈夫曼编码的工作空间 hcn-1= top=n-1; t=i; f=HTi.parent; while(f!=0) if(HTf.lchild = t) hc-top= else hc-top= t=f; f=HTt.parent; HCi=(char *)malloc(n-top)*sizeof(char); /为已申请的指针分配一维数组存储哈夫曼编码 strcpy(HCi,&hct
copyright@ 2008-2023 冰点文库 网站版权所有
经营许可证编号:鄂ICP备19020893号-2