数据结构课程设计哈夫曼编码-2

合集下载

数据结构课程设计-赫夫曼编码系统

数据结构课程设计-赫夫曼编码系统

数据结构课程设计-赫夫曼编码系统《数据结构》课程设计报告课程名称:赫夫曼编码系统姓名:学号:专业:班级:指导教师:二〇一二年十二月目录Contents1.课程小组------------------------------------------------------------------ 21.1.小组成员及分工 -------------------------------------------------------- 22.设计目的和要求 ------------------------------------------------------------ 23.需求分析------------------------------------------------------------------ 24.设计说明------------------------------------------------------------------ 34.1.文件编码(加密) ------------------------------------------------------ 34.2.文件解码(解密) ------------------------------------------------------ 45.详细设计------------------------------------------------------------------ 55.1.程序主体结构 ---------------------------------------------------------- 55.2.主要算法说明 ---------------------------------------------------------- 55.2.1.Huffman树--------------------------------------------------------- 55.2.2.Huffman编码------------------------------------------------------- 95.2.3.字符权重计算----------------------------------------------------- 125.2.4.字符解码--------------------------------------------------------- 186.实验结果----------------------------------------------------------------- 216.1.实验结果说明 --------------------------------------------------------- 216.2.程序运行截图 --------------------------------------------------------- 217.设计体会----------------------------------------------------------------- 238.参考文献----------------------------------------------------------------- 249.附:程序代码 ------------------------------------------------------------- 251.课程小组1.1.小组成员及分工…2.设计目的和要求通过课程设计,让学生进一步熟悉与巩固数据结构中常用算法,加深体会利用数据结构的算法解决实际问题的能力,培养学生进行复杂程序设计的技能,提高学生的思维能力、并促进其综合应用能力、分析能力和团队合作能力的提高。

数据结构课程设计 哈夫曼编码与译码器课程设计

数据结构课程设计 哈夫曼编码与译码器课程设计

数据结构课程设计题目名称:哈夫曼编码与译码器课程设计计算机科学与技术学院1.需求分析(1)熟练掌握哈夫曼编译原理(2)掌握程序设计步骤(3)根据哈夫曼编码原理,设计一个程序,在已知相关字符和字符对应权值(文件中存在或者用户输入)的情况下,根据用户要求对相应内容进行编码、译码等相应操作。

(4)输入的形式和输入值的范围;(5) 输出的形式;(6) 程序所能达到的功能;(7) 测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果2.概要设计1.写好流程图,设计实验方案。

2.初始化,从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件HuofumanTree中。

3.编码。

利用已建好的哈夫曼树,对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。

4.译码。

利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件Textfile中。

5.印代码文件(Print)将文件CodeFile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件CodePrint中。

6.印哈夫曼树(Treeprinting).将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

具体函数如下:1.Initialization()初始化2.Encoding()编码3.Decoding()译码4.Print_file()打印代码文件5.search(k,j,p)搜索二叉树6.Print_tree() 打印二叉树7.menu()主菜单8.main()主函数3.详细设计(1)哈夫曼结点定义类型以一个节点为单位,其中节点中包括他的父亲·左孩子·右孩子,权值(2)存储字符信息(3)用于编码时存取字符长度及起始位置(4)初始化将数据存入文件中void Initialization(){int i,j;FILE* HFM_f;//定义一个指针指向文件HFM_f = fopen("C:/Users/lenovo/Desktop/x.txt","w");//将文件打开,赋值给HFM_fif(HFM_f == NULL){printf("create file error!\n");}printf(" 请输入字符集大小: ");scanf("%d",&leaves);fprintf(HFM_f,"----输入的值-----\n");fprintf(HFM_f," 字符大小%4d\n",leaves);fprintf(HFM_f," 字符权值\n");for(i=0; i<leaves; i++){printf(" 请输入第%d个字符和其权:",i+1);scanf(" %c ",&HFM_num[i].hfstr);scanf("%d",&HFM_num[i].weight);fprintf(HFM_f,"%4c",HFM_num[i].hfstr);fprintf(HFM_f,"%4d\n",HFM_num[i].weight); //存储字符和权值}(5)建立哈夫曼树for(i=0; i<maxsize; i++)//哈夫曼树初始化{HFM_tree[i].parent = -1;HFM_tree[i].lchild = -1;HFM_tree[i].rchild = -1;HFM_tree[i].weight = 0;}for(i=0; i<leaves; i++){HFM_tree[i].weight = HFM_num[i].weight;}for(i=0; i<leaves-1; i++){int m1,m2;int m1_pos,m2_pos;m1=m2=65536;m1_pos=m2_pos=0;for(j=0; j<leaves+i; j++)//选出最小且没被访问的两个数{if(HFM_tree[j].weight<m1&&HFM_tree[j].parent == -1) {m2 = m1;m1 = HFM_tree[j].weight;m2_pos = m1_pos;m1_pos = j;}else{if(HFM_tree[j].weight<m2&&HFM_tree[j].parent == -1){m2 = HFM_tree[j].weight;m2_pos = j;}}}HFM_tree[leaves+i].parent = -1;HFM_tree[leaves+i].lchild = m1_pos;//HFM_tree[leaves+i]为两者的最小和的结点,即他们的父亲HFM_tree[leaves+i].rchild = m2_pos;HFM_tree[m1_pos].parent = leaves+i;HFM_tree[m2_pos].parent = leaves+i;HFM_tree[leaves+i].weight = m2+m1;//将和赋为他们的父亲结点的权值}(6)输出哈夫曼树printf("----------------哈夫曼编码--------------\n");printf(" parent lchild rchild weight\n");fprintf(HFM_f,"-------------哈夫曼编码------------\n");fprintf(HFM_f," parent lchild rchild weight\n");for(i=0; i<leaves*2-1; i++){printf("%8d%8d%8d%8d\n",HFM_tree[i].parent,HFM_tree[i].lchild,HFM_tre e[i].rchild,HFM_tree[i].weight);fprintf(HFM_f,"%8d%8d%8d%8d\n",HFM_tree[i].parent,HFM_tree[i].lchild, HFM_tree[i].rchild,HFM_tree[i].weight);}printf("\n");fclose(HFM_f);//关上文件}(7)编码void Encoding(){int i,j,p,c,k;FILE* HFM_f = fopen("CodeFile.txt","w");//打开文件if(HFM_f == NULL){printf("open file error!\n");}for(i=0; i<leaves; i++){c = i;//当前结点编号p = HFM_tree[i].parent;//父亲结点编号HFM_hf.start = len-1;//单个结点路径长度-1,即循环次数,从0开始算while(p!=-1)//根节点的p=-1,即根结点的父亲值为-1,即为初始化的值,证明根节点没有父亲结点{if(HFM_tree[p].lchild == c)//若左孩子为C,赋值0{HFM_hf.bit[HFM_hf.start] = 0;}else{HFM_hf.bit[HFM_hf.start] = 1;//若右孩子为c,赋值1 }--HFM_hf.start;c = p;//沿着树往上走,将刚才的父亲变为孩子p = HFM_tree[c].parent;//寻找当前结点的父亲,即原节点的爷爷}for(j=HFM_hf.start+1,k=0; j<len; j++,k++){HFM_code[i].bit[k] = HFM_hf.bit[j];}HFM_code[i].length = len-HFM_hf.start-1;HFM_code[i].start = HFM_hf.start+1;}for(i=0; i<leaves; i++){HFM_code[i].hfch = HFM_num[i].hfstr;printf(" character:%c start:%d length:%dCode:",HFM_code[i].hfch,HFM_code[i].start,HFM_code[i].length );for(j=0; j<HFM_code[i].length; j++){printf("%d",HFM_code[i].bit[j]);fprintf(HFM_f,"%d",HFM_code[i].bit[j]);}printf("\n");}printf("\n");fclose(HFM_f);}4.调试结果输入26个字符及其权值26个字母的编码如下:译码如下:打印文件中的内容:打印出的哈夫曼树如下:5.时间复杂度本代码的哈夫曼算法的时间复杂度为O(n^3)。

数据结构课程设计哈夫曼编码实验

数据结构课程设计哈夫曼编码实验

数据结构设计性实验Huffman编码与译码学号姓名班级设计性实验—Huffman 编码与译码一.实验目的:在掌握相关基础知识的基础上,学会自己设计实验算法,熟练掌握Huffman 树的建立方法,Huffman 编码的方法,进而设计出Huffman 译码算法,并编程实现。

二.实验要求:在6学时以内,制作出能够实现基于26个英文字母的任意字符串的编译码。

写出技术工作报告并附源程序。

三.实验内容及任务:1.设字符集为26个英文字母,其出现频度如下表所示。

2.建Huffman 树; 3.利用所建Huffman 树对任一字符串文件进行编码——即设计一个Huffman 编码器;4.对任一字符串文件的编码进行译码——即设计一个Huffman 译码器。

实现步骤:1.数据存储结构设计; 2.操作模块设计; 3.建树算法设计; 4.编码器设计;5. 译码器设计;51 48 1 15 63 57 20 32 5 1频度z y x w v u t 字符11611882380频度p 21 f q15 g r 47 h s o n m l k j 字符 57 103 32 22 13 64 186 频度 i e d c b a 空格 字符四.分析以及算法描述1.分析问题1)首先学习二叉树的知识,了解二叉树的路径、权数以及带权路径长度计算。

