数据结构课程设计 赫夫曼加密算法

来源:互联网 发布:淘宝拍照用手机可以吗 编辑:程序博客网 时间:2024/05/16 11:14

一、实验目的  

        通过课程设计,巩固和加深对线性表、栈、队列、字符串、树、图、查找、排序等理论知识的理解;掌握现实复杂问题的分析建模和解决方法(包括问题描述、系统分析、设计建模、代码实现、结果分析等);提高利用计算机分析解决综合性实际问题的基本能力。 

二、需求分析  

1、文件加密核心算法(赫夫曼编码)设计  

文件加密的核心算法是赫夫曼编码,赫夫曼编码的完成首先建立在赫夫曼树的创建,在此之前要完成编码字符的权值计算,依照题意:  

 1、输入26个字符的权值。  

 2、 依次找出最小的权值,创建赫夫曼树HuffmanTree。  

 3、赫夫曼树创建完毕,即可进行字符串的编码和解码工作。核心算法即完成。

2、功能要求和说明

在一个加密应用中,要处理的信息来自下面的字符集,各个字符的相关使用频度如下:

字符 空格 A  B  C  D   E  F  G   H  I   J  K  L  M

频度 180  64 13 23 32 103 22 15  47 57  1  5  31 20

字符 N  O   P  Q  R   S   T   U  V  W  X  Y   Z 

频度 55 63 15  1  48  56  80  25 7 18  2  16  1

现请编写程序你实现如下功能:

(1)运行时,由用户输入来初始化字符集大小和相应用字符。

(2)输入一个要加密的字符串,将其加密。

(3)输出解密字符串。

三、系统实现

1、输入权值

 

2、输入权值构造赫夫曼树后A到Z的编码为:

 

3、选出要进行解密的字符的编码:

 

4、解码后为:

 

四、实习总结与体会

        这次的课程设计让我深深地感觉到无力和无奈。动手做程序的难度和学习理论知识是不能同日而语的,一些自己以为已经掌握了的知识,在做程序的过程中,无法把知识转换为代码,脑子里的想法不能用代码实现出来,实现出来的功能有和自己想的不一样。学习编程的道路,任重而道远~~

五、程序代码

#include<iostream.h>#include<iomanip.h>#include<windows.h>const int n=26;const int m=2*n-1;struct tree{float weight;int parent;int lchild,rchild;};struct codetype{int bits[n+1];   //数组int start;       //编码的起始下标char ch;         //字符的权值};tree hftree[m+1];codetype code[n+1];void creathuffmantree(){int i,j,p1,p2;float s1,s2;for(i=1;i<=m;i++){hftree[i].parent=0;hftree[i].lchild=0;hftree[i].rchild=0;hftree[i].weight=0;}cout<<"请输入26个字母的权值:>>>";for(i=1;i<=n;i++)cin>>hftree[i].weight; //输入权值for(i=n+1;i<=m;i++)            //进行次合作{p1=p2=0;                   //p1.p2分别指向两个最小的值的位置s1=s2=32767;               //s1.s2代表两个最小权值for(j=1;j<=i-1;j++)        //选两个最小值if(hftree[j].parent==0)//该权值还没有被选中if(hftree[j].weight<s1){s2=s1;s1=hftree[j].weight;p2=p1;p1=j;}elseif(hftree[j].weight<s2){s2=hftree[j].weight;p2=j;}//以下为合并hftree[p1].parent=i;hftree[p2].parent=i;hftree[i].lchild=p1;  //小的放左边hftree[i].rchild=p2;  //大的放右边hftree[i].weight=hftree[p1].weight+hftree[p2].weight;}}void huffcode()                       //哈弗曼编码{codetype cd;int c,p;for(int i=1;i<=n;i++){cd.start=n+1;cd.ch=64+i;                    //第一个树叶对应字母A,其余依次类推c=i;p=hftree[i].parent;while(p!=0){cd.start--;if(hftree[p].lchild==c) cd.bits[cd.start]=0;else cd.bits[cd.start]=1;c=p;p=hftree[p].parent;}code[i]=cd;}cout<<endl;system("cls");cout<<"*******************************欢迎使用哈夫曼树系统*****************************"<<endl;for(i=1;i<=n;i++){cout<<"字符"<<code[i].ch<<"的权值为:"<<hftree[i].weight<<"  编码为:";for(int j=code[i].start;j<=n;j++)cout<<code[i].bits[j]<<" ";cout<<endl;}}void trancode()            //哈弗曼译码{int i=m;char b;cout<<"                                                                "<<endl;cout<<"★请输入您所需要加密的字符的二进制代码:"<<endl;cin>>b;cout<<"                                                                "<<endl;cout<<"                                                                "<<endl;cout<<"                                                                "<<endl;cout<<"★二进制代码解密后为:"<<endl;while((b=='0')||(b=='1')){if(b=='0')i=hftree[i].lchild;else i=hftree[i].rchild;if(hftree[i].lchild==0){cout<<code[i].ch;i=m;}cin>>b;}}void main(){creathuffmantree();      //建立哈夫曼树huffcode();              //实现哈夫曼编码trancode();              //译码}


0 0
原创粉丝点击