数据结构设计报告.docx
- 文档编号:30292256
- 上传时间:2023-08-13
- 格式:DOCX
- 页数:23
- 大小:209.30KB
数据结构设计报告.docx
《数据结构设计报告.docx》由会员分享,可在线阅读,更多相关《数据结构设计报告.docx(23页珍藏版)》请在冰豆网上搜索。
数据结构设计报告
课程设计报告
课程名称《数据结构》
课题名称对电文中的字符串编码和译码
专业
班级
学号
姓名
指导教师
2011年12月26日
湖南工程学院
课程设计任务书
课程名称数据结构
课题对电文中的字符串编码和译码
专业班级
学生姓名
学号
指导老师
审批
任务书下达日期2011年12月12日
任务完成日期2011年12月26日
一、设计内容与设计要求
1.设计内容:
[问题描述] Huffman编码是一种最优变长码,即带权路径最小。
这种编码有很强的应用背景,是数据压缩中的一个重要理论依据。
对输入的一串文字符号实现Huffman编码,再对Huffman编码生成的代码串进行译码,输出电文字符串。
[基本功能]
1).针对给定的字符串,建立Huffman树。
2).生成Huffman编码。
3).对编码文件译码。
2.设计要求:
1).设计正确,方案合理。
2).界面友好,使用方便。
3).程序精炼,结构清晰。
4).设计报告5000字以上,含程序设计说明、系统的功能框图、流程图、源程序清单等。
5).实际操作过程中遇到的问题及解决方法:
设计总结及心得体会。
6).上机演示。
二、进度安排
第17周星期一8时:
00分——11时:
30分
星期二14时:
00分——17时:
30分
星期三14时:
00分——17时:
30分
星期五14时:
00分——17时:
30分
第18周星期一8时:
00分——11时:
30分
星期二8时:
00分——11时:
30分
附:
课程设计报告装订顺序:
封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单)。
正文的格式:
一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。
正文的内容:
一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的源代码,要求对程序写出必要的注释)。
正文总字数要求在5000字以上(不含程序源代码)。
目录
1.需求分析1
1.1问题描述1
1.2程序的功能1
2.概要设计1
1.1系统的总体设计1
2.2各模块的功能2
2.3相关数据结构设计3
3.详细设计3
3.1采用C语言定义相关的数据类型3
3.2优先级结果比较函数4
3.4函数主模块5
4.系统调试5
5.运行结果7
5.1输入界面7
5.2求值界面8
5.3退出程序9
5.4程序调试中的问题9
6.心得体会9
7.附录10
7.1程序清单10
7.2.参考文献16
8.评分表17
1.需求分析
1.1问题描述
问题描述:
Huffman编码是一种最优变长码,即带权路径最小。
这种编码有很强的应用背景,是数据压缩中的一个重要理论依据。
对输入的一串文字符号实现Huffman编码,再对Huffman编码生成的代码串进行译码,输出电文字符串。
1.2程序的功能
1).针对给定的字符串,建立Huffman树。
2).生成Huffman编码。
3).对编码文件译码。
2.概要设计
1.1系统的总体设计
1).确定哈夫曼树和哈夫曼编码的储存表示
2).在HT[1..n]中选择parent为0的且weight最小的两个节点s1和s2
3).w存放n个字符的权值(均>0),构造哈夫曼树HT,输出静态链表(数组)储存哈夫曼树储存结构模拟,然后求出n个字符的哈夫曼编码HC
4).利用哈夫曼编码对密文进行译码,输出译后的字符串
5).在main()中实现:
输入一串字符(正文),计算不同字符(包括空格)的数目以及每种字符出现的频率(以该种字符出现的次数作为其出现频率,然后调用各子函数实现该程序功能
6).程序的输出,程序输出的形式:
7).统计字符出现次数并输出
8).根据字符出现次数求出哈夫曼编码并输出(根据算法差异得到的编码可能不同,但应具有两个特征,一是编码长度应与表中相同,二是编码应该是前缀编码)
9).以树的形式输出哈夫曼树
10).程序总体结构设计图:
是
否
2.2各模块的功能
1).创建哈弗曼树
intCreat(HuffmanTree&ht,HTNodech[N],intn)
2).对所有的叶子节点进行编码
voidCrtHuffmanCode(HuffmanTreeht,Charhc[N],intn)
3).输出哈弗曼树
voidPrint(HuffmanTreeht,intm)
4).输出哈弗曼码
voidPrintHuffmanCode(HuffmanTreeht,Charhc[],intn)//输出哈弗曼码
5).对字符串译码
voidTrsHuffmanTree(Huffmanht,WeightNodew,HuffmanCodehc,intn,intm)
6).寻找权值最小的两个结点
voidSearch(HuffmanTree&ht,intflag[2],intn)
6).输入字符串
intInput(HTNodech[N])
2.3相关数据结构设计
1)初始化:
a.输入正文:
输入一串字符(正文)
b.统计字符出现次数并输出:
计算不同字符(包括空格)的数目以及每种字符出现的频率(以该种字符出现的次数作为其出现频率)
c.求出哈夫曼编码并输出
d.以树的形式输出哈夫曼树
e.编码:
发送方利用得到的哈夫曼编码对正文进行编码,输出密文
f.译码:
接收方利用哈夫曼编码对密文进行译码,输出译后的字符串
3.详细设计
3.1采用C语言定义相关的数据类型
定义了两个结构体HTNode为哈弗曼树形结构,WNode存放叶子节点的信息。
#include
#include
#include
#defineN20
typedefchar*Char;
typedefstructNode
{
chardata;//存放节点的数据
intweight;//存放节点的权值
intparent;//双亲节点信息
intlchild;//左孩子的信息
intrchild;//右孩子的信息
intflag;//判断真假
}HTNode,*HuffmanTree;//0号未用
3.2优先级结果比较函数
1).初始化:
构造哈弗曼树
a.输入:
输入字符和它的权值
b.求出哈夫曼编码并输出
c.以树的形式输出哈夫曼树
2).编码:
发送方利用得到的哈夫曼编码对正文进行编码,输出密文
3).译码:
接收方利用哈夫曼编码对密文进行译码,输出译后的字符串
3.3函数各模块功能分析
1)创建哈弗曼树:
首先开辟空间,对哈弗曼树赋初值,用flag为0或1来标志它是否被访问过。
然后从叶子节点到双亲节点依次构造哈弗曼树。
2)对哈弗曼树进行编码:
构造哈弗曼树之后,对每个叶子节点进行编码,将其存放在数组中,方便之后进行解码。
3)输入模块:
最开始输入字符及它出现的频率,用N/Y判断是否输入完成,用n记录输入字符的个数,依次存放到数组ch[n].data,和ch[n].weight中。
4)search函数:
寻找叶子节点中权值最小的节点,为构造哈弗曼树建立基础。
5)解码:
将输入的0、1字符串解码为字符。
从根节点开始,依次扫描,若遇到0则指向左孩子节点若为1则指向右孩子节点,知道遇到左右孩子节点都为0则将其叶子节点信息(字符)输出。
完成解码过程。
6)主函数中调用了Creat(ht,ch,num)CrtHuffmanCode(ht,hc,num)PrintHuffmanCode(ht,hc,num)Decoding(ht,str,m)等函数,将问题实现了,
在创建哈弗曼树的时候调用了Search(ht,flag,i-1)函数,找出叶子节点中权值最小的两个节点,就可以成功的将哈弗曼树构造出来。
3.4函数主模块
voidmain()
{
HTNodech[N];
intnum=Input(ch);
HuffmanTreeht;
intm=Creat(ht,ch,num);
Print(ht,m);
Charhc[N];
CrtHuffmanCode(ht,hc,num);
PrintHuffmanCode(ht,hc,num);
intflag=1;
while(flag)
{
charstr[N];
printf("输入字符串:
");
scanf("%s",&str);
Decoding(ht,str,m);
printf("是否继续输入:
getchar();
charch;
scanf("%c",&ch);
if('n'==ch||'N'==ch)
flag=0;
}
}
4.系统调试
问题1:
统计字符出现次数并输出;
解决方案:
运用for循环和数组来实现该功能
问题2:
输出哈弗曼树;
解决方案:
运用静态链表(数组)进行哈夫曼树储存结构模拟
问题3:
构造哈弗曼树;
解决方案:
利用结构体数组来存储,这样可以方便将每个叶节点的信息保存,输出,调用。
初始化:
输入一串字符(正文),计算不同字符(包括空格)的数目以及每种字符出现的频率(以该种字符出现的次数作为其出现频率),根据权值建立哈夫曼树,输出每一种字符的哈夫曼编码。
编码:
利用求出的哈夫曼编码,对该正文(字符串)进行编码,并输出。
译码:
对于得到的一串编码,利用已求得的哈夫曼编码进行译码,将译出的正文输出。
输出哈夫曼树形态:
以树的形式输出哈夫曼树。
程序相对比较复杂,以四维数组为哈弗曼树的存储结构在数据通信中,经常需要将传送的文字转换成为二进制字符0和1组成的二进制字符串,称这个过程为编码。
显然,希望电文编码的代码长度最短。
哈夫曼树可用于构造使电文编码的代码长度最短的编码方案。
在程序运行中出现很多问题,比如说在解码的时候对输入的0、1串不能正确解码,后来多增加了一个结构体来存叶子节点的信息将这个问题成功解决。
5.运行结果
5.1输入界面
5.2求值界面
5.3退出程序
5.4程序调试中的问题
(1)统计字符出现次数并输出,本程序只能输入therearethreestudents(char型)来运行,该处可以运用其他函数或方法进行改进
(2)译码处存在问题,可以进一步改进
(3)进行更多的输入的编码和译码,使程序更具实用性
(4)多应用一些C++知识,使程序更加简洁一些
6.心得体会
通过这次课题实验的程序实践,我实在获益匪浅!
数据结构是这个学期开展的一门学科,学习好这门学科是非常重要的,在以后的程序设计方面这门学科能给我们很大的帮助。
同时,学习这门学科也是艰辛的,因为它比较难懂,这不仅需要我们要发挥我们的聪明才志,还需要我们在不断的实践中领悟。
这次的程序设计对我来说无疑是一个具大的考验,从接起课题后,我就一直为实现程序而努力,翻阅相关书籍、在网上查找资料。
因为开始时基础不是很好,过程中遇到了不少的阻碍,编写程序的进度也比较慢。
虽然如此,但是通过自己的努力与老师的指导及同学的帮助,我对这次实验的原理有了一定的理解,通过参照从网上找到的源程序,终于在其它源程序的基础下写出了本次实验的核心算法,并使其能够正常的运行。
这将近两个星期的设计工作,让我体会到了作为一个编程人员的艰难,一个算法到具体实现,再到应用层面的开发是需要有一段较长的路要走的,不是一朝一夕就可以实现的,而且在编好程序后,编程人员还要花很多的时间去完善它,其中包含的心酸,外人是不会明白的。
非常感谢在背后一直给我指导的老师和同学,他们的支持和鼓励让我在遇到挫折时能够站起来战胜它,也让我走到了今天这一步,完成了实验的设计。
今后,我会更加努力的学习专业知识,提高自我的能力。
7.附录
7.1程序清单
#include
#include
#include
#defineN20
typedefchar*Char;
typedefstructNode
{
chardata;
intweight;
intparent;
intlchild;
intrchild;
intflag;
}HTNode,*HuffmanTree;//0号未用
intInput(HTNodech[N])//输入字符串
{
intflag=1;
intn=0;
while(flag&&n!
=N)
{
printf("inputwordweight:
");
scanf("%c%d",&ch[n].data,&ch[n].weight);
getchar();
ch[n].parent=0;//用来标记
printf("continueinput:
(Y/N)");
charselect;
scanf("%c",&select);
getchar();
if('n'==select||'N'==select)//判断输入终止的条件
{
flag=0;
}
++n;//计数
}
returnn;
}
voidSearch(HuffmanTree&ht,intflag[2],intn)//寻找权值最小的两个结点
{
intmin;
for(inti=0;i<2;++i)
{
min=0;
intmark=0;
for(intj=1;j<=n;++j)
{
if(0==ht[j].flag)
{
if(!
mark)
{
min=j;
mark=1;
}
if(ht[min].weight>ht[j].weight)
{
min=j;
}
}
}
flag[i]=min;
ht[min].flag=1;//删除
}
}
//出的问题在于逻辑上,没有考虑清楚
//出现很多逻辑错误
intCreat(HuffmanTree&ht,HTNodech[N],intn)//构造哈弗曼树
{
intm=2*n-1;
ht=(HuffmanTree)malloc((m+1)*sizeof(HTNode));
inti;
for(i=1;i<=n;++i)
{
ht[i].data=ch[i-1].data;
ht[i].weight=ch[i-1].weight;
ht[i].lchild=0;
ht[i].rchild=0;
ht[i].parent=0;
ht[i].flag=0;
}
for(i=n+1;i<=m;++i)
{
ht[i].weight=0;
ht[i].lchild=0;
ht[i].rchild=0;
ht[i].parent=0;
ht[i].flag=0;//用来标记是否被访问
}
intflag[2];
for(i=n+1;i<=m;++i)
{
Search(ht,flag,i-1);
ht[i].data='#';//标示没有
ht[i].weight=ht[flag[0]].weight+ht[flag[1]].weight;
ht[flag[0]].parent=i;
ht[flag[1]].parent=i;
ht[i].lchild=flag[0];//合并
ht[i].rchild=flag[1];
//printf("%d%c%d%d%d%d\n",i,ht[i].data,ht[i].weight,ht[i].parent,flag[0],flag[1]);
}
returnm;
}
voidCrtHuffmanCode(HuffmanTreeht,Charhc[N],intn)//编码
{
char*cd;
cd=(char*)malloc(n*sizeof(char));
cd[n-1]='\0';
for(inti=1;i<=n;++i)//1n之间是叶子
{
intstart=n-1;
intc=i;
intp=ht[i].parent;
while(p)//一直找到根,这是从叶子到根
{
--start;
if(c==ht[p].lchild)
{
cd[start]='0';
}
else
{
cd[start]='1';
}
c=p;
p=ht[p].parent;
}
hc[i]=(char*)malloc((n-start)*sizeof(char));
strcpy(hc[i],&cd[start]);
}
free(cd);
}
voidPrint(HuffmanTreeht,intm)//输出哈弗曼树
{printf("输出蛤夫曼树:
\nhtdataweightparentlchildrchild\n");
for(inti=1;i<=m;++i)
{printf("%3d\t%c\t%d\t%d\t%d\t%d\n",i,ht[i].data,ht[i].weight,ht[i].parent,ht[i].lchild,ht[i].rchild);
}
}
voidPrintHuffmanCode(HuffmanTreeht,Charhc[],intn)//输出哈弗曼码
{printf("输出蛤夫曼编码:
\n");
for(inti=1;i<=n;++i)
{printf("%c\t",ht[i].data);
printf("%s\n",hc[i]);
}
}
voidDecoding(HuffmanTreeht,charstr[N],intn)//解码
{
for(inti=0;str[i]!
='\0';)
{
intp=n;//p应该是根
while(ht[p].lchild||ht[p].rchild)
{
if('0'==str[i])
{
p=ht[p].lchild;
}
else
{
p=ht[p].rchild;
}
++i;
}
printf("%c",ht[p].data);
}
printf("\n");
}
voidmain()
{HTNodech[N];
intnum=Input(ch);
HuffmanTreeht;
intm=Creat(ht,ch,num);
Print(ht,m);
Charhc[N];
CrtHuffmanCode(ht,hc,num);
PrintHuffmanCode(ht,hc,num);
intflag=1;
while(flag)
{
charstr[N];
printf("输入字符串:
");
scanf("%s",&str);
Decoding(ht,str,m);
printf("是否继续输入:
getchar();
charch;
scanf("%c",&ch);=
if('n'==ch||'N'==ch)
flag=0;
}
}
7.2.参考文献
[1]数据结构(C语言版)147页.赫夫曼树和赫夫曼树编码的存储表示,及求赫夫曼编码的算法
[2]C语言设计(第三版)371页—377页附录EC库函数.用于程序的开始
[3]网络.赫夫曼译码
[4]数据结构课程设计指导丛书.
[5]谭浩强.C程序设计(第三版).北京:
清华大学出版,2005
[6]谭浩强.C程序设计(第四版).北京:
清华大学出版,2010
[7]李春葆尹为民.数据结构.北京:
清华大学出版,2010.
[8]C编写组编.常用C语言用法速查手册.北京:
龙门书局,1995
8.评分表
计算机与通信学院课程设计评分表
课程名称:
数据结构
项目
评价
设计方案的合理性与创造性
设计与调试结果
设计说明书的质量
答辩陈述与回答问题情况
课程设计周表现情况
综合成绩
教师签名:
日期:
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据 结构设计 报告