2)认识霍夫曼树,了解霍夫曼树的定义,构造霍夫曼树构造算法①又给定的n个权值{w1,w2,w3,……,w n}构造根节点的二叉树,从而得到一个二叉树森林F={T1,T2,T3,……T n}。

②在二叉树森里选取根节点全职最小和此最小的两棵二叉树作为左右节点构造新的二叉树,此时新的二叉树的根节点权值为左右子树权值之和。

③在二叉树森林中删除作为新二叉树的根节点左右子树的两棵二叉树,将新的二叉树加入到二叉树森林F中。

④重复②和③,当二叉树森林F只剩下一棵二叉树时,这棵二叉树是所构造的霍夫曼树。

3)练习通过普通树来构造霍夫曼树。

课程设计哈夫曼编码

课程设计哈夫曼编码

《数据结构》课程设计报告设计题目哈夫曼(Huffman)编译码器学院名称信息工程学院专业班级 13计本1 姓名 hhh学号1312219999目录一、实验题目-哈夫曼(Huffman)编/译码器 ------------------------------二、问题描述-----------------------------------------------三、设计目标-----------------------------------------------四、需求分析-----------------------------------------------五、概要设计-----------------------------------------------1---系统结构图--------------------------------------2--各个模块功能的详细描述------------------------------- 六、详细设计-----------------------------------------------1——详细代码--------------------------------------a)头文件代码--------------------------------------b)主函数代码--------------------------------------2——系统流程图--------------------------------------七、测试分析-----------------------------------------------八、使用说明-----------------------------------------------1、白盒-----------------------------------------------2、黑盒-----------------------------------------------九、课程设计总结----------------------------------------------一、实验题目哈夫曼(Huffman)编/译码器二、问题描述利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

数据结构课程设计哈夫曼编码-2

数据结构课程设计哈夫曼编码-2

《数据结构与算法》课程设计目录一、前言1.摘要2.《数据结构与算法》课程设计任务书二、实验目的三、题目--赫夫曼编码/译码器1.问题描述2.基本要求3.测试要求4.实现提示四、需求分析--具体要求五、概要设计六、程序说明七、详细设计八、实验心得与体会前言1.摘要随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及设计最短路线等复杂的非数值处理和操作。

算法与数据结构的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。

算法与数据结构旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。

数据结构是在整个计算机科学与技术领域上广泛被使用的术语。

它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。

数据结构有逻辑上的数据结构和物理上的数据结构之分。

逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。

数据结构是数据存在的形式。

《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。

数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。

学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。

通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。

2.《数据结构与算法》课程设计任务书《数据结构与算法》是计算机专业重要的核心课程之一,在计算机专业的学习过程中占有非常重要的地位。

《数据结构与算法课程设计》就是要运用本课程以及到目前为止的有关课程中的知识和技术来解决实际问题。

数据结构课程设计哈夫曼编码 2

数据结构课程设计哈夫曼编码 2

《数据结构与算法》课程设计目录一、前言1.摘要2.《数据结构与算法》课程设计任务书二、实验目的三、题目--赫夫曼编码/译码器1.问题描述2.基本要求3.测试要求4.实现提示四、需求分析--具体要求五、概要设计六、程序说明七、详细设计八、实验心得与体会前言1.摘要随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及设计最短路线等复杂的非数值处理和操作。

算法与数据结构的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。

算法与数据结构旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。

数据结构是在整个计算机科学与技术领域上广泛被使用的术语。

它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。

数据结构有逻辑上的数据结构和物理上的数据结构之分。

逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。

数据结构是数据存在的形式。

《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。

数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。

学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。

通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。

2.《数据结构与算法》课程设计任务书《数据结构与算法》是计算机专业重要的核心课程之一,在计算机专业的学习过程中占有非常重要的地位。

《数据结构与算法课程设计》就是要运用本课程以及到目前为止的有关课程中的知识和技术来解决实际问题。

《数据结构课程设计》赫夫曼编码实验报告

《数据结构课程设计》赫夫曼编码实验报告

目录一、概述 (1)二、系统分析 (1)三、概要设计 (2)四、详细设计 (4)4.1 赫夫曼树的建立 (4)4.1.1 选择选择parent 为0 且权值最小的两个根结点的算法 (5)4.1.2 统计字符串中字符的种类以及各类字符的个数 (7)4.1.3构造赫夫曼树 (8)4.2赫夫曼编码 (10)4.2.1赫夫曼编码算法 (10)4.2.2建立正文的编码文件 (11)4.3代码文件的译码 (12)五、运行与测试 (14)六、总结与心得 (14)参考文献 (15)附录 (15)一、概述本设计是对输入的一串电文字符实现赫夫曼编码,再对赫夫曼编码生产的代码串进行译码,输出电文字符串。

在当今信息爆炸时代,如何采用有效的数据压缩技术节省数据文件的存储空间和计算机网络的传送时间越来越引起人们的重视,赫夫曼编码正是一种应用广泛且非常有效的数据压缩技术。

二、系统分析赫夫曼编码的应用很广泛,利用赫夫曼树求得的用于通信的二进制编码成为赫夫曼编码。

树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0”码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1”的序列作为和每个叶子对应的字符的编码,这就是赫夫曼编码。

通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。

电报通信是传递文字的二进制码形式的字符串,但在信息传递时,总希望总长度能尽可能短,即采用最短码。

假设每种字符在电文中出现的次数为W i ,编码长度为L i ,电文中有n 种字符,则电文编码总长为∑W i L i 。

若将此对应到二叉树上,W i 为叶节点的权,L i 为根节点到叶节点的路径长度。

那么,∑W i L i 恰好为二叉树上带权路径长度。

因此,设计电文总长最短的二进制前缀编码,就是以n 种子符出现的频率作权,构造一刻赫夫曼树,此构造过程成为赫夫曼编码。

根据设计要求和分析,要实现设计,必须实现以下方面的功能:(1)赫夫曼树的建立;(2)赫夫曼编码的生成;(3)编码文件的译码;三、概要设计程序由哪些模块组成以及模块之间的层次结构、各模块的调用关系;每个模块的功能。

(完整word版)数据结构课程设计(哈夫曼编码)

(完整word版)数据结构课程设计(哈夫曼编码)

目录目录 (1)1 课程设计的目的和意义 (3)2 需求分析 (5)3 系统设计 (6)(1)设计思路及方案 (6)(2)模块的设计及介绍 (6)(3)主要模块程序流程图 (9)4 系统实现 (14)(1)主调函数 (14)(2)建立HuffmanTree (14)(3)生成Huffman编码并写入文件 (18)(4)电文译码 (19)5 系统调试 (22)小结 (25)参考文献 (26)附录源程序 (27)1 课程设计的目的和意义在当今信息爆炸时代,如何采用有效的数据压缩技术来节省数据文件的存储空间和计算机网络的传送时间已越来越引起人们的重视。

哈夫曼编码正是一种应用广泛且非常有效的数据压缩技术。

哈夫曼编码的应用很广泛,利用哈夫曼树求得的用于通信的二进制编码称为哈夫曼编码。

