哈夫曼编译器

(10页)

'哈夫曼编译器'
问题描述:利用哈夫曼编码进行信息通讯可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统,试为这样的信息收发站写一个哈夫曼编译码系统。一个完整的系统应具有以下功能:(1) (1) I: 初始化。从终端读入字符集大小 n ,及 n 个字符和 n 个权值,建立哈夫曼树,并将其存于文件hfmtree中。(2) C: 编码。利用已建好的哈夫曼树(如不在内存,则从文件hfmtree中读入),对文件tobetrans中的正文进行编码,然后将结果存入文件codefile中。(3) D: 译码。利用已建好的哈夫曼树将文件codefile中的代码进行译码,结果存入文件textfile中。(4) P: 打印代码文件。将文件codefi1e以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码文件写入文件codeprint中。(5) T:打印哈夫曼树。将已在内存中的哈夫曼树以直观的方式(树或凹凸表形式)显示在屏幕上,同时将此字符形式的哈夫曼树写入文件treeprint中。实现提示:1、用户界面可以设计为“菜单”方式:显示上述功能号,再加上“E”表示结束运性行结束,用户键入一个选择功能字符,则执行相应的功能,此功能执行完毕后再显示此菜单,直至用户选择了“E”为止。2、在程序的一次执行过程中,第一次执行了I、D 或 C 命令之后,哈夫曼树已经在内存中存在了,不必再读入。每次执行中不一定执行 I 命令,因为文件 hfmtree 可能早已建好。我写的源程序如下: #include <stdio.h>#include <stdlib.h>#include <string.h>///////////////////////////////////////////////////////////////////////////////*定义赫夫曼树结点的结构体变量,存放结点的权值、字符、双亲、坐孩子和右孩子*/typedef struct{           int weight;      char ch;                 //增加一个域用于存放该节点的字符        int parent,lchild,rchild;}HTNode,*HuffmanTree;typedef char **HuffmanCode; //指向赫夫曼编码的指针///////////////////////////////////////////////////////////////////////////////*本程序用到的函数原型*/void welcome();    //打印操作选择界面void HuffmanCoding(HuffmanTree &,char *,int *,int);//建立赫夫曼树的算法void select(HuffmanTree HT,int j,int *s1,int *s2); //从目前已建好的赫夫曼树中选择parent为0且weight最小的两个结点void Init(); //输入n个字符及其对应的权值,根据权值建立哈夫曼树void Coding(); //编码void Decoding(); //译码void Print_code(); //打印译码好的代码文件void Print_tree(); //以凹凸表形式打印哈夫曼树int Read_tree(HuffmanTree &); //从文件中读入赫夫曼树void find(HuffmanTree &HT,char *code,char *text,int i,int m);//译码时根据01字符串寻找相应叶子节点的递归算法void Convert_tree(unsigned char T[100][100],int s,int *i,int j);//将内存中的赫夫曼树转换成凹凸表形式的赫夫曼树HuffmanTree HT; //全局变量,指向存放赫夫曼树的存储空间int n=0; //全局变量,存放赫夫曼树叶子结点的数目int main(){char select;while(1){   welcome();   scanf("%c",&select);   switch(select)   {   case 'i':   case 'I':Init();break;   case 'c':   case 'C':Coding();break;   case 'd':   case 'D':Decoding();break;   case 'p':   case 'P':Print_code();break;   case 't':   case 'T':Print_tree();break;   case 'e':   case 'E':exit(1);   default :printf("Input error!\n");   }   getchar();}return 0;}void welcome() //打印操作选择界面{printf("*-----------------------------------------------------*\n");printf("|                What do you want to do?              |\n");printf("|-----------------------------------------------------|\n");    printf("|                                                     |\n");printf("| I--------------------------Init the Huffman tree. |\n");printf("| C--------------------------Code your file.         |\n");printf("| D--------------------------Decode the code.        |\n");printf("| P--------------------------Print the codefile.     |\n");printf("| T--------------------------Print the Huffman tree. |\n");    printf("|                                          
关 键 词:
哈夫曼 编译器
 天天文库所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
关于本文
本文标题:哈夫曼编译器
链接地址: https://www.wenku365.com/p-44814932.html
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服点击这里,给天天文库发消息,QQ:1290478887 - 联系我们

本站为“文档C2C交易模式”,即用户上传的文档直接卖给(下载)用户,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有【成交的100%(原创)】。本站是网络服务平台方,若您的权利被侵害,侵权客服QQ:1290478887 欢迎举报。

1290478887@qq.com 2017-2027 https://www.wenku365.com 网站版权所有

粤ICP备19057495号 

收起
展开