• 大小: 12KB
    文件类型: .cpp
    金币: 1
    下载: 0 次
    发布日期: 2021-05-08
  • 语言: C/C++
  • 标签:

资源简介

利用哈夫曼编码进行信息通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。试为这样的信息收发站写一个哈夫曼编/译码系统。 [基本要求] 一个完整的系统应具有以下功能: (1)I:初始化(Initialization)。从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。 (2)E:编码(Encoding)。利用已建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。 (3)D:译码(Decoding)。利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。 (4)P:印代码文件(Print)。将文件CodeFile以紧凑格式显示在终端上,每行50个代码。同时将此字符形式的编码写入文件CodePrint中。 (5)T:印哈夫曼树(Tree Printing)。将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

资源截图

代码片段和文件信息

#include
#include 
#include 
using namespace std; 
#include 
#include 
typedef struct
{
 char character;
 unsigned int weight;
 unsigned int parentlchildrchild;
}HTNode*HuffmanTree;
typedef char **HuffmanCode;
char *c;
FILE *ff;
int L;
struct H{
       char s[1000];
       };
       H hc[1000];
HuffmanTree HT;                   
HuffmanCode HC;                    
void menu()                                                      //定义菜单函数
{
 printf(“please make the choice:\n“);
 cout<<“*****     I: 初始化        *****“< cout<<“*****     E:编码          *****“< cout<<“*****     D:译码          *****“< cout<<“*****     P:印代码文件    *****“< cout<<“*****     T: 印赫夫曼树    *****“< cout<<“*****     Q: 退出          *****“<}

void Select(HuffmanTree &HTint endint &s1int &s2)            //选择权值最小的两个结点
{
 int i;
 int weight1weight2;                                           //定义两个最小权值
 weight1=weight2=1000;                          
 
 for(i=1;i<=end;i++)
 {
  if(HT[i].parent==0 && HT[i].weight  {
   weight1 = HT[i].weight;
   s1 = i;
  }
 }
 for(i=1;i<=end;i++)
 {
  if(HT[i].parent==0 && HT[i].weight  {
   weight2 = HT[i].weight;
   s2 = i;
  }
 }
 
}
void Initialization(HuffmanTree &HTHuffmanCode &HC)                   //初始化赫夫曼树
{
 FILE *fp*fp1;
 fp=fopen(“hfmTree.txt““w+“);                         //以写的方式打开文件,如果文件不存在,则创建文件 
 fp1=fopen(“ht.txt““w+“);                             //编辑两个文件 
 int mnis1s2startfb;
 int *w;
 char *cd;
 bool flag = true;                                     //布尔类型 
 printf(“please input n: \n“);
 scanf(“%d“&n);
 fprintf(fp“%d\n“n);                                 //将常规变量格式化输出到指定文件 
 fprintf(fp1“%d\n“n);
 if(n<=1)return;
 w=(int *)malloc((n+1)*sizeof(int));                   //动态申请数组空间存储结点的权值
 c=(char *)malloc((n+1)*sizeof(char));                 //动态申请数组空间存储结点字符
    printf(“please input character and weight: \n“);
    for(i=1;i<=n;i++)
 {
  fflush(stdin);
  cout<<“请输入第“<  scanf(“%c“&c[i]);
  scanf(“%d“&w[i]);
 }
 m=2*n-1;                                              //有n个叶子的huffman树共有2*n-1个结点
 HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
 for(i=1;i<=n;i++)                                     //初始化赫夫曼树
 {                                                     //叶子赋字符和权值 
  HT[i].character=c[i];
  HT[i].weight=w[i];
  HT[i].parent=0;                                      //清华大学数据结构P149页表格直观显示存储结构
  HT[i].lchild=0;
  HT[i].rchild=0;
 }
 for(i=n+1;i<=m;++i)
 {                                                     //非叶子节点置零 
  HT[i].character=0;
  HT[i].weight=0;
  HT[i].parent=0;
  HT[i].lchild=0;
  HT[i].rchild=0;
 }

 for(i=n+1;i<=m;++i)                                    //选择权值最小的两个结点 
 {
  Select(HTi-1s1s2);                           
  HT[s1].parent=i;
  HT[s2].parent=i;
  HT[i].lch

评论

共有 条评论

相关资源