树中从根到每个叶子都有一条路径,对路径上的各分支约定:指向左子树的分支表示“0"码,指向右子树的分支表示“1”码,取每条路径上的“0”或“1"的序列作为和各个对应的字符的编码,这就是哈夫曼编码。

通常我们把数据压缩的过程称为编码,解压缩的过程称为解码。

电报通信是传递文字的二进制码形式的字符串。

但在信息传递时,总希望总长度尽可能最短,即采用最短码。

作为软件工程专业的学生,我们应该很好的掌握这门技术。

在课堂上,我们能过学到许多的理论知识,但我们很少有过自己动手实践的机会!课程设计就是为解决这个问题提供了一个平台。

在课程设计过程中,我们每个人选择一个课题,认真研究,根据课堂讲授内容,借助书本,自己动手实践。

这样不但有助于我们消化课堂所讲解的内容,还可以增强我们的独立思考能力和动手能力;通过编写实验代码和调试运行,我们可以逐步积累调试C程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。

在课程设计过程中,我们不但有自己的独立思考,还借助各种参考文献来帮助我们完成系统。

更为重要的是,我们同学之间加强了交流,在对问题的认识方面可以交换不同的意见.同时,师生之间的互动也随之改善,我们可以通过具体的实例来从老师那学到更多的实用的知识。

数据结构程序设计作业——《哈夫曼编码》

数据结构程序设计作业——《哈夫曼编码》

数据结构实验报告题目哈夫曼编码学生姓名王某某专业班级测控120X班学号U2012XXXXX1 问题描述输入一字符串,以字符串中各字符出现的频数为权值构造哈夫曼编码。

然后输入一0—1序列,根据生成的哈夫曼编码解码序列。

2 算法描述(1)哈夫曼树的表示设计哈夫曼树的结构体(htnode),其中包含权重、左右孩子、父母和要编码的字符。

用这个结构体(htnode)定义个哈夫曼数组(hfmt[])。

迷宫定义如下:typedef struct{int weight;int lchild;int rchild;int parent;char key;}htnode;typedef htnode hfmt[MAXLEN];(2)对原始字符进行编码初始化哈夫曼树(inithfmt)。

从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树。

并显示出每个字符的编码。

1.void inithfmt(hfmt t)//对结构体进行初始化2.void inputweight(hfmt t)//输入函数3.void selectmin(hfmt t,int i,int *p1,int *p2)//选中两个权值最小的函数4.void creathfmt(hfmt t)//创建哈夫曼树的函数5.void phfmnode(hfmt t)//对字符进行初始编码(3)对用户输入的字符进行编码void encoding(hfmt t)//对用户输入的电文进行编码{char r[1000];//用来存储输入的字符串int i,j;printf("\n\n请输入需要编码的字符:");gets(r);printf("编码结果为:");for(j=0;r[j]!='\0';j++)for(i=0;i<n;i++)if(r[j]==t[i].key)hfmtpath(t,i,j);printf("\n");}(4)对用户输入的字符进行编码void decoding(hfmt t)//对用户输入的密文进行译码{char r[100];int i,j,len;j=2*n-2;//j初始从树的根节点开始printf("\n\n请输入需要译码的字符串:"); gets(r);len=strlen(r);printf("译码的结果是:");for(i=0;i<len;i++){if(r[i]=='0'){j=t[j].lchild;if(t[j].lchild==-1){printf("%c",t[j].key);j=2*n-2;}}else if(r[i]=='1'){j=t[j].rchild;if(t[j].rchild==-1){printf("%c",t[j].key); j=2*n-2;}}}printf("\n\n");}3 程序设计流程图4 运行测试1.用户输入字符串,以回车键作为结束2.对字符统计打印统计结果、编码表和编码结果3.对一串数据解码4.统计编码前后的数据大小,计算压缩率5 实验收获代码编写完会有很多与预期不同的结果,耐心调试,修改代码,开始写代码的时候就认真的写,在调试时找出逻辑问题比较困难,做到一步到位。

数据结构课程设计报告(HuffMan编码器)

数据结构课程设计报告(HuffMan编码器)

《数据结构》课程设计报告题目:HuffMan编码器目录一.问题描述二.基本要求(需求分析)三.•概要设计(设计思想、实现方法、模块设计)四.•详细设计(数据结构设计、算法设计、算法分析)五.测试数据及测试结果六.课程设计小结(心得体会、存在问题、改进措施)一.问题描述利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

但是,这要求在发送端通过一个编码系统对待传数据预先编码,在接收端将传来的数据进行译码(复原)。

对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站写一个哈夫曼码的编/译码系统。

二.基本要求(需求分析)一个完整的系统应具有以下功能:(1)I:初始化(Initialization)。

从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树,并将它存于文件hfmTree中。

(2)E:编码(Encoding)。

利用已建好的哈夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。

(3)D:译码(Decoding)。

利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中。

(4)P:印代码文件(Print)。

将文件CodeFile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件CodePrin中。

(5)T:印哈夫曼树(Tree printing)。

将已在内存中的哈夫曼树以直观的方式(树或凹入表形式)显示在终端上,同时将此字符形式的哈夫曼树写入文件TreePrint中。

[测试数据]用下表给出的字符集和频度的实际统计数据建立哈夫曼树,并实现以下报文的编码和译码:“THIS PROGRAM IS MY FA VORITE”。

字符空格 A B C D E F G H I J K L M频度186 64 13 22 32 103 21 15 47 57 1 5 32 20字符N O P Q R S T U V W X Y Z频度57 63 15 1 48 51 80 23 8 18 1 16 1[实现提示](1)编码结果以文本方式存储在文件CodeFile中。

数据结构 哈夫曼编码实验报告

数据结构 哈夫曼编码实验报告

数据结构哈夫曼编码实验报告数据结构实验报告----------1-实验目的----------本实验的目的是通过实现哈夫曼编码算法,加深对数据结构中树和堆的理解,以及掌握相关的编程技巧。

2-实验内容----------2-1 算法简介----------哈夫曼编码是一种无损压缩算法,通过根据字符出现的频率构建一颗二叉树,并将出现频率较高的字符编码为较短的二进制串,进而实现压缩的目的。

在本实验中,我们需要实现以下功能:●构建哈夫曼树●字符编码表●对给定的字符串进行编码●对给定的二进制串进行解码●实现压缩和解压缩功能2-2 数据结构----------在实现哈夫曼编码算法时,我们需要使用以下数据结构:●链表:用于存储字符出现的频率及对应的字符●堆:用于构建哈夫曼树●树:用于存储哈夫曼编码树●散列表或映射:用于存储字符的编码2-3 算法步骤----------1-统计字符的出现频率,并构建频率链表2-根据频率链表构建哈夫曼树3-字符的编码表4-对给定的字符串进行编码5-对给定的二进制串进行解码6-实现压缩和解压缩功能3-实验实现----------3-1 数据结构的设计----------在本实验中,我们将使用以下数据结构:●链表节点结构体:用于存储字符和频率●链表结构体:用于存储链表节点的头指针●堆节点结构体:用于存储字符和频率,并维护堆的结构●堆结构体:用于存储堆的根节点●树节点结构体:用于存储字符和编码,并维护哈夫曼树的结构●树结构体:用于存储哈夫曼树的根节点●散列表结构体:用于存储字符和对应的编码3-2 算法实现----------1-统计字符的出现频率并构建频率链表:遍历给定的字符串,统计字符的频率,并将字符频率按从小到大的顺序插入到频率链表中。

2-根据频率链表构建哈夫曼树:将频率链表的节点插入到堆中,并按照堆的定义调整堆的结构,直到堆中只有一个节点。

3-字符的编码表:遍历哈夫曼树,递归构造字符的编码表。

数据结构__课程设计之哈夫曼编码

数据结构__课程设计之哈夫曼编码

一、设计思想(一) 哈夫曼树的设计思想对于一组具有确定权值的叶子结点可以构造出多个具有不同带权路径长度的二叉树,其中具有最小带权路径长度的二叉树称作哈夫曼树或最优二叉树。

