实验3:   哈夫曼编/译码器   
  (数据结构题集P98   严蔚敏编   清华大学出版社)   
  〔问题描述〕   
          利用哈夫曼编码进行信息通讯可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码;在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼码的编译码系统。   
  [基本要求]   
  一个完整的系统应具有以下功能:   
  (1)I:初始化(Initialization)。从终端读入字符集大小n,及n个字符和n个权值,建立哈夫曼树,并将它存于文件一hfmtree中。   
  (2)C:编码(Coding)。利用已建好的哈夫曼树(如不在内存,则从文件hfmtree中读人),对文件tobetrans中的正文进行编码,然后将结果代码存入文件codefile中。   
  (3)D:译码(Decoding)。利用已建好的哈夫曼树将文件codefile中的代码进行译码,译码结果存入文件textfile中。   
  (4)P:印代码文件(Print)。将文件   codefile中的代码以紧凑格式显示在终端上,每行50个代码。同时将其对应字符形式的编码(译码)显示在终端上并写人文件codeprlnt中。   
  (5)T:印哈夫曼树(Tree   printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件treeprint中。   
  [测试数据]   
    
  (1)   用下表中给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码;"THIS   PROGRAM   IS   MY   FAVORITE"^   
    
  字符            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   
  [实现提示]   
          (1)文件codefile的基类型可以设为子界型   bit=   0..1。   
          (2)用户界面可以设计为“莱单”方式:显示上述功能符号,再加上“E”,表示结束运行End,请用户键人一个选择功能符。此功能执行完毕后再显示此菜单,直至某次用户选择了“E”为止。   
  (3)在程序的一次执行过程中,第一次执行I、D或C命令之后,哈夫曼树已经在内存了,不必再读入。每次执行中不一定执行I命令,因为文件hfintree可能早已建好。   
  (4)哈夫曼树可采用静态链表存储结构(参看6.3.2)。其文件操作方式可采用二进制文件读写方式(参看C++课本9.5.9)。   
  (5)建议先编(1)与(5),再编(2)与(4)中的代码打印,最后编(3)与(4)中的译码打印  
我的邮箱是330312611@QQ.com 
  
[em18][em18]