ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:209.30KB ,
资源ID:30292256      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/30292256.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构设计报告.docx)为本站会员(b****5)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构设计报告.docx

1、数据结构设计报告课 程 设 计 报 告课程名称 数据结构 课题名称 对电文中的字符串编码和译码 专 业 班 级 学 号 姓 名 指导教师 2011 年 12 月 26 日湖南工程学院课 程 设 计 任 务 书课程名称 数据结构 课 题 对电文中的字符串编码和译码 专业班级 学生姓名 学 号 指导老师 审 批 任务书下达日期 2011 年 12 月 12 日任务完成日期 2011 年 12 月 26 日一、设计内容与设计要求1设计内容:问题描述 Huffman编码是一种最优变长码,即带权路径最小。这种编码有很强的应用背景,是数据压缩中的一个重要理论依据。对输入的一串文字符号实现Huffman编码

2、,再对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 周 星期一

3、8时:00分11时:30分 星期二 8时:00分11时:30分 附:课程设计报告装订顺序:封面、任务书、目录、正文、评分、附件(A4大小的图纸及程序清单)。 正文的格式:一级标题用3号黑体,二级标题用四号宋体加粗,正文用小四号宋体;行距为22。正文的内容:一、课题的主要功能;二、课题的功能模块的划分(要求画出模块图);三、主要功能的实现(至少要有一个主要模块的流程图);四、程序调试;五、总结;六、附件(所有程序的源代码,要求对程序写出必要的注释)。正文总字数要求在5000字以上(不含程序源代码)。 目 录1.需求分析 11.1问题描述 11.2程序的功能 12.概要设计 11. 1系统的总体设

4、计 12.2各模块的功能 22.3相关数据结构设计 33.详细设计 33.1 采用C语言定义相关的数据类型 33.2优先级结果比较函数 43.4函数主模块 54.系统调试 55.运行结果 75.1输入界面 75.2求值界面 85.3退出程序 95.4程序调试中的问题 96.心得体会 97.附录 107.1程序清单 107.2. 参考文献 168.评分表 171.需求分析1.1问题描述问题描述:Huffman编码是一种最优变长码,即带权路径最小。这种编码有很强的应用背景,是数据压缩中的一个重要理论依据。对输入的一串文字符号实现Huffman编码,再对Huffman编码生成的代码串进行译码,输出电

5、文字符串。1.2程序的功能1)针对给定的字符串,建立Huffman树。2)生成Huffman编码。3)对编码文件译码。2.概要设计1. 1系统的总体设计1). 确定哈夫曼树和哈夫曼编码的储存表示2). 在HT1.n中选择parent 为0 的且weight 最小的两个节点s1 和s23). w 存放n 个字符的权值(均0),构造哈夫曼树HT,输出静态链表(数组)储存哈夫曼树储存结构模拟,然后求出n 个字符的哈夫曼编码HC4). 利用哈夫曼编码对密文进行译码,输出译后的字符串5). 在main()中实现:输入一串字符(正文),计算不同字符(包括空格)的数目以及每种字符出现的频率(以该种字符出现的

6、次数作为其出现频率,然后调用各子函数实现该程序功能6).程序的输出,程序输出的形式:7).统计字符出现次数并输出8).根据字符出现次数求出哈夫曼编码并输出(根据算法差异得到的编码可能不同,但应具有两个特征,一是编码长度应与表中相同,二是编码应该是前缀编码)9).以树的形式输出哈夫曼树10).程序总体结构设计图: 是 否2.2各模块的功能1).创建哈弗曼树int Creat(HuffmanTree &ht, HTNode chN, int n)2)对所有的叶子节点进行编码void CrtHuffmanCode(HuffmanTree ht, Char hcN, int n)3). 输出哈弗曼树v

7、oid Print(HuffmanTree ht, int m)4).输出哈弗曼码void PrintHuffmanCode(HuffmanTree ht,Char hc, int n)/输出哈弗曼码5).对字符串译码void TrsHuffmanTree(Huffman ht,WeightNode w,HuffmanCode hc,int n,int m)6).寻找权值最小的两个结点void Search(HuffmanTree &ht, int flag2, int n) 6). 输入字符串int Input(HTNode chN) 2.3相关数据结构设计1)初始化:a.输入正文: 输入一

8、串字符(正文)b.统计字符出现次数并输出: 计算不同字符(包括空格)的数目以及每种字符出现的频率(以该种字符出现的次数作为其出现频率)c.求出哈夫曼编码并输出d.以树的形式输出哈夫曼树e. 编码:发送方利用得到的哈夫曼编码对正文进行编码,输出密文f.译码:接收方利用哈夫曼编码对密文进行译码,输出译后的字符串3.详细设计3.1 采用C语言定义相关的数据类型定义了两个结构体HTNode为哈弗曼树形结构,WNode存放叶子节点的信息。#include #include #include #define N 20typedef char * Char;typedef struct Node char