首先给定n个权值制造n个只含根结点的二叉树,得到一个二叉树林;再在这二叉树林里面找根结点的权值最小和次小的两棵树作成新的二叉树,其中新的二叉树的根结点的权值为左右子根结点权值之和;最后在二叉树林中把组合过的二叉树删除,再重复第二步,直到最后就剩一颗二叉树的时候得到的这棵二叉树就是哈夫曼树。

(二)哈夫曼编码与解码的设计思想在数据通讯中,经常要将传送的文字转换为二进制字符0和1组成的二进制串,称这个过程为编码。

与子相对的是解码或是译码,就是用与编码相同的方式将二进制串转换称编码前的文字的过程称作解码。

在这里是通过哈夫曼树实现编码与解码的,所以称作是哈夫曼编码与解码。

首先输入一个字符串,还有相应的在哈夫曼树里的权值,这样用哈夫曼树把字符串用二进制串代替它,这个过程要注意树和编码问题,其中树的问题在上面已经解决,主要看编码的问题,就是根据我们输入的字符串和权值建立相应的树模型,这一步完成那编码就已经完成了,最后打印就行了;然后就是解码,完成编码相应的解码就相对简单了,就是先找到在编码的时候建的那个模型树,将编码中的二进制串再根据权值转换为相应的字符串,这样一步步解码就行了。

以上就是通过用哈夫曼树进行哈夫曼编码与解码如何实现的主要设计思想。

二、算法流程图(一)哈夫曼树的流程图不是图1哈夫曼树的流程图(二)编码的流程图(三)解码的流程图哈夫曼编码与解码的实现- 3 -否三、源代码下面给出的是用中缀转后缀算法实现的程序的源代码:#include "stdio.h" #include "string.h" #define MAX 100/*定义常量*/struct HaffNode {int weight;/*权值*/ int parent;/*双亲结点下标*/char ch; int lchild; int rchild;}*myHaffTree; /*构造哈夫曼树*/struct Coding {char bit[MAX];/*定义数组*/char ch; int weight;/*字符的权值*/}*myHaffCode;/*定义结构体*/void Haffman(int n)/*定义哈夫曼函数*/{int i,j,x1,x2,s1,s2;for (i=n+1;i<=2*n-1;i++) /*树的初始化*/{s1=s2=10000;x1=x2=0;for (j=1;j<=i-1;j++) /*构造哈夫曼树的非叶子结点*/{if(myHaffTree[j].parent==0&&myHaffTree[j].weight<s1) /*分配左右结点*/ {s2=s1;x2=x1;s1=myHaffTree[j].weight;x1=j;}else if(myHaffTree[j].parent==0&&myHaffTree[j].weight<s2){s2=myHaffTree[j].weight;x2=j;}}myHaffTree[x1].parent=i;myHaffTree[x2].parent=i;myHaffTree[i].weight=s1+s2; /*左右子组合为新树*/myHaffTree[i].lchild=x1;myHaffTree[i].rchild=x2;}}void HaffmanCode(int n) /*构造n个结点哈夫曼编码*/{int start,c,f,i,j,k;char *cd;cd=(char *)malloc(n*sizeof(char));myHaffCode=(struct Coding *)malloc((n+1)*sizeof(struct Coding));cd[n-1]='\0';for(i=1;i<=n;++i) /*n个叶子结点的哈夫曼编码*/{start=n-1;for(c=i,f=myHaffTree[i].parent;f!=0;c=f,f=myHaffTree[f].parent)if(myHaffTree[f].lchild==c) cd[--start]='0';else cd[--start]='1';for(j=start,k=0;j<n;j++){myHaffCode[i].bit[k]=cd[j];k++;}myHaffCode[i].ch=myHaffTree[i].ch; /*取编码对应的权值*/ myHaffCode[i].weight=myHaffTree[i].weight;}哈夫曼编码与解码的实现free(cd);}Init() /*定义有返回值的函数*/ {int i,n,m;printf("please input the number of words:");scanf("%d",&n);m=2*n-1;myHaffTree=(struct HaffNode *)malloc(sizeof(struct HaffNode)*(m+1));for(i=1;i<=n;i++){printf("please input the word and the equal:");scanf("%s%d",&myHaffTree[i].ch,&myHaffTree[i].weight);myHaffTree[i].parent=0;myHaffTree[i].lchild=0;myHaffTree[i].rchild=0;}for(i=n+1;i<=m;i++){myHaffTree[i].ch ='#';myHaffTree[i].lchild=0;myHaffTree[i].parent=0;myHaffTree[i].rchild=0;myHaffTree[i].weight=0;}Haffman(n);HaffmanCode(n);for(i=1;i<=n;i++){printf("%c %d",myHaffCode[i].ch,myHaffCode[i].weight);printf("\n");}printf("init success!\n");return n;}void Caozuo_C(int m) /* 编码函数*/{int n,i,j;char string[50],*p;printf("please input the words:");scanf("%s",string);n=strlen(string); /*计算字符串长度*/for(i=1,p=string;i<=n;i++,p++) /*进行编码*/- 5 -{for(j=1;j<=m;j++)if(myHaffCode[j].ch==*p)printf("%s\n",myHaffCode[j].bit);}}void Caozuo_D(int n) /*解码函数*/{int i,c;char code[1000],*p;printf("please input the coding:"); /*输入二进制编码*/ scanf("%s",code);for(p=code,c=2*n-1;*p!='\0';p++) /*进行解码*/{if(*p=='0') /*结束条件*/ {c=myHaffTree[c].lchild; /*赋值*/if(myHaffTree[c].lchild==0) /* 扫描*/{printf("%c",myHaffTree[c].ch);c=2*n-1;continue; /*结束*/}}else if(*p=='1'){c=myHaffTree[c].rchild;if(myHaffTree[c].lchild==0){printf("%c",myHaffTree[c].ch);c=2*n-1; /*赋值*/continue;}}}printf("\n");}void main(){int n;char char1; /*定义字符*/n=Init(); /*函数的调用*/哈夫曼编码与解码的实现printf("A.coding B.codeprinting C.exit\nplease input the process:\n");while(1){scanf("%c",&char1);if(char1=='c') /*判断字符*/break;switch(char1){case'A':Caozuo_C(n);break; /*执行编码操作*/case'B':Caozuo_D(n);break; /*执行解码操作*/case'C':;break;}}}四、运行结果(一)中缀转后缀算法的运行结果:- 7 -五、遇到的问题及解决这部分我主要遇到了如下三个问题,其内容与解决方法如下所列:问题1:刚开始不知道如何建一个好树,因为我开始试着建了几个二叉树,不知道什么原因运行的时候那编码总是不对,跟在草稿纸上自己画的那个二叉树总是不相符,就找原因。

数据结构_课程设计报告(哈夫曼编码)

数据结构_课程设计报告(哈夫曼编码)

(原创)数据结构课程设计报告学院:计算机科学与工程专业:计算机科学与技术班级:09级班学号:姓名:指导老师:时间: 2010年12月一、课程设计题目:1、哈夫曼编码的实现2、城市辖区地铁线路设计3、综合排序算法的比较二、小组成员:三、题目要求:1.哈夫曼编码的实现(1)打开若干篇英文文章,统计该文章中每个字符出现的次数,进一步统一各字符出现的概率。

(2)针对上述统计结果,对各字符实现哈夫曼编码(3)对任意文章,用哈夫曼编码对其进行编码(4)对任意文章,对收到的电文进行解码2.某城市要在其各个辖区之间修建地铁来加快经济发展,但由于建设地铁的费用昂贵,因此需要合理安排地铁的建设路线。

(1)从包含各辖区的地图文件中读取辖区的名称和各辖区的直接距离(2)根据上述读入的信息,给出一种铺设地铁线路的解决方案。

使乘客可以沿地铁到达各个辖区,并使总的建设费用最小。

(3)输出应该建设的地铁路线及所需要建设的总里程信息。

3.综合排序算法的比较各种内部排序算法的时间复杂度分析结果只给出了算法执行时间的阶,或大概的执行时间。

试通过随机的数据比较各算法的关键字比较次数和关键字移动的次数。

(1)对以下各种常用的内部排序算法进行比较:直接插入排序,折半插入排序,二路归并排序,希尔排序,冒泡排序,快速排序,简单选择排序,堆排序,归并排序,基数排序。

