哈夫曼编解码 完整c程序代码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

哈夫曼编解码完整c程序代码

Huffman 编码进行通信可以大大提高信道的利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据进行预先编码,在接收端进行解码。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/解码系统。

2)要求:

一个完整的huffman编解码系统应该具有以下功能:

初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立Huffman 树,并将它存入hfmTree 中。

编码(Encoding)。利用已经建好的Huffman树(如果不在内存,则应从文件hfmTree中读取),对文件ToBeTran中的正文进行编码,然后将结果存入文件hfmTree中读取),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。

解码(Decoding)。利用已经建立好的Huffman树将文件CodeFile中的代码进行解码,结果存入TextFile中。

打印代码文件(Print)。将文件CodeFile以紧凑的格式显示在终端上,每行50 个代码。同时将此字符形式的编码文件写入文件CodePrint中。

打印Huffman树(Tree Printing)。将已经在内存中的Huffman树以直观的形式(树或者凹入的形式)显示在终端上,同时将此字符形式的Huffman 树写入文件TreePrint中。3) 测试数据: 用下表给出的字符集和频度的实际统计数据建立Huffman树,并对以下报文进行编码和译码:“THIS PROGRAM IS MY FAVORITE”。字符 A B C D E F G H I J K L M 频度1866413223210321154757153220 字符 N O P Q R S T U V W X Y Z 频度5763151485180238181161 完整代码如下:

#include

h>#include#include#define N100int

*w;char *c,stack[N],code[N][N];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); void

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(Huff HT,unsigned char

T[100][100],int tt[100][100],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::cout<<"input:\n";std::cin>>state;fflush(stdin); //读取状态

switch(state){ caseI:n=inputHuff();HuffmanTree(HT,w,n);st d::cout<<"\nHuffmanTree 初始化完毕\n";break;

caseC:coding(n);break; caseD:decoding(n);break;

caseP:Print_tree(n,HT);break;

caseQ:break;}}while(state!=Q);}void menu()

//显示菜单函数

{std::cout<<"===========HuffmanCoding===========\n"; std::cout<<"input \t\t do\n";std::cout<<"I

\t\tInit_HUffTree\n"; //初始化huffmantreestd::cout<<"C \t\tCoding\n"; //对ToBeTran、txt文件中的字符进行编码到CodeFile、txt中std::cout<<"D \t\tUnCoding\n"; //对CodeFile、txt中的01序列进行解码到TextFile、

txtstd::cout<<"P \t\tPrintTree\n"; //打印哈夫曼树

std::cout<<"Q \t\tquit\n";std::cout<<"请初始化哈夫曼树再执行后面的操作\n";}int inputHuff()

//输入各个字母及其权值{int i=1,n=0;int ww[28];char cc[28];while(1){std::cout<<"input the letter(input # to stop):";cc[i]=std::cin、

get();fflush(stdin);if(cc[i]==#)break;std::cout<<"input

the

weight:";std::cin>>ww[i];fflush(stdin);n++;i++;}w=(int *)malloc(sizeof(int)*(n+1));c=(char

*)malloc(sizeof(char)*(n+1));for(i=0;i

*w,int n)

//初始化哈夫曼树{int m,i;m=n*2-1;HT=(struct HuffmanTree *)malloc(sizeof(struct

HuffmanTree)*(m+1));HT[0]、lchild=0;HT[0]、

parent=0;HT[0]、rchild=0;HT[0]、

weight=0;for(i=1;i

weight=i<=n?w[i]:0;HT[i]、lchild=HT[i]、rchild=HT[i]、parent=0;}for(i=n+1;i<=m;i++){ Select(HT,i);HT[i]、

lchild=s1;HT[i]、rchild=s2;HT[i]、weight=HT[s1]、

weight+HT[s2]、weight;HT[s1]、parent=HT[s2]、

parent=i;}}void Select(struct HuffmanTree HT[],int i) //在HT[1、、i-1]中选择parent为0且weight为最小的两个结点{ int j;for(j=1;j

==0){s1=j;s2=j;goto flag;}}flag:

for(j=s1+1;j=HT[j]、weight){s2=s1;s1=j;}if(HT[s2]、

相关文档
最新文档