数据结构课程设计(c++) 3号题

来源:互联网 发布:中国消防网站域名 编辑:程序博客网 时间:2024/05/17 01:11

 数据结构课程设计

 

 

                                                            3号课程设计题目

姓       名

叶思怡

 学       号

              201311672123

专      业

                物联网工程1131

 学      院

   信息学院

 

 

一. 题目要求

 

题目3.

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

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

频度  180 64 13 23  3210322 15   4757  1 5  31  20

 

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

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

 

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

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


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

 

3)输出解密字符串。

 

二.程序如下

#include<stdio.h>#define N 27       //空格+26个大写字母#define M 2*N-1#define infinity 32767 struct node                //huffman树的结点结构{       int weight;            //结点权值       int plink,llink,rlink;           //双亲,左孩子,右孩子}; struct codetype           //huffman编码结构{       int start;               //起始位置       char bits[N+1];        //存放0,1的数组}; struct element            //字符及其编码的结构{       char symbol;             //字符       struct codetype code;         //字符编码}; struct node tree[M+1];            //n个结点的huffman树struct element table[N+1],t[100];        //n个结点的huffman编码表,报文编码int x1,x2; void sethuftree();                   //有关函数声明void select0(int s);void sethufcode();void setcode();void printtree();void printhufcode(); void main()                     //**********主函数**********{       sethuftree();       printtree();       sethufcode();       printhufcode();       setcode();       printf("\n\n");} void sethuftree()       //建立huffuman树{       int i,treeweight[N]={186,63,13,22,32,103,21,15,47,57,1,5,32,20,57,63,15,1,48,51,80,23,8,18,1,16,1};       char tablesymbol[N]={' ','A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};             for(i=1;i<=M;i++)                   //初始双亲,左,右结点为:0              tree[i].plink=tree[i].llink=tree[i].rlink=0;       for(i=1;i<=N+1;i++)        //初始化27个字符及其权值       {              table[i].symbol=tablesymbol[i-1];              tree[i].weight=treeweight[i-1];       }       for(i=N+1;i<=M;i++)               //找权值最小的2个结点,组成huffman树       {              select0(i-1);            //调用找权值最小的2个结点函数              tree[x1].plink=i;              tree[x2].plink=i;              tree[i].llink=x1;              tree[i].rlink=x2;              tree[i].weight=tree[x1].weight+tree[x2].weight;       }} void select0(int s)              //找权值最小的2个结点{       int i;       float v1,v2;       v1=v2=infinity;       x1=x2=0;       for(i=1;i<=s;i++)              if(tree[i].plink==0)                     if(tree[i].weight<v1)                     {                            v2=v1;                            x2=x1;                            v1=tree[i].weight;                            x1=i;                     }                     else if(tree[i].weight<v2)                     {                            v2=tree[i].weight;                            x2=i;       }} void printtree()            //输出huffman树{       int i;       printf("哈夫曼树为:\n\n");       printf("结点值 权值(频度) 双亲   左孩子  右孩子\n");       for(i=1;i<=N;i++)              printf("  %-8c%-11d%-8d%-8d%d\n",table[i].symbol,tree[i].weight,tree[i].plink,tree[i].llink,tree[i].rlink);       for(i=N+1;i<=M;i++)              printf("\t  %-11d%-8d%-8d%d\n",tree[i].weight,tree[i].plink,tree[i].llink,tree[i].rlink);       printf("\n\n------------------------------------------------------------------\n\n\n");} void sethufcode()           //建立huffman编码{       int i,s,f,k=1;       struct codetype c;       for(i=1;i<=N;i++)       {              c=table[i].code;              c.start=N+1;              s=i;              f=tree[s].plink;              do              {                     c.start--;                     if(s==tree[f].llink)                            c.bits[c.start]='0';                     else                            c.bits[c.start]='1';                     s=f;                     f=tree[s].plink;              }while(f);              table[i].code=c;       }} void printhufcode()                   //输出huffman编码,即空格+26个大写字母{       int i,j;       struct codetype c;       printf("编码为:\n");       for(i=1;i<=N;i++)       {              printf("%c:",table[i].symbol);              c=table[i].code;              for(j=c.start;j<=N;j++)                     printf("%c",c.bits[j]);              printf("\n");       }       printf("\n\n--------------------------------------------------------------------\n\n");} void setcode()                  //对字符进行编码{       int i,j,count;       char c0,k='Y';       struct codetype c;       while(k=='Y')                   //利用循环,实现对字符多次编码       {       printf("\n\n请输入需要加密的字符(大写字母+空格,不超过100),输入'.'(+回车)号结束\n\n");       for(i=1;i<=100;i++)           //利用循环,实现对字符输入


三.调试截图


四.设计说明

1.一般而言,给定n个实数w1,w2,......,wn(n≥2),求一个具有n个结点的二叉数,使其带权路径长度最小。所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。树的带权路径长度记为WPL=(W1*L1+W2*L2+W3*L3+...+Wn*Ln),N个权值Wi(i=1,2,...n)构成一棵有N个叶结点的二叉树,相应的叶结点的路径长度为Li(i=1,2,...n)。可以证明哈夫曼树的WPL是最小的。

 

2.给定字符集的哈夫曼树生成后,求哈夫曼编码的具体实现过程是:依次以叶子T[i](0≤i≤n-1)为出发点,向上回溯至根为止。上溯时走左分支则生成代码0,走右分支则生成代码1。

 

3.用一个外部变量COUNT记录下所输入的所有字符,然后,用外部变量COUNT0统计字符种类(方便统计后面统计频度),记录过程在创建huffuman树函数void CreatHT()里实现,并完成记录字符总数,统计字符种类、频度,完成huffman树的创建等。

 

五.体会和感受


1.其实上完一个学期的数据结构,还是会有很多不解和疑问的,不过我觉得老师是给了很多指导和思想方法也一直鼓励和引导我们自己多去做和思考。

 

2.学期开始的时候热情还比较多,会认真完成实验和作业,可能随着一些生活上的其他事情的影响,慢慢会有懈怠,但还是对这门课很有兴趣,有时候多思考,理解之后会觉得很多知识真的是很值得深入了解和学习,书上的思想方法也是很奇妙很精辟。

 

3.数据结构的笔试考试发现了自己很多还没有学习透彻的地方,虽然中间有金工实习,影响了部分学习时间,但是确实在考试中发现自己对数据结构的学习和研究还差很多。数据结构虽然不是一门技术或什么,但是肯定是很多学习的基础,需要用到的地方很多。

4.至于课程设计,一开始看到题目真的是不知所措,本来C++基础并不扎实,对编程更多是要多练习和理解吧,这样很多问题都可以用语言来解决,希望以后能够取得更大的进步和突破。

                                                                                                                                                                                        

 

 

 

 


0 0
原创粉丝点击