文档详情

原创哈夫曼编译码器.doc

发布:2018-02-26约6.52万字共14页下载文档
文本预览下载声明
哈夫曼编译码器 哈夫曼编/译码器 任务:利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接受端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼编/译码系统。 功能要求: (1) 初始化(readdata)。从终端读入字符集大小n,以及n个字符和n个权值。 (2) 建立哈夫曼树(createhuff)。根据n个字符和n个权值建立哈夫曼树,并可以将建好的哈夫曼树显示在终端上。 (3) 编码(encoding)。利用已建好的哈夫曼树,对输入(或文件file1.txt中)的正文进行编码,然后将结果在终端输出(或存入文件file2.txt)。 (4) 译码(decoding)。利用已建好的哈夫曼树将内存(或文件file2.txt)中的代码进行译码,结果在终端输出(或存入文件file3.txt)。 测试数据 用下表给出的字符集和频度的实际统计数据建立哈夫曼树 字符 空格 a b c d e f g h i j k l m 频度 186 64 13 22 32 103 21 15 47 57 1 5 32 20 字符 n o p q r s t u v w x y z 频度 57 63 15 1 48 51 80 23 8 18 1 16 1 算法设计思想: 设w存放n个字符和n个权值,可用顺序存储结构(也可用链式存储结构)ht存储哈夫曼树,用hc存储n个字符的哈夫曼编码。根据w中存放的数据,可以用课本上的算法建立哈夫曼树,也可用其他的方法建立哈夫曼树;对于编码,可以对已建立的哈夫曼树,求出n个字符的编码,存放于hc,这过程可以从每一叶子结点开始到根结点的顺序来生成。然后,对要编码的报文根据hc中的码表进行编码并输出(也可存于一文件);对于译码,可以根据输入(或从文件读入)的代码,根据哈夫曼树来译码,其方法是,从哈夫曼树的根结点开始,碰到为‘0’的代码转向左孩子,碰到‘1’的代码转向右孩子,直至叶子结点,该叶子结点的有关数据就是一个所要译的码,这样重复进行,到代码译完为止。 源代码: #includeiostream #includefstream #includeiomanip #includecstring #includecstdio using namespace std; typedef struct { unsigned int weight; unsigned int parent,lchild,rchild; }HTNode,*HuffmanTree; typedef struct { char ch; char *hufCh; }HuffmanCode; typedef struct { char ch; int wt; }wElem; void Select(HuffmanTree HT,int i,int s1, int s2) { unsigned int sm1,sm2; s1=1;s2=1; int m=0; for(m=1;m=1;m++) { if(HT[m].parent!=0)continue; else { sm1=HT[m].weight; s1=m;break; } } for(int j=m+1;j=i;j++) { if(HT[j].parent!=0)continue; else { if(sm1HT[j].weight) { sm1=HT[j].weight; s1=j; } } } for(m=1;m=i;m++) { if(HT[m].parent!=0)continue; else { sm2=HT[m].weight; s2=m; if(s2==s1)continue; else break; } } for(int k=m+1;k=i;k++) { if(HT[k].parent!=0)continue; else { if((HT[k].weightsm2)(k!=s1)) { sm2=HT[k].weight; s2=k; } } } } void HuffmanCoding(HuffmanTree HT,HuffmanCode *HC,wElem *w,int n) { if(n=1)return; int m=2*n-1; HT=(HuffmanTree)ma
显示全部
相似文档