(2)待排序的表长不少于100,要求采用随机数。

(3)至少要用5组不同的输入数据做比较:比较的次数为有关键字参加的比较次数和关键字移动的次数(4)改变数据量的大小,观察统计数据的变化情况。

(5)对试验统计数据进行分析。

对各类排序算法进行综合评价。

四、项目安排:1、小组内分工合作分工:xx负责哈夫曼编码的实现,zz负责城市辖区地铁线路设计,yy负责综合排序算法的比较。

合作:组内,组外进行交流,组长帮助解决组员的在项目过程中的困难,并控制进度。

五、完成自己的任务:任务:哈夫曼编码的实现1、思想实现流程图2、代码实现头文件define.h#ifndef _DEFINE_H_#define _DEFINE_H_#include <windows.h>#include <stdio.h>#include <stdlib.h>#include <string.h>#define n 128typedef struct{int weight;int parent,lchild,rchild;}HuffmanTree; //哈夫曼树数据类型typedef struct{int ch;char codes[30];}coding; //哈夫曼编码数据存储typedef struct{int point;char codes[30]; //栈存}stack;extern void stat_file(HuffmanTree charer[256]); //统计字符频率extern void make_tree(HuffmanTree charer[256]); //构造哈夫曼树extern void make_code(HuffmanTree charer[256],coding inside[128]); //生成字符编码extern void article_code(coding inside[128]); //文章转码extern void decoding(HuffmanTree charer[256]); //文章解码#endif主函数:main.cpp#include "define.h"void main(){char choose;HuffmanTree charer[256];coding inside[128];printf("********************************************\n");printf(" 请选择\n");printf("*********** 1 刷新哈夫曼编码**********\n");printf("*********** 2 用统计频率编码**********\n");printf("*********** 3 任意文章编码**********\n");printf("*********** 4 任意文章解码**********\n");printf("*********** 0 退出本系统**********\n");printf("********************************************\n");do{fflush(stdin);scanf("%c",&choose); //暂时未加入未进行编码的判断switch(choose){case '1':memset(charer,0,256*sizeof(HuffmanTree));stat_file(charer);printf("请继续选择相应选项\n");break;case '2':make_tree(charer);memset(inside,0,128*sizeof(coding)); //先清空make_code(charer,inside);printf("请继续选择相应选项\n");break;case '3':article_code(inside);printf("请继续选择相应选项\n");break;case '4':decoding(charer); //如果只进行反编译,必须要输入相同的文章以建立哈夫曼树,printf("译码完毕!请打开根目录下的文件查看!\n"); //而之前翻译成代码时也要使用相同文章printf("请继续选择相应选项\n");break;case '0':MessageBox(NULL," 已退出系统!","提示",MB_OK);break;default: printf("对不起,您的操作错误,请重新输入编号!");}}while (choose!='0');}函数1:input_files.cpp#include "define.h"void stat_file(HuffmanTree charer[256]){FILE *fp;char choose;int i,looking;char path[30];loop: printf("请输入文件名:\n"); //设置循环点scanf("%s",path);if((fp=fopen(path,"r"))==NULL) //寻找文件{printf("文件不存在\n");goto loop;}for(i=0;1;i++) // 对应字符的数组元素++{looking=fgetc(fp);if(looking==EOF)break;charer[looking].weight++;}fflush(stdin);printf("继续增加文件???(y/n)?\n");scanf("%c",&choose); //选择if(choose == 'y')goto loop; //返回循环点fclose(fp); //关闭文件}函数2:make_tree.cpp#include "define.h"void make_tree(HuffmanTree charer[256]) //建树函数{int i,min1,min2;int k,j;int flag1=0,flag2=0;void prnt(HuffmanTree charer[256]); //输出到文件中,以后改进时可以直接从文件读取for(i=0;i<n-1;i++) //两重多组的循环,算法不太好,比较的次数递增{for(k=0;k<n+i;k++)if( charer[k].parent == 0) //找出第一个叶子作为最小值{min1=charer[k].weight;flag1=k;break;}for(j=k;j<n+i;j++){if(min1==0) //考虑0的情况,减少循环break;if(charer[j].weight < min1 && charer[j].parent == 0) //否则进行比较{min1=charer[j].weight;flag1=j;}}for(k=0;k<n+i;k++)if( charer[k].parent == 0 && k!=flag1) //找第二个叶子作为次小值{min2=charer[k].weight;flag2=k;break;}for(j=k;j<n+i;j++){if(min2==0)break;if(charer[j].weight < min2 && charer[j].parent == 0 && j!=flag1){min2=charer[j].weight;flag2=j;}}charer[n+i].weight=charer[flag1].weight+charer[flag2].weight; //关键步骤:最小值和次小值的相加并构成子树charer[n+i].rchild=flag1;charer[n+i].lchild=flag2;charer[flag1].parent=n+i;charer[flag2].parent=n+i;}prnt(charer); //顺便输出到文件中}void prnt(HuffmanTree charer[256]){FILE *fp;char sn[20]={"哈夫曼树的如下:"};char xinxi[5][7]={"序号","权值","双亲","左孩子","右孩子"};fp = fopen("HuffmanTree.txt","w+");fprintf(fp,"%s\n",sn);fprintf(fp,"%s\t%s\t%s\t%s\t%s\n",xinxi[0],xinxi[1],xinxi[2],xinxi[3],xinxi[4]);for(int i=0;i<255;i++)fprintf(fp,"%d\t%d\t%d\t%d\t%d\n",i,charer[i].weight,charer[i].parent,charer[i].lc hild,charer[i].rchild);fclose(fp);MessageBox(NULL," 哈夫曼树写入文件成功!","提示",MB_OK);system("HuffmanTree.txt");}函数4:produce_code.cppvoid make_code(HuffmanTree charer[256],coding inside[128]) //从哈夫曼树中生成字符编码{stack push_pop;int k,j;void prn(coding inside[128]); //把编码输出到文件中,共128个for(int i=0;i<128;i++){memset(&push_pop,0,1*sizeof(stack)); //栈存inside[i].ch=i;for(k=i,j=0;1; ) //下面可控制循环退出{if(charer[k].parent!=0) //从下往上找到根节点{if(charer[charer[k].parent].lchild==k) // 子根节点的左孩子编0,右孩子编1push_pop.codes[push_pop.point++]='0'; //压栈// push_pop.point++; // 把++直接放入括号,减少代码量if(charer[charer[k].parent].rchild==k)push_pop.codes[push_pop.point++]='1';// push_pop.point++;j=k;k=charer[k].parent;}else{/* if(charer[charer[j].parent].lchild==j){push_pop.codes[push_pop.point++]='0';// push_pop.point++;}if(charer[charer[j].parent].rchild==j){push_pop.codes[push_pop.point++]='1';// push_pop.point++;}*/break;}}for(k=0,j=push_pop.point;k<push_pop.point;) //从栈顶回取,所得编码存入所设数组inside[i].codes[k++]=push_pop.codes[--j];}prn(inside);}void prn(coding inside[128]){FILE *fp;char sn[20]={"编码的如下:"};char xinxi[3][5]={"序号","字符","编码"};fp = fopen("HuffmanCode.txt","w+");fprintf(fp,"%s\n",sn);fprintf(fp,"%s\t%s\t%s\n",xinxi[0],xinxi[1],xinxi[2]);for(int i=0;i<128;i++)fprintf(fp,"%d\t%c\t%s\n",i,inside[i].ch,inside[i].codes);fclose(fp);MessageBox(NULL," 编码写入文件成功!","提示",MB_OK);system("HuffmanCode.txt");}函数5:article_code.Cpp#include "define.h"void article_code(coding inside[128]){FILE *fp,*fq;char path[50];char ch=0;printf("请输入需要转码的文章名称:\n");scanf("%s",path);if((fp=fopen(path,"r"))==NULL) //寻找文件{MessageBox(NULL," 文件不存在!","提示",MB_OK);exit(1);}fq=fopen("article_code.txt","w+");for(int i=0;1;i++) //从文件读取字符,转换成编码写入文件中{ch=fgetc(fp);if(ch==EOF) //防止多读一次加入到中间比较好break;fprintf(fq,"%s",inside[ch].codes);}fclose(fp); //关闭文件fclose(fq);MessageBox(NULL," 文章转换完毕!","提示",MB_OK);system("article_code.txt");}函数6:decoding.cpp#include "define.h"void decoding(HuffmanTree charer[256]){FILE *fp,*fq; //文件指针,一个读取,一个写入char path[20];int k;char ch;loop: printf("请输入需要解码文件的路径:\n");scanf("%s",path);if((fp=fopen(path,"r"))==NULL) //寻找文件{printf("文件不存在,请确认路径是否正确! \n");goto loop;}fq=fopen("decoding.txt","w+");for(int i=0;1;i++) //从文件中读取编码,由根进行寻找{k=254;ch=fgetc(fp);if(ch==EOF)break;for(int j=0;1;j++){if(ch=='0') //左孩子,继续判断左孩子的左右孩子是否存在,{if(charer[charer[k].lchild].lchild==0 && charer[charer[k].lchild].rchild==0){fprintf(fq,"%c",charer[k].lchild);break;}k=charer[k].lchild; //非叶子节点,即刻转向孩子节点,并进行下一次判断ch=fgetc(fp);if(ch==EOF)break;continue; //读取下一个}if(ch=='1') //右孩子,继续判断右孩子的左右孩子是否存在,不存在即为叶子节点。