9、data; /存放节点的数据 int weight; /存放节点的权值 int parent; /双亲节点信息 int lchild; /左孩子的信息 int rchild; /右孩子的信息 int flag; /判断真假HTNode, *HuffmanTree;/0号未用3.2优先级结果比较函数1).初始化:构造哈弗曼树a.输入: 输入字符和它的权值b.求出哈夫曼编码并输出c.以树的形式输出哈夫曼树2).编码:发送方利用得到的哈夫曼编码对正文进行编码,输出密文3).译码:接收方利用哈夫曼编码对密文进行译码,输出译后的字符串3.3函数各模块功能分析1)创建哈弗曼树:首先开辟空间,对哈弗曼树赋初

10、值,用flag为0或1来标志它是否被访问过。然后从叶子节点到双亲节点依次构造哈弗曼树。2)对哈弗曼树进行编码:构造哈弗曼树之后,对每个叶子节点进行编码,将其存放在数组中,方便之后进行解码。3)输入模块:最开始输入字符及它出现的频率,用N/Y判断是否输入完成,用n记录输入字符的个数,依次存放到数组chn.data,和 chn.weight中。4)search函数:寻找叶子节点中权值最小的节点,为构造哈弗曼树建立基础。5)解码:将输入的0、1字符串解码为字符。从根节点开始,依次扫描,若遇到0则指向左孩子节点若为1则指向右孩子节点,知道遇到左右孩子节点都为0则将其叶子节点信息(字符)输出。完成解码过

11、程。6)主函数中调用了Creat(ht, ch, num) CrtHuffmanCode(ht, hc, num) PrintHuffmanCode(ht,hc, num) Decoding(ht, str, m)等函数,将问题实现了,在创建哈弗曼树的时候调用了Search(ht, flag, i-1)函数,找出叶子节点中权值最小的两个节点,就可以成功的将哈弗曼树构造出来。3.4函数主模块void main() HTNode chN; int num = Input(ch); HuffmanTree ht; int m = Creat(ht, ch, num); Print(ht, m); C

12、har hcN; CrtHuffmanCode(ht, hc, num); PrintHuffmanCode(ht,hc, num); int flag = 1; while(flag) char strN; printf(输入字符串: ); scanf(%s, &str); Decoding(ht, str, m); printf(是否继续输入: ); getchar(); char ch; scanf(%c, &ch); if(n = ch | N = ch) flag = 0; 4.系统调试问题1:统计字符出现次数并输出;解决方案:运用for循环和数组来实现该功能问题2:输出哈弗曼树;解

13、决方案:运用静态链表(数组)进行哈夫曼树储存结构模拟问题3:构造哈弗曼树;解决方案:利用结构体数组来存储,这样可以方便将每个叶节点的信息保存,输出,调用。初始化:输入一串字符(正文),计算不同字符(包括空格)的数目以及每种字符出现的频率(以该种字符出现的次数作为其出现频率),根据权值建立哈夫曼树,输出每一种字符的哈夫曼编码。编码:利用求出的哈夫曼编码,对该正文(字符串)进行编码,并输出。译码:对于得到的一串编码,利用已求得的哈夫曼编码进行译码,将译出的正文输出。输出哈夫曼树形态:以树的形式输出哈夫曼树。程序相对比较复杂,以四维数组为哈弗曼树的存储结构在数据通信中,经常需要将传送的文字转换成为二

14、进制字符0和1组成的二进制字符串,称这个过程为编码。显然,希望电文编码的代码长度最短。哈夫曼树可用于构造使电文编码的代码长度最短的编码方案。在程序运行中出现很多问题,比如说在解码的时候对输入的0、1串不能正确解码,后来多增加了一个结构体来存叶子节点的信息将这个问题成功解决。5.运行结果5.1输入界面5.2求值界面5.3退出程序5.4程序调试中的问题(1)统计字符出现次数并输出,本程序只能输入there are three students (char型)来运行,该处可以运用其他函数或方法进行改进(2)译码处存在问题,可以进一步改进(3)进行更多的输入的编码和译码,使程序更具实用性(4)多应用一

15、些C+知识,使程序更加简洁一些6.心得体会通过这次课题实验的程序实践,我实在获益匪浅!数据结构是这个学期开展的一门学科,学习好这门学科是非常重要的,在以后的程序设计方面这门学科能给我们很大的帮助。同时,学习这门学科也是艰辛的,因为它比较难懂,这不仅需要我们要发挥我们的聪明才志,还需要我们在不断的实践中领悟。这次的程序设计对我来说无疑是一个具大的考验,从接起课题后,我就一直为实现程序而努力,翻阅相关书籍、在网上查找资料。因为开始时基础不是很好,过程中遇到了不少的阻碍,编写程序的进度也比较慢。虽然如此,但是通过自己的努力与老师的指导及同学的帮助,我对这次实验的原理有了一定的理解,通过参照从网上找到

16、的源程序,终于在其它源程序的基础下写出了本次实验的核心算法,并使其能够正常的运行。这将近两个星期的设计工作,让我体会到了作为一个编程人员的艰难,一个算法到具体实现,再到应用层面的开发是需要有一段较长的路要走的,不是一朝一夕就可以实现的,而且在编好程序后,编程人员还要花很多的时间去完善它,其中包含的心酸,外人是不会明白的。非常感谢在背后一直给我指导的老师和同学,他们的支持和鼓励让我在遇到挫折时能够站起来战胜它,也让我走到了今天这一步,完成了实验的设计。今后,我会更加努力的学习专业知识,提高自我的能力。7.附录7.1程序清单#include #include #include #define N

