数据结构课程设计格式 (1)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计报告
设计题目:哈夫曼编/译码器
班级:网络工程172
学号:19317218
姓名:周傲
南京农业大学计算机系
数据结构课程设计报告内容
一. 课程设计题目
哈夫曼编/译码器
二.算法设计思想
通过计算各字符出现的频率,生成哈夫曼树,对文本文件的字符从哈夫曼树的叶子结点到根结点编码,生成编码文件。再次利用哈夫曼树进行译码从根结点到叶子结点得到哈夫曼编码对应的字符,从而生成文本文件。
三. 程序结构
说明本程序中主程序的流程以及各程序模块之间的层次(调用)关系;画出函数的调用关系图。
主程序先调用函数得到不同字符出现的频率,再调用frequency
得到不同字符出现的频率,再调用Huffmancoding 函数建立哈弗曼树和各字符的哈夫曼编码,再调用Create 函数生成压缩文件,最后调用TranslateHuf 函数得到压缩文件所译成的文本文件
。
四. 实验结果与分析
1.用户使用说明
说明如何使用你编写的程序,详细列出每一步的操作步骤。
首先将需要编码的文章放入英文短文.txt中,再运行程序即可看到各字符所对应的哈夫曼编码和名为英文短文压缩.huf的文件和通过英文短文压缩.huf转换成的英文短文2.txt文件。
2. 测试结果
列出你的测试数据和测试结果。要有多组测试数据及相应结果,并对多组结果进行分析比较;最好是能给出软件操作的部分关键界面截图。
测试2截图———各字符对应的哈夫曼编码和频率
3.调试分析
调试过程中遇到的问题是如何解决的;算法的时间复杂度(包括基本操作和其他算法的时间复杂度的分析);算法的改进设想。 为了确定错误的地方,进行多次调试排查各个地方直到确定错误地点,然后分析错误的种类,进行纠正,再次进行多次调试,确认无误。
select 函数的时间复杂度为o(n),建立哈夫曼树的时间按复杂度为o(n*n)建立哈夫曼编码表的时间复杂度为o(n)。code 函数的函数时间复杂度为o(n)。TranslateHuf 函数的时间复杂度
为o(n*n)。
【3】这个算法应该可以更加简洁,更加高效快捷,能够更让人容易理解。
五.总结(收获与体会)
任务完成过程的收获和体会、遇到问题过程的思考、程序调试能力的思考、对数据结构课程的思考等相关内容。
随着我对数据结构课程的深入学习,从数据结构课程中,我了解到数据结构课程主要是研究非数值计算的研究的程序设计问题中所出现的计算机处理对象以及它们之间关系和操作的学科,
从一开始我对数据结构的不以为意到认识到数据结构的重要性,明白了数据结构不仅是编程学习的基础之一,也是算法的精妙之处。通过对数据结构的深入学习和这次难能可贵的实践,我了解到了构建性的思维方法,掌握程序设计和数据组织的技术。程序设计的第一天我毫无头绪,犹如一头乱麻,之后我开始镇定下来,一步一步的分解,将步骤分为几部分,然后一步一步的设计程序,我完成了最后一步之后从整体分析找出错漏,完善程序,最后程序终于能够成功运行。
六.源程序
列出所有程序文件名及相应源代码
程序文件名:huffman.cpp
#include
#include
#include
typedef int status;
#define ok 1
#define error 0
typedef struct{
int weight;
int parent;
int lchild;
int rchild;
}Node,*Huffmantree;
typedef char ** Huffmancode;
typedef struct{
int num;
char cs;
}numch;
status frequency(int *w,char *filename,int &n,char c[1000]){ int i=0,j=0,k=-1,s[256]={0};
char ch;
FILE *file;
file=fopen(filename,"r");
if(file==NULL)
return error;
ch=fgetc(file);
while(ch!='#'){//统计不同字符出现的频率
k=-1;
if(ch>=0&&ch<=255){
for(j=0;j<=i;j++){
if(ch==c[j])
k=j;
}
if(k==-1){//当字符第一次出现时
w[i]++;
c[i]=ch;
i++;
}
else//当字符重复出现时
w[k]++;
}//if
ch=fgetc(file);
}//for
for(i=0;i<256;i++)
if(w[i]==0)
break;
n=i;//字符的种类数量
fclose(file);
return ok;
}
int minnum(Huffmantree ht,int n){
int i,j=1,k,min=32767;
for(i=1;i<=n;i++){//求权值最小的结点
if(ht[i].weight j=i; min=ht[i].weight; } } ht[j].parent=1;//给已经出现的最小结点作上标记 return j; } void select(Huffmantree ht,int n,int &s1,int &s2){ int i,j; s1=minnum(ht,n); s2=minnum(ht,n); if(s1>s2)//防止s2小于s1 {i=s1; s1=s2; s2=i; } } void Huffmancoding(Huffmantree &ht,Huffmancode &hc,int *w,int n){ int i,j,k,s1,s2,start,m; m=n*2-1; char *cd; Huffmantree p; ht=(Huffmantree)malloc(sizeof(Node)*(m+1)); for(p=ht+1,i=1;i<=n;i++,p++,w++){ p->weight=*w; p->lchild=0; p->rchild=0;