数据结构课程设计报告哈夫曼编码译码器

数据结构课程设计报告哈夫曼编码译码器

西安郵電學院数据结构课程设计报告题目1:哈夫曼编码/译码器题目2:学生信息管理系统系部名称:通信工程系专业名称:通信工程班级:****学号:*****学生姓名:****指导教师:*****时间:2009年12月16日至2009年12月25日题目1.哈夫曼编码/译码器一、课程设计目的通过对哈夫曼编码/译码器的实现,熟悉了解Huffman树的创建过程以及存储结构,对Huffman编码/译码过程及原则有了更深层次的认识,锻炼了动手能力,使知识更好的学以致用,为解决数据压缩问题提供方法。

二、课程设计内容通过统计文件中各字符的出现频率,建立Huffman树,再通过建立的已经Huffman的树,对文件中各字符进行编码,将结果存入新的文件中,然后从文件中读取Huffman编码,进行解码,结果存入新的文件中,并与源文件进行比较。

三、需求分析1.统计字符频率:存文件中读入字符,并对各字符出现频率进行统计;2.建立Huffman树:将各字符出现的频率作为权值,建立Huffman树;3.Huffman编码:通过已经建立的Huffman树,对个各字符进行编码,并存入新的文件中;4.译码:读取存放Huffman编码的文件,对文件中编码进行译码,把译码结果存入新的文件中;5.结果验证:将译码结果与原文件内容进行比较;四、概要设计1. 系统结构图(功能模块图)2.功能模块说明1:统计字符频率: 定义结构体 typedef struct str {char data; char num; }str;其中data 域存放字符名称,num 域存放字符出现频率,读取文件ywq1.txt ,通过循环比较将结果赋入S2[128]中;2:创建Huffman 树: 定义结构体 typedef struct {char data; int weight; int parent; int lchild;开始 main ()统计字符频率创建Huffman 树对文件编码对编码译码出现次数 字符名称初 始 化 结点赋值Huffma 编码 存入文件读取编码 存入文件对编码译码 对编码译码成功 失败int rchild;}HTNode,HuffmanTree[M+1];作为Huffman树存储节点类型,调用CrtHuffmanTree()函数,初始化各节点均为0;然后将存储字符频率的数组S2的值赋值给各节点,字符出现频率作为权值,创建Huffman树;3:对文件编码:定义结构体typedef struct{char data;char bits[N+1];}CodeNode,HuffmanCode[N];作为HuffmanCode的存储类型,调用CrtHuffmanCode()函数,从叶子节点向上回溯,是lchild则赋值‘0’,是rchild则赋值为‘1’,对各字符编码,再调用WriteToFile()函数,将结果写入文件ywq2.txt中;4:对文件译码:读取编码文件ywq2.txt中数据,调用DecodHuffmanCode()函数,从根节点开始,读取‘1’,走向rchild,读取‘0’, 走向lchild,直到叶子节点,将叶子节点data域的值写入文件ywq3.txt中;五、详细设计及运行结果1.读文件统计字符频率(read()函数中实现):源文件ywq1.txt :打开源文件 ywq1.txt读文件内的字符,初始化数组s1文件是否结束将字符存入数组 S1[ch].num++读下一个字符给数组末尾加上结束标志“\0”关闭文件是否开始结束运行结果:2:创建Huffman树,CrtHuffmanTree():运行结果:初始化结构体数组htCrtHuffmanTree()有n棵二叉树n > 1选权值最小2个二叉树权值相加得新二叉树n - 1n = 1建立Huffman树结束3:Huffman编码,CrtHuffmanCode();运行结果:CrtHuffmanCode()根cd[--start] = ‘0’cd[--start] = ‘1’否Lchild Rchild cd[start] 赋给hc[i].bits是结束对应字符编码写入文件ywq2.txt编码文件ywq2.txt:3:译码,DecodHuffmanCode():运行结果:文件ywq3.txt:DecodHuffmanCode()打开文件ywq2.txt 读取字符ch文件结束否否找根节点ch = ‘0’, 找lchild ; ch = ‘1’, 找rchild ;叶子节点是是保存 ywq3.txt是结束4:结果验证:比较源文件ywq1.txt 与译码文件ywq3.txt 可知,译码结果与源文件一致。

数据结构实验哈夫曼树及哈夫曼编码c语言

数据结构实验哈夫曼树及哈夫曼编码c语言

数据结构实验报告:哈夫曼树及哈夫曼编码一、实验目的1. 理解哈夫曼树及哈夫曼编码的概念和原理;2. 掌握C语言中哈夫曼树及哈夫曼编码的实现方法;3. 分析和讨论哈夫曼编码在实际应用中的优势和不足。

二、实验内容和步骤1. 哈夫曼树的构建1.1 通过C语言实现哈夫曼树的构建算法;1.2 输入一组权值,按哈夫曼树构建规则生成哈夫曼树;1.3 输出生成的哈夫曼树结构,并进行可视化展示。

2. 哈夫曼编码的实现2.1 设计哈夫曼编码的实现算法;2.2 对指定字符集进行编码,生成哈夫曼编码表;2.3 对给定字符串进行哈夫曼编码,并输出编码结果。

三、实验过程及结果1. 哈夫曼树的构建在C语言中,通过定义结构体和递归算法实现了哈夫曼树的构建。

根据输入的权值,依次选择权值最小的两个节点构建新的父节点,直至构建完成整棵哈夫曼树。

通过调试和可视化展示,确认了程序正确实现了哈夫曼树的构建。

2. 哈夫曼编码的实现经过分析和设计,利用哈夫曼树的特点实现了哈夫曼编码的算法。

根据生成的哈夫曼树,递归地生成字符对应的哈夫曼编码,并输出编码结果。

对指定的字符串进行了编码测试,验证了哈夫曼编码的正确性和有效性。

四、实验结果分析1. 哈夫曼编码在数据传输和存储中具有较高的压缩效率和可靠性,能够有效减少数据传输量和存储空间;2. 哈夫曼树及哈夫曼编码在通信领域、数据压缩和加密等方面有着广泛的应用和重要意义;3. 在实际应用中,哈夫曼编码的构建和解码算法需要较大的时间和空间复杂度,对于大规模数据的处理存在一定的局限性。

五、实验总结通过本次实验,深入理解了哈夫曼树及哈夫曼编码的理论知识,并掌握了C语言中实现哈夫曼树及哈夫曼编码的方法。

对哈夫曼编码在实际应用中的优势和局限性有了更深入的认识,这对今后的学习和工作有着积极的意义。

六、参考文献1. 《数据结构(C语言版)》,严蔚敏赵现军著,清华大学出版社,2012年;2. 《算法导论》,Thomas H. Cormen 等著,机械工业出版社,2006年。

数据结构课程设计-哈夫曼编码实验报告

数据结构课程设计-哈夫曼编码实验报告