17、20typedef char * Char;typedef struct Node char data; int weight; int parent; int lchild; int rchild; int flag;HTNode, *HuffmanTree;/0号未用int Input(HTNode chN)/输入字符串 int flag = 1; int n = 0; while(flag & n != N) printf(input word weight: ); scanf(%c%d, &chn.data, &chn.weight); getchar(); chn.parent =

18、0; /用来标记 printf(continue input :(Y/N) ); char select; scanf(%c, &select); getchar(); if(n = select | N = select) /判断输入终止的条件 flag = 0; +n; / 计数 return n;void Search(HuffmanTree &ht, int flag2, int n) /寻找权值最小的两个结点 int min; for(int i = 0; i 2; +i) min = 0; int mark = 0; for(int j = 1; j htj.weight) min

19、 = j; flagi = min; htmin.flag = 1; /删除 /出的问题在于逻辑上,没有考虑清楚/出现很多逻辑错误int Creat(HuffmanTree &ht, HTNode chN, int n)/构造哈弗曼树 int m = 2 * n - 1; ht = (HuffmanTree )malloc(m + 1) * sizeof(HTNode); int i; for(i = 1; i = n; +i) hti.data = chi-1.data; hti.weight = chi-1.weight; hti.lchild = 0; hti.rchild = 0; h

20、ti.parent = 0; hti.flag = 0; for(i = n+1; i = m; +i) hti.weight = 0; hti.lchild = 0; hti.rchild = 0; hti.parent = 0; hti.flag = 0; /用来标记是否被访问 int flag2; for(i = n+1; i = m; +i) Search(ht, flag, i-1); hti.data = #; /标示没有 hti.weight = htflag0.weight + htflag1.weight; htflag0.parent = i; htflag1.parent

21、 = i; hti.lchild = flag0; /合并 hti.rchild = flag1; /printf(%d %c %d %d %d %dn, i, hti.data, hti.weight, hti.parent, flag0, flag1); return m;void CrtHuffmanCode(HuffmanTree ht, Char hcN, int n) /编码 char *cd; cd = (char *)malloc(n * sizeof(char ); cdn-1 = 0; for(int i = 1; i = n; +i) /1 n 之间是叶子 int sta

22、rt = n-1; int c = i; int p = hti.parent; while(p) /一直找到根,这是从叶子到根 -start; if(c = htp.lchild) cdstart = 0; else cdstart = 1; c = p; p = htp.parent; hci = (char *)malloc(n - start) * sizeof(char ); strcpy(hci, &cdstart); free(cd);void Print(HuffmanTree ht, int m)/输出哈弗曼树 printf(输出蛤夫曼树:n ht data weight p

23、arent lchild rchildn); for(int i = 1; i = m; +i) printf(%3dt%ct%dt%dt%dt%dn, i, hti.data, hti.weight, hti.parent, hti.lchild, hti.rchild); void PrintHuffmanCode(HuffmanTree ht,Char hc, int n)/输出哈弗曼码 printf(输出蛤夫曼编码:n); for(int i = 1; i = n; +i) printf(%ct,hti.data); printf(%sn,hci); void Decoding(Huf

24、fmanTree ht, char strN, int n)/解码 for(int i = 0; stri != 0;) int p = n;/p 应该是根 while(htp.lchild | htp.rchild) if(0 = stri) p = htp.lchild; else p = htp.rchild; +i; printf(%c, htp.data); printf(n);void main() HTNode chN; int num = Input(ch); HuffmanTree ht; int m = Creat(ht, ch, num);Print(ht, m); Ch

25、ar hcN; CrtHuffmanCode(ht, hc, num); PrintHuffmanCode(ht,hc, num); int flag = 1; while(flag) char strN; printf(输入字符串: ); scanf(%s, &str); Decoding(ht, str, m); printf(是否继续输入: ); getchar(); char ch; scanf(%c, &ch);= if(n = ch | N = ch) flag = 0; 7.2. 参考文献1数据结构(C 语言版)147 页.赫夫曼树和赫夫曼树编码的存储表示,及求赫夫曼编码的算法2C 语言设计(第三版)371 页377 页附录E C 库函数.用于程序的开始3网络.赫夫曼译码4数据结构课程设计指导丛书.5谭浩强.C程序设计(第三版).北京:清华大学出版,20056谭浩强.C程序设计(第四版).北京:清华大学出版,20107李春葆 尹为民.数据结构.北京:清华大学出版,2010.8C编写组编.常用C语言用法速查手册.北京:龙门书局,19958.评分表计算机与通信学院课程设计评分表课程名称: 数 据 结 构 项 目评 价设计方案的合理性与创造性设计与调试结果设计说明书的质量答辩陈述与回答问题情况课程设计周表现情况综合成绩 教师签名: 日 期:

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1