课程论文题目:哈夫曼树及其应用课程设计报告学号: 201230210115姓名:黄文宣班级: 1232101专业:信息安全课程名称:数据结构课程老师:王晓燕二零一肆年一月目录1、课程设计的题目及简介 (3)2、实验目的 (3)3、设计说明 (4)4、总体流图 (4)5、详细设计 (5)6、实现部分 (6)7、测试程序 (9)8、心得与体会 (10)一、课程设计题目哈夫曼树及其应用数据的读入﹑存储,生成文件,将键盘输入的信息存入指定的文件中;设计一程序求解此问题.哈夫曼(Huffman)编码原理是一种利用二叉树实现的编码原理建立的哈夫曼树编码,再从键盘输入二进制的编码进行译码,输出译码。
哈夫曼编码的码长是变化的,对于出现频率高的信息,编码的长度较短;而对于出现频率低的信息,编码长度较长。
这样,处理全部信息的总码长一定小于实际信息的符号长度。
锻炼我们的编码能力,真正理解数据结构的编码思想,并且锻炼我们的动手能力和成员间的配合,提高程序编写能力。
二、实验目的1 熟悉树的各种存储结构及其特点。
2 掌握建立哈夫曼树和哈夫曼编码的方法及带权路径长度的计算。
三、设计说明建立哈夫曼树,将哈夫曼树的结构定义为一个结构型的一维数组,每个元素含有四项:权值,双亲,左孩子,右孩子。
哈夫曼树上进行二进制编码:往左走,编码为0,往右走,编码为1,然后将从根结点到树叶中的所有0、1排列起来,则得到该树叶的哈夫曼编码。
哈夫曼编码用一个结构型的一维数组保存,每个元素包含:编码、编码的开始位置、编码所对应的字符三项。
给定的权值从键盘输入,输出所建立的哈夫曼树编码,再从键盘输入二进制的编码进行译码,输出译码。
四、总体流图哈夫曼树编码系统初始化编码重新建立哈夫曼树译码打印编码五、详细设计1.数据结构设计#include<iostream.h> //包含的库函数#include<string.h>#include<iomanip.h> const int n=6; //叶子数目const int m=2*n-1; //森林中树的棵树const int c=4;class tree { public: char data;int weight; //权值int parent; //双亲int lch,rch; //左右孩子void creathafumantree(); //建立哈夫曼树void editcode();//编码函数void trancode(char b[],int max);//译码函数哈夫曼树译码算法:译码:弹出译码界面→利用建立好的哈弗曼树进行译码→将译码输出→保存译码文件void tree::trancode(char b[],int max){ //译码int i=0;int j=m;cout<<"该段代码编译为:"<<endl;while(b[i]!='\0'){if(b[i]=='0')j=hftree[j].lch;elsej=hftree[j].rch;if(hftree[j].lch==0 && hftree[j].rch==0){cout<<hftree[j].weight;j=m;}i++;}}六、实现部分#include <string.h>#include <stdio.h>#include <stdlib.h>#define n 6#define m 2*n-1typedef struct{ float weight;int lchild,rchild,parent;}codenode;typedef codenode huffmantree[m];typedef struct{ char ch;char bits[n+1];}code;typedef code huffmancode[n];void inithf(huffmantree T) //-哈夫曼树的初始化{ int i;for(i=0;i<m;i++){ T[i].weight=0;T[i].parent=-1;T[i].lchild=-1;T[i].rchild=-1;}}void inputhf(huffmantree T) //-输入哈夫曼树的树据{ int i;float k;for(i=0;i<n;i++){ scanf("%f",&k);T[i].weight=k;}}void selectmin(huffmantree T,int k,int *p1,int *p2){ int i;float small1=10000,small2=10000;for(i=0;i<=k;i++){ if(T[i].parent==-1)if(T[i].weight<small1){ small2=small1;small1=T[i].weight;*p2=*p1;*p1=i;}elseif(T[i].weight<small2){ small2=T[i].weight;*p2=i;}}}void creathftree(huffmantree T) //-建哈夫曼树{ int i,p1,p2;inithf(T);inputhf(T);for(i=n;i<m;i++){ selectmin(T,i-1,&p1,&p2);T[p1].parent=T[p2].parent=i;T[i].lchild=p1;T[i].rchild=p2;T[i].weight=T[p1].weight+T[p2].weight;}}void creathfcode(huffmantree T, huffmancode H) //-哈夫曼编码表{ int i,c,p,start;char cd[n+1];cd[n]='\0';for(i=0;i<n;i++){ H[i].ch=getchar();start=n;c=i;while((p=T[c].parent)>=0){cd[--start]=(T[p].lchild==c)?'0':'1';c=p;}strcpy(H[i].bits,&cd[start]);}}void zip(huffmancode H,char *ch,char *s) //-编码{ int j=0;char *p[n]; unsigned int i;for(i=0;i<strlen(ch);i++){ while(ch[i]!=H[j].ch) j++;p[i]=H[j].bits;}strcpy(s,p[0]);for(i=1;i<n;i++)strcat(s,p[i]);puts(s);}void uzip(huffmancode H,char *s,huffmantree T) //-解码{ int j=0,p;unsigned int i;char ch[n+1];while(i<strlen(s)){ p=m-1;while(T[p].lchild!=-1){ if(s[ i]=='0'){ p=T[p].lchild;i++;}else{ p=T[p].rchild;i++;}}ch[j]=H[p].ch;j++;}ch[j]='\0';puts(ch);}main(){ char ch[]="abcdef", s[36];huffmantree T;huffmancode H;creathftree(T);creathfcode(T,H);zip(H,ch,s);uzip(H,s,T);}七、测试程序七、心得体会这次实验,感觉到相对难度较大,用了比较长的时间来做,从这也反映了对树的知识不够熟练。
但在这次实验的练习中,不仅对树的知识进行了综合运用,还有了较深一步的了解,掌握了运用树的基本知识。
总之,对树和二叉树这方面的知识了解和运用都还有待加强。
在实验中也出现了很多的问题,最大的问题就是对程序设计框架结构的不了解,在实现代码与功能的连接时经常会出现各种不同的错误,在实现一些功能时系统常常会报错。
许多错误不知从哪修改,让程序运行不出来。
课程设计中,既回顾了很多以前的东西,也发现了很多的问题,以前都没遇见过的,收获很大。
通过本次数据结构的课程设计,我学习了很多在上课没懂的知识,并对求哈夫曼树及哈夫曼编码/译码的算法有了更加深刻的了解,更巩固了课堂中学习有关于哈夫曼编码的知识,此次哈夫曼树的应用系统的设计让自己对数据结构的了解更深入。
通过老师和同学的细心的帮助,终于做出了这个系统,感觉很棒!。