数据结构课程设计报告实验二哈夫曼编码目录一.问题描述及分析p11.问题描述p12.需求分析p1 二.功能模块及数据结构描述p11.数据结构描述 p1 2.模块描述 p2三.主要算法流程描述p21.编码流程图 p3 2.译码流程图 p4四.使用说明p5 五.调试分析说明p6一.问题描述及分析1.问题描述设计一个哈夫曼编码/译码系统,对一个文本文件中的字符进行哈夫曼编码,生成编码文件(后缀名.cod);反过来,可将一个编码文件还原为一个文本文件(.txt)。

2.需求分析(1)输入一个待压缩的文本文件名,统计文本文件中各字符的个数作为权值,生成哈夫曼树;(2)将文本文件利用哈夫曼树进行编码,生成编码文件(后缀名cod);(3)输入一个待解压的压缩文件名称,并利用相应的哈夫曼树将编码序列译码;(4)显示指定的编码文件和文本文件;3.运行要求.Windows xp/2003.VC++6.0(或以上)运行库二.功能模块及数据结构描述1.数据结构描述typedef struct{long weight;long lchild,rchild,parent;}hfmt;hfmt t[2*256-1];存放哈夫曼树结构体,weight为节点权值,lchild,rchild为节点的左右孩子在向量中的下标(为叶节点时,两值为:-1),parent为节点的双亲在向量中的下标(用来区别根与非根节点,值为-1与非-1)。

typedef struct{char bits[256];long s;}hfmcc;hfmcc cc[256];存放哈夫曼编码结构体,s用来指示编码在位串bits[n]中的起始位置。

2.模块描述图2.1 系统函数copy函数:根据s的值在位串bits[n]中提取有效编码位数。

HFM函数:对读入的节点权值,生成哈夫曼树。

HFMBM函数:对生成的哈夫曼树进行零一编码,对应于原文件字符。

三.主要算法流程描述1.编码流程图图2.2 编码流程图2.译码流程图图2.3 译码流程图四.使用说明图2.4 生成的文件本软件默认生成的编码文件名为:a.cod默认生成的译码文件名为:b.txt执行提示:输入所要编码的文本文件。

数据结构课程设计--哈夫曼编码问题的设计和实现

数据结构课程设计--哈夫曼编码问题的设计和实现

题目哈夫曼编码问题的设计和实现课程名称数据结构课程设计院(系、部、中心)专业班级学生姓名学号设计地点指导教师设计起止时间:2008 年6月2日至2008 年6月 6 日目录1 问题描述 (2)1.1 题目内容 (2)1.2 基本要求 (3)1.3 测试数据 (3)2 需求分析 (3)2.1 程序的基本功能 (3)2.2 输入值、输出值以及输入输出形式 (3)2.3 各个模块的功能要求 (4)3 概要设计 (4)3.1 所需的ADT,每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义) (4)3.2 主程序流程以及模块调用关系 (5)3.3 各个模块的算法设计说明 (5)4 详细设计 (8)4.1 数据类型 (8)4.2 函数调用 (9)5 各个算法实现的源程序 (9)6 调试分析 (12)7 使用说明 (12)8 测试结果 (13)9 源程序 (13)1 问题描述1.1 题目内容哈夫曼编码问题的设计和实现输入一个英文字符串,对该字符串中各字符个数进行统计取得各字符的出现次数;以其出现次数作为关键字建立哈夫曼树并进行编码,最后输出各个字符对应的码值。

1.2 基本要求要求:设计存储结构、基本算法(主要采用程序流程图体现);完成基本算法的实现代码;设计测试输入数据对程序进行测试,分析输出结果数据、算法的时间复杂度分析,如有改进算法则提出算法的改进方法。

1.3 测试数据测试数据三组:AAAABBBCCD(判断连续的字符串是否可行)AABBAABCDC(判断间段的字符串是否可行)AAAA BBBCCD(判断含空格的字符串是否可行)2 需求分析2.1 程序的基本功能该程序大体上有两个功能:1.输入任何一个字符串后,该程序能统计不同字符串的个数,并以不同字符串的个数作为权值。

2.已知不同字母的权值,以该权值作为叶结点,构造一棵带权路径最小的树,对该树从叶结点到根结点路径分支遍历,经过一个分支就得到一位夫曼编码值。

数据结构 哈夫曼编码器课程设计报告

数据结构 哈夫曼编码器课程设计报告

数据结构哈夫曼编码器课程设计报告哈夫曼编码器课程设计报告设计目标:本课程设计的目标是实现一个哈夫曼编码器,能够实现对给定文本文件进行压缩和解压缩操作。

通过使用哈夫曼编码,可以使文本文件的大小大幅度减小,从而节约存储空间。

设计原理及实现方法:本设计主要包括以下几个步骤:1、文本文件的读取:首先需要从外部文件中读取待压缩的文本文件,读取过程可以通过使用文件输入流进行操作。

读取的文本内容将用于构建哈夫曼树和编码表。

2、构建哈夫曼树:哈夫曼树是通过给定文本中的字符出现频率来构建的,出现频率更高的字符将拥有更短的编码。

构建哈夫曼树的过程可以通过使用优先队列和二叉树来实现。

3、编码表:在构建哈夫曼树的过程中,每个字符都会有一个唯一的编码。

根据哈夫曼树的特性,左子树的编码为0,右子树的编码为1,根据这个规则可以通过遍历哈夫曼树来编码表。

4、压缩文本文件:在编码表后,可以利用编码表来对文本文件进行压缩操作。

遍历文本文件中的每个字符,通过编码表将字符转换为对应的哈夫曼编码,并将编码存储在一个压缩文件中。

5、解压缩文本文件:解压缩操作是压缩操作的逆过程。

根据编码表将压缩文件中的哈夫曼编码逐个解码为字符,并将解码后的字符写入解压缩文件中。

附件说明:本文档的附件包括以下内容:1、源代码文件:- HuffmanEncoder:java:包含了哈夫曼编码器的主要实现代码。

- Mn:java:包含了测试哈夫曼编码器的主函数。

2、示例文本文件:- input:txt:用于测试的示例文本文件。

法律名词及注释:本文档中涉及的法律名词及注释如下:1、哈夫曼编码:用于数据压缩的一种编码方式,旨在通过减少字符的编码长度来节省存储空间。

2、压缩:将原始文件经过编码转换为较短的文件,从而减小存储空间的占用。

3、解压缩:将压缩文件经过解码转换为原始文件,恢复原始文件的过程。

全文结束。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计哈夫曼编码-2《数据结构与算法》课程设计目录一、前言1.摘要2.《数据结构与算法》课程设计任务书二、实验目的三、题目--赫夫曼编码/译码器1.问题描述2.基本要求3.测试要求4.实现提示四、需求分析--具体要求五、概要设计六、程序说明七、详细设计八、实验心得与体会前言1.摘要随着计算机的普遍应用与日益发展,其应用早已不局限于简单的数值运算,而涉及到问题的分析、数据结构框架的设计以及设计最短路线等复杂的非数值处理和操作。

算法与数据结构的学习就是为以后利用计算机资源高效地开发非数值处理的计算机程序打下坚实的理论、方法和技术基础。

算法与数据结构旨在分析研究计算机加工的数据对象的特性,以便选择适当的数据结构和存储结构,从而使建立在其上的解决问题的算法达到最优。

数据结构是在整个计算机科学与技术领域上广泛被使用的术语。

它用来反映一个数据的内部构成,即一个数据由那些成分数据构成,以什么方式构成,呈什么结构。

数据结构有逻辑上的数据结构和物理上的数据结构之分。

逻辑上的数据结构反映成分数据之间的逻辑关系,而物理上的数据结构反映成分数据在计算机内部的存储安排。

数据结构是数据存在的形式。

《数据结构》主要介绍一些最常用的数据结构,阐明各种数据结构内在的逻辑关系,讨论其在计算机中的存储表示,以及在其上进行各种运算时的实现算法,并对算法的效率进行简单的分析和讨论。

数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。

学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。

通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。

2.《数据结构与算法》课程设计任务书《数据结构与算法》是计算机专业重要的核心课程之一,在计算机专业的学习过程中占有非常重要的地位。

《数据结构与算法课程设计》就是要运用本课程以及到目前为止的有关课程中的知识和技术来解决实际问题。

特别是面临非数值计算类型的应用问题时,需要选择适当的数据结构,设计出满足一定时间和空间限制的有效算法。

本课程设计要求同学独立完成一个较为完整的应用需求分析。

并在设计和编写具有一定规模程序的过程中,深化对《数据结构与算法》课程中基本概念、理论和方法的理解;训练综合运用所学知识处理实际问题的能力,强化面向对象的程序设计理念;使自己的程序设计与调试水平有一个明显的提高。

二、实验目的数据结构作为一门学科主要研究数据的各种逻辑结构和存储结构,以及对数据的各种操作。

因此,主要有三个方面的内容:数据的逻辑结构;数据的物理存储结构;对数据的操作(或算法)。

通常,算法的设计取决于数据的逻辑结构,算法的实现取决于数据的物理存储结构。

数据结构是信息的一种组织方式,其目的是为了提高算法的效率,它通常与一组算法的集合相对应,通过这组算法集合可以对数据结构中的数据进行某种操作。

在当今信息时代,信息技术己成为当代知识经济的核心技术。

我们时刻都在和数据打交道。

比如人们在外出工作时找最短路径,在银行查询存款、通过互联网查新闻、以及远程教育报名等,所有这些都在与数据发生关系。

实际上,现实世界中的实体经过抽象以后,就可以成为计算机上所处理的数据。

数据结构课程主要是研究非数值计算的程序设计问题中所出现的计算机操作对象以及它们之间的关系和操作的学科。

数据结构是介于数学、计算机软件和计算机硬件之间的一门计算机专业的核心课程,它是计算机程序设计、数据库、操作系统、编译原理及人工智能等的重要基础,广泛的应用于信息学、系统工程等各种领域。

学习数据结构是为了将实际问题中所涉及的对象在计算机中表示出来并对它们进行处理。

通过课程设计可以提高学生的思维能力,促进学生的综合应用能力和专业素质的提高。

通过此次课程设计主要达到以下目的:♦了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;♦初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;♦提高综合运用所学的理论知识和方法独立分析和解决问题的能力;♦训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

三、题目--赫夫曼编码/译码器1. 问题描述利用赫夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

这要求在发送端通过一个编码系统对待传输数据预先编码,在接收端将传来的数据进行译码(复原)。

对于双工信道(即可以双向传输信息的信道),每端都需要一个完整的编/译码系统。

试为这样的信息收发站编写一个赫夫曼码的编/译码系统。

2.基本要求一个完整的系统应具有以下功能:(1) I:初始化(Initialization)。

从终端读入字符集大小n,以及n个字符和n个权值,建立赫夫曼树,并将它存于文件hfmTree中。

(2) E:编码(Encoding)。

利用已建好的赫夫曼树(如不在内存,则从文件hfmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中。

(3) D:译码(Decoding)。

利用已建好的赫夫曼树将文件CodeFile中的代码进行译码,结果存入文件Textfile 中。

以下为选做:(4) P:印代码文件(Print)。

将文件CodeFile以紧凑格式显示在终端上,每行50个代码。

同时将此字符形式的编码文件写入文件CodePrin中。

(5) T:印赫夫曼树(Tree printing)。

将已在内存中的赫夫曼树以直观的方式(比如树)显示在终端上,同时将此字符形式的赫夫曼树写入文件TreePrint 中。

3.测试要求(1) 已知某系统在通信联络中只可能出现八种字符,其频率分别为0.05,0.29,0.07,0.08,0.14,0.23,0.03,0.11,试设计赫夫曼编码。

(2) 用下表给出的字符集和频度的实际统计数据建立赫夫曼树,并实现以下报文的编码和译码:“THIS PROGRAME IS MY FA VORITE”。

字符A B C D E F G H I J K L M频度1866413223213211547571 5 322字符N O P Q R S T U V W X Y Z频度5763151 48518238 181 1614.实现提示(1) 编码结果以文本方式存储在文件Codefile中。

(2) 用户界面可以设计为“菜单”方式:显示上述功能符号,再加上“Q”,表示退出运行Quit。

请用户键入一个选择功能符。

此功能执行完毕后再显示此菜单,直至某次用户选择了“Q”为止。

(3) 在程序的一次执行过程中,第一次执行I,D或C 命令之后,赫夫曼树已经在内存了,不必再读入。

每次执行中不一定执行I命令,因为文件hfmTree可能早已建好。

四、具体要求:课程设计成果的内容必须由以下四个部分组成,缺一不可。

(1) 上交源程序:学生按照实验题目的具体要求所开发的所有源程序(应该放到一个文件夹中);(2) 上交程序的说明文件:(保存在.txt中)在说明文档中应该写明上交程序所在的目录,上交程序的主程序文件名,如果需要安装,要有程序的安装使用说明;(3) 设计报告:(保存在word 文档中,文件名要求:按照“姓名_学号_设计题目”起名,如文件名为“张三_XXX_赫夫曼编码”.doc。

打印稿用A4纸)。

其中包括:♦题目;♦实验目的;♦需求分析:在该部分中叙述实现的功能要求;♦概要设计:在此说明每个部分的算法设计说明(可以是描述算法的流程图),每个程序中使用的存储结构设计说明(如果指定存储结构请写出该存储结构的定义);♦详细设计各个算法实现的源程序,对每个题目要有相应的源程序(可以是一组源程序,每个功能模块采用不同的函数实现)。

源程序要按照写程序的规则来编写。

要结构清晰,重点函数的重点变量、重点功能部分要加上清晰的程序注释;♦调试分析测试数据,测试输出的结果,时间复杂度分析,和每个模块设计和调试时存在问题的思考(问题是哪些?问题如何解决?),算法的改进设想;♦总结:总结可以包括 : 设计过程的收获、遇到问题及解决问题过程的思考、程序调试能力的思考、对数据结构这门课程的思考、在设计过程中对《数据结构》课程的认识等内容。

(4)考核成绩评定标准:本课程设计的评价由三部分组成,包括程序演示(50%),课程设计报告(30%),回答教师提问(20%)。

1.程序演示:➢优功能完善,全部测试正确,并且能够对局部进行完善。

➢良功能完善,但测试欠缺。

➢中功能基本完善,但程序尚有部分错误。

➢及格完成内存中赫夫曼编码/译码,但不涉及文件操作。

➢不及格功能不完善,且程序错误较多,无法运行。

2.课程设计报告:1.优包括设计内容,设计思想,已经完成的任务及达到的目标,设计思路清晰、书写条理清楚,源程序结构合理、清晰,注释说明完整,有对本次课程设计的心得体会。

2.良包括设计内容,设计思想,已经完成的任务及达到的目标,设计思路基本清晰、书写条理基本清楚,源程序结构合理、清晰,注释说明基本完整,有对本次课程设计的心得体会。

3.中课程设计报告内容基本完整,思路较清晰,书写基本清楚,源程序结构尚可,有注释说明但不完整。

4.及格课程设计报告内容基本完整,思路较差,书写尚清楚。

5.不及格课程设计报告内容不完整,书写没有条理。

3.回答教师提问:1.优能回答教师提出的所有问题,并完全正确,思路清晰2.良基本能回答教师提出的所有问题,有些小错误3.中基本能回答教师提出的问题,少数问题回答错误或不清楚4.及格能回答教师提出的问题,但较多问题回答错误或不能回答5.不及格基本不能回答教师提出的问题四、概要设计1)问题分析哈夫曼树的定义1.哈夫曼树节点的数据类型定义为:typedef struct{ //赫夫曼树的结构体char ch;int weight; //权值int parent,lchild,rchild;}htnode,*hfmtree;2)所实现的功能函数如下1、void hfmcoding(hfmtree &HT,hfmcode &HC,int n)初始化哈夫曼树,处理InputHuffman(Huffman Hfm)函数得到的数据,按照哈夫曼规则建立2叉树。

此函数块调用了Select()函数。

2、void Select(hfmtree &HT,int a,int *p1,int *p2) //Select函数,选出HT树到a为止,权值最小且parent为0的2个节点2、int main()主函数:利用已建好的哈夫曼树(如不在内存,则从文件hfmtree.txt中读入)对文件中的正文进行编码,然后将结果存入文件codefile.txt中。

相关文档
最新文档