数据结构课程设计:3、哈夫曼编码/译码系统(树应用)

                                               哈夫曼编码/译码系统(树应用)

[问题描述]

 

利用哈夫曼编码进行通信,可以压缩通信的数据量,提高传输效率,缩短信息的传输时间,还有一定的保密性。现在要求编写一程序模拟传输过程,实现在发送前将要发送的字符信息进行编码,然后进行发送,接收后将传来的数据进行译码,即将信息还原成发送前的字符信息。

 

[实现提示]

 

在本例中设置发送者和接受者两个功能,

发送者的功能包括:

①输入待传送的字符信息;

②统计字符信息中出现的字符种类数和各字符出现的次数(频率);

②根据字符的种类数和各自出现的次数建立哈夫曼树;

③利用以上哈夫曼树求出各字符的哈夫曼编码;

④将字符信息转换成对应的编码信息进行传送。

接受者的功能包括:

①接收发送者传送来的编码信息;

②利用上述哈夫曼树对编码信息进行翻译,即将编码信息还原成发送前的字符信息。

从以上分析可发现,在本例中的主要算法有三个:

(1)哈夫曼树的建立;

(2)哈夫曼编码的生成;

(3)对编码信息的翻译。

 

[设计思路]

 

  1. 哈夫曼树的建立
  2. 哈夫曼编码的生成
  3. 对编码信息的翻译

[代码及注释]

#include
#include
#include
#include
using namespace std;
#define MAXSIZE 111                                       /*可传递信息的最大长度*/
//结构
typedef struct{
    int weight;                                           /*结点的权值*/
    int parent,lchild,rchild;                             /*结点的双亲、左孩子、右孩子的下标*/
    char ch;                                              /*结点的字符*/
    string HuffmanCode;                                   /*结点的哈夫曼编码*/
}HTNode,*HuffmanTree;                                     /*动态分配数组储存哈夫曼树*/
map Map;                                        /*map容器储存字符及对应次数*/
//子函数
void GetInformation(int &kind);                           /*统计字符种类数和各字符出现的次数*/
void SelectMinNode(HuffmanTree &HT,int k,int &s1,int &s2);/*选择两个权值最小结点*/
bool CreatHuffmanTree(HuffmanTree &HT,int n);             /*哈夫曼树的创建*/
void CreatHuffmanCode(HuffmanTree &HT,int n);             /*哈夫曼编码的创建*/
void Translate(HuffmanTree HT,int n);                     /*译码*/
//具体内容
void GetInformation(int &kind)
{
    kind=0;
    cout<<"输入传递信息(不含中文):";
    char str[MAXSIZE];
    gets(str);                                            /*可读入含空格道德字符串*/
    for(int i=0;i ::iterator it=Map.begin();
    while(it!=Map.end())
    {
        ++kind;
        it++;
    }                                                     /*迭代器遍历*/
    cout< ::iterator it=Map.begin();
        int j=0;
        while(it!=Map.end())
        {
            ++j;
            HT[j].weight=(*it).second;                      /*初始化字符出现次数*/
            HT[j].ch=(*it).first;                           /*初始化字符*/
            HT[j].HuffmanCode="";                           /*初始化哈夫曼编码为空*/
            HT[j].lchild=HT[j].rchild=HT[j].parent=0;       /*左右孩子及双亲均初始化为0*/
            ++it;
        }
        for(int i=n+1;i<=m;++i)
            HT[i].weight=HT[i].parent=HT[i].rchild=HT[i].lchild=0;
                                                            /*初始化从n+1到m的结点*/
        for(int i=n+1;i<=m;++i)                             /*n-1次的选择删除合并来创建哈夫曼树*/
        {
            int s1,s2;
            SelectMinNode(HT,i-1,s1,s2);                    /*将最小两个结点的下标赋予s1,s2;*/
            HT[s1].parent=i;                                /*s1双亲亲赋予i第i编号*/
            HT[s2].parent=i;                                /*s2双亲亲赋予i第i编号*/
            HT[i].lchild=s1;                                /*s1成为编号为i的左孩子*/
            HT[i].rchild=s2;                                /*s2成为编号为i的右孩子*/
            HT[i].weight=HT[s1].weight+HT[s2].weight;       /*合并左右孩子权值*/
        }
        cout<<"<<<<哈夫曼树创建成功"<>str;
    int len=str.size();
    int flag=-1;                                            /*判断译码是否成功的标志*/
    string ans,temp;                                        /*ans:最终译码答案*/
                                                            /*temp:匹配临时字符串*/
    for(int i=0;i>judge;
    if(judge=='y')Translate(HT,n);
    else return;
}
int main()
{
    HuffmanTree HT;
    int kind;
    GetInformation(kind);
    if(CreatHuffmanTree(HT,kind))
    {
        CreatHuffmanCode(HT,kind);
        Translate(HT,kind);
    }

    return 0;
}

[简单展示]

数据结构课程设计:3、哈夫曼编码/译码系统(树应用)_第1张图片

你可能感兴趣的:(数据结构课程设计)