数据结构课程设计报告java+哈夫曼树

合集下载

数据结构课程设计哈夫曼

数据结构课程设计哈夫曼

数据结构课程设计哈夫曼一、课程目标知识目标:1. 理解哈夫曼编码的基本原理和构建方法;2. 掌握哈夫曼树的结构特点及其应用;3. 学会运用哈夫曼编码进行数据压缩,并了解其优缺点。

技能目标:1. 能够运用所学知识构建哈夫曼树并进行编码;2. 能够分析给定数据集的最优哈夫曼编码方案;3. 能够运用哈夫曼编码解决实际问题,如文件压缩与解压。

情感态度价值观目标:1. 培养学生对数据结构在计算机科学中重要性的认识,激发对数据结构学习的兴趣;2. 培养学生的团队合作意识,学会在团队中发挥个人优势,共同解决问题;3. 培养学生严谨、细致的学术态度,养成良好的编程习惯。

课程性质分析:本课程为高中信息技术学科的数据结构部分,旨在让学生了解并掌握常用的数据结构及其应用。

哈夫曼编码作为数据结构中的一种重要应用,具有很高的实用价值。

学生特点分析:高中学生已经具备了一定的逻辑思维能力,能够理解抽象的概念,但实践经验不足,需要通过具体的案例和动手操作来加深理解。

教学要求:1. 理论与实践相结合,注重培养学生的动手能力;2. 以学生为主体,鼓励学生主动探究、合作学习;3. 注重培养学生的创新能力和解决问题的能力。

二、教学内容1. 引入:回顾树的基本概念,为新课哈夫曼树做好知识铺垫。

教材章节:第二章 树与二叉树2. 哈夫曼编码原理:- 哈夫曼编码的基本思想与原理- 哈夫曼树的构建过程教材章节:第二章 树与二叉树,第五节 哈夫曼编码3. 哈夫曼树的构建方法:- 构建哈夫曼树的步骤- 哈夫曼编码的生成方法教材章节:第二章 树与二叉树,第五节 哈夫曼编码4. 哈夫曼编码的应用:- 文件压缩与解压的原理- 哈夫曼编码在数据压缩中的应用案例教材章节:第二章 树与二叉树,第五节 哈夫曼编码及应用5. 实践操作:- 动手编写程序构建哈夫曼树并进行编码- 分析实际数据集,设计最优哈夫曼编码方案教材章节:第二章 树与二叉树,第五节 哈夫曼编码实践6. 总结与拓展:- 总结哈夫曼编码的特点及其在数据压缩中的应用优势- 探讨哈夫曼编码在其他领域的拓展应用教材章节:第二章 树与二叉树,第五节 哈夫曼编码拓展与应用教学内容安排与进度:1. 引言与回顾:1课时2. 哈夫曼编码原理与构建方法:2课时3. 哈夫曼编码应用与实践操作:2课时4. 总结与拓展:1课时总计:6课时三、教学方法1. 讲授法:- 在讲解哈夫曼编码的基本原理、构建方法及应用场景时,采用讲授法进行知识传授,使学生在短时间内掌握关键概念和理论。

数据结构哈夫曼树实验报告

数据结构哈夫曼树实验报告

数据结构哈夫曼树实验报告一、实验目的本次实验的主要目的是深入理解和掌握哈夫曼树的数据结构及其相关算法,通过实际编程实现哈夫曼编码和解码的过程,提高对数据结构的应用能力和编程技能。

二、实验环境本次实验使用的编程语言为 Python,开发工具为 PyCharm。

操作系统为 Windows 10。

三、实验原理哈夫曼树(Huffman Tree),又称最优二叉树,是一种带权路径长度最短的二叉树。

其基本思想是通过构建一棵二叉树,使得权值较大的节点离根节点较近,权值较小的节点离根节点较远,从而实现带权路径长度的最小化。

哈夫曼编码是一种基于哈夫曼树的变长编码方式。

对于给定的字符集及其出现的频率,通过构建哈夫曼树,可以为每个字符生成唯一的编码,使得编码后的字符串总长度最短。

在构建哈夫曼树的过程中,首先将每个字符及其出现的频率作为一个独立的节点,然后按照频率从小到大的顺序进行合并,每次合并两个频率最小的节点,生成一个新的节点,其频率为两个子节点频率之和。

重复这个过程,直到所有节点合并为一个根节点,最终得到的二叉树即为哈夫曼树。

四、实验步骤1、定义节点类```pythonclass Node:def __init__(self, char, freq, left=None, right=None):selfchar = charselffreq = freqselfleft = leftselfright = rightdef __lt__(self, other):return selffreq < otherfreq```这个节点类包含了字符、频率以及左右子节点的信息,并实现了小于比较方法,以便在构建哈夫曼树时进行节点的排序。

2、构建哈夫曼树```pythondef build_huffman_tree(freq_dict):nodes = Node(char, freq) for char, freq in freq_dictitems()while len(nodes) > 1:nodessort()left = nodespop(0)right = nodespop(0)merged_freq = leftfreq + rightfreqnew_node = Node(None, merged_freq, left, right)nodesappend(new_node)return nodes0```该函数根据字符频率字典创建节点列表,然后不断合并频率最小的两个节点,直到只剩下一个节点,即哈夫曼树的根节点。

数据结构哈夫曼树的构造及其应用课程设计实验报告

数据结构哈夫曼树的构造及其应用课程设计实验报告

目录第一章哈夫曼树的基本术语 (1)1.1路径和路径长度 (1)1.2树的带权路径长度 (1)1.3哈夫曼树的定义 (1)第二章哈夫曼树的构造 (2)2.1哈夫曼树的构造 (2)第三章哈夫曼树的存储结构及哈夫曼算法的实现 (3)3.1哈夫曼树的存储结构 (3)3.2 哈夫曼算法的简要描述 (3)第四章哈夫曼树的应用 (5)4.1哈夫曼编码 (5)4.2求哈夫曼编码的算法 (5)4.21思想方法 (5)4.22字符集编码的存储结构及其算法描述 (6)4.3哈夫曼树和编码程序实现: (6)4.4程序运行结果: (9)心得体会 (10)参考文献 (10)第一章哈夫曼树的基本术语1.1路径和路径长度在一棵树中,从一个结点往下可以达到的孩子或子孙结点之间的通路,称为路径。

通路中分支的数目称为路径长度。

若规定根结点的层数为1,则从根结点到第L层结点的路径长度为L-1。

1.2结点的权及带权路径长度若将树中结点赋给一个有着某种含义的数值,则这个数值称为该结点的权。

结点的带权路径长度为:从根结点到该结点之间的路径长度与该结点的权的乘积。

1.2树的带权路径长度树的带权路径长度(Weighted Path Length of Tree):也称为树的代价,定义为树中所有叶结点的带权路径长度之和,通常记为:其中:n表示叶子结点的数目wi和li分别表示叶结点ki的权值和根到结点ki之间的路径长度。

1.3哈夫曼树的定义在权为wl ,w2,…,wn的n个叶子所构成的所有二叉树中,带权路径长度最小(即代价最小)的二叉树称为最优二叉树或哈夫曼树。

[例]给定4个叶子结点a,b,c和d,分别带权7,5,2和4。

构造如下图所示的三棵二叉树(还有许多棵),它们的带权路径长度分别为:(a)WPL=7*2+5*2+2*2+4*2=36(b)WPL=7*3+5*3+2*1+4*2=4(c)WPL=7*1+5*2+2*3+4*3=35其中(c)树的WPL最小,可以验证,它就是哈夫曼树。

哈夫曼树的应用数据结构课程设计

哈夫曼树的应用数据结构课程设计

《数据结构》课程设计报告题目:哈夫曼树应用学生姓名:谢辉学号: 201317010201专业班级:计科13102同组姓名:赵丽娜指导教师:徐晓蓉设计时间:2014年下学期第18周目录一、需求分析 (2)1. 分析问题 (2)2. 确定解决方案 (2)3. 输入的形式和输入值的范围 (3)4.输出的形式 (3)5.程序所能达到的功能 (3)二、概要设计 (4)1. 主程序的流程图: (4)2.程序中数据类型的定义: (4)3.各程序模块之间的层次(调用)关系: (4)三、详细设计 (5)1.哈夫曼树存储及类的定义: (5)2.哈夫曼树的基本操作: (6)3.主函数 (7)1. 测试数据及其输出结果: (9)2. 调试过程中遇到的问题及解决办法: (13)五、总结 (14)七、致谢 (14)八、附录 (14)一、需求分析1.分析问题利用哈夫曼编码进行通信可以大大提高信道利用率,缩短信息传输时间,降低传输成本。

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

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

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

2.确定解决方案设计建立带权的哈夫曼树,确定哈夫曼树的类与成员函数,以及各函数之间的调用关系,采用动态数组的存储结构存储所需要的数据,通过不同的函数来实现编码,译码以及打印二进制编码、哈夫曼树,把不同的数据存入不同的txt文件中,通过主函数调用来实现功能检测。

3.输入的形式和输入值的范围手动或者从文本中读入数据的形式初始化哈夫曼树,从键盘中或者文件中读入数据,以字母A-Z代表结点,以自然数代表权值,字符串提示使用者所要执行的操作。

4.输出的形式在显示器界面上或者以文本的形式来实现程序调试的输出。

5.程序所能达到的功能(1)I:初始化(Initialization)。

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

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

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

《数据结构》课程设计实验报告题目哈夫曼编码/译码器学院数理与信息学院专业计算机科学与技术班级计科132学生姓名刘海澍 5周弘杰8徐铭瑶 3指导教师编写日期数据结构课程设计目录1 问题描述.................................................................错误!未定义书签。

2 问题分析.................................................................错误!未定义书签。

3 算法设计 (2)3.1抽象数据类型定义 (2)3.2模块划分 (3)4 详细设计 (4)4.1数据类型的定义 (4)4.2主要模块的算法描述 (4)4.3 流程图 (6)5 测试分析 (9)6 课程设计总结 (10)7 成员分工 (10)参考文献 (11)附录(源程序清单) (12)1.问题描述设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。

1) 初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;2) 编码:利用建好的哈夫曼树生成哈夫曼编码;3) 输出编码;4)显示哈夫曼树;5)界面设计的优化;6) 设字符集及频度如下表:字符空格 A B C D E F频度4 9 23 2 17 15字符G H I J K频度1 2 3 3 42.问题分析(1)定义一个变量名为HTNode的结构体,用该结构体中的char data、int weight、int parent、int lchild、int rchild分别表示哈夫曼树中每个结点的权值、权重、双亲结点、左孩子、右孩子,再定义一个HTNode类型的数组ht[60]存放哈夫曼树;另外定义一个变量名为HCode的结构体,采用HCode类型变量的cd[start]~cd[n]存放当前结点的哈夫曼编码、最后定义一个HCode类型的数组hcd[30]的数组用于存放当前叶子结点ht[i]的哈夫曼编码。

哈夫曼树_实验报告

哈夫曼树_实验报告

一、实验目的1. 理解哈夫曼树的概念及其在数据结构中的应用。

2. 掌握哈夫曼树的构建方法。

3. 学习哈夫曼编码的原理及其在数据压缩中的应用。

4. 提高编程能力,实现哈夫曼树和哈夫曼编码的相关功能。

二、实验原理哈夫曼树(Huffman Tree)是一种带权路径长度最短的二叉树,又称为最优二叉树。

其构建方法如下:1. 将所有待编码的字符按照其出现的频率排序,频率低的排在前面。

2. 选择两个频率最低的字符,构造一棵新的二叉树,这两个字符分别作为左右子节点。

3. 计算新二叉树的频率,将新二叉树插入到排序后的字符列表中。

4. 重复步骤2和3,直到只剩下一个节点,这个节点即为哈夫曼树的根节点。

哈夫曼编码是一种基于哈夫曼树的编码方法,其原理如下:1. 从哈夫曼树的根节点开始,向左子树走表示0,向右子树走表示1。

2. 每个叶子节点对应一个字符,记录从根节点到叶子节点的路径,即为该字符的哈夫曼编码。

三、实验内容1. 实现哈夫曼树的构建。

2. 实现哈夫曼编码和译码功能。

3. 测试实验结果。

四、实验步骤1. 创建一个字符数组,包含待编码的字符。

2. 创建一个数组,用于存储每个字符的频率。

3. 对字符和频率进行排序。

4. 构建哈夫曼树,根据排序后的字符和频率,按照哈夫曼树的构建方法,将字符和频率插入到哈夫曼树中。

5. 实现哈夫曼编码功能,遍历哈夫曼树,记录从根节点到叶子节点的路径,即为每个字符的哈夫曼编码。

6. 实现哈夫曼译码功能,根据哈夫曼编码,从根节点开始,按照0和1的路径,找到对应的叶子节点,即为解码后的字符。

7. 测试实验结果,验证哈夫曼编码和译码的正确性。

五、实验结果与分析1. 构建哈夫曼树根据实验数据,构建的哈夫曼树如下:```A/ \B C/ \ / \D E F G```其中,A、B、C、D、E、F、G分别代表待编码的字符。

2. 哈夫曼编码根据哈夫曼树,得到以下字符的哈夫曼编码:- A: 00- B: 01- C: 10- D: 11- E: 100- F: 101- G: 1103. 哈夫曼译码根据哈夫曼编码,对以下编码进行译码:- 00101110111译码结果为:BACGACG4. 实验结果分析通过实验,验证了哈夫曼树和哈夫曼编码的正确性。

赫夫曼树实验报告

赫夫曼树实验报告

《数据结构》课程设计报告课程名称: 《数据结构》课程设计课程设计题目:姓名:院系:专业:年级:学号:指导教师:2011年月日目录1、程序设计的目的2、设计题目3、分析4、设计思想5、算法6、测试结果7、调试分析8、小结1、课程设计的目的2、熟练使用C++语言编写程序, 解决实际问题;3、了解并掌握数据结构与算法的设计方法, 具备初步的独立分析和设计能力;4、初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;5、提高综合运用所学的理论知识和方法独立分析和解决问题的能力;6、练习树和哈夫曼树的有关操作, 和各个算法程序, 理解哈夫曼树的编码和译码7、熟悉哈夫曼树的基本操作。

8、掌握哈夫曼编码的实现以及实际应用2. 设计题目(略)这是书上的程序, 我是读了这个程序之后写的实验报告。

3. 分析赫夫曼树是给定n个权值作为n个叶子结点, 构造一棵二叉树, 若带权路径长度达到最小。

就是当你输入每个树叶结点个数及字符和权值时, 通过赫夫曼编码就能得到它的赫夫曼编码。

4. 设计思想构造赫夫曼数的结点结构:#ifndef _HTnode_#define _HTnode_//哈夫曼树节点结构struct HTnode{char ch;int weight,parent,lchild,rchild;};#endif#ifndef _HCnode_#define _HCnode_//哈夫曼编码表结构struct HCnode{char ch;char *pstring;};#endif然后构造赫夫曼树类, 建立函数进行建立赫夫曼树, 显示赫夫曼树, 建立赫夫曼编码表, 还有就是编码译码的函数。

5. 算法#ifndef _HCnode_#define _HCnode_//哈夫曼编码表结构struct HCnode{char ch;char *pstring;};#endif#ifndef _HTnode_#define _HTnode_//哈夫曼树节点结构struct HTnode{char ch;int weight,parent,lchild,rchild;};#endif#ifndef _HuffmanCoder_#define _HuffmanCoder_#include <fstream>//#include "HTnode.h"#include "HCnode.h"//#include "HuffmanTree.h"using namespace std;class HuffmanCoder{public:HuffmanCoder(const int &n){m_HC = new HCnode[n];m_HCsize = n;}~HuffmanCoder();void CreateBook(HuffmanTree &); //建立n个字符的赫夫曼编码表HCvoid Coder(char ch[]); //编码void Decoder(HuffmanTree &); //译码private:HCnode *m_HC; //外结点个数int m_HCsize; //哈夫曼编码表基地址指针};HuffmanCoder::~HuffmanCoder(){for(int i = 0; i < m_HCsize; i++)delete[]m_HC[i].pstring;delete[]m_HC;}//建立n个字符的哈夫曼编码表HCvoid HuffmanCoder::CreateBook(HuffmanTree &ht){int i,j,c,f,start;char *cd = new char[m_HCsize];cd[m_HCsize-1] = '\0';cout << "以下是各字符的哈夫曼编码:" << endl << endl;for (i = 0; i < m_HCsize; i++){ // 逐个字符求赫夫曼编码start = m_HCsize-1; // 编码结束符位置 m_HC[i].ch = ht.m_HT[i].ch;for (c = i ,f = ht.m_HT[i].parent; f != -1;c = f, f = ht.m_HT[f].parent){ // 从叶子到根逆向求编码if(ht.m_HT[f].lchild == c)cd[--start] = '0';elsecd[--start] = '1';}m_HC[i].pstring = new char[m_HCsize-start];cout << "第" << i << "个字符" << ht.m_HT[i].ch << "的编码是: ";for (j = start; j < m_HCsize; j++){cout << cd[j];m_HC[i].pstring[j - start] = cd[j];}cout << endl;}cout << endl;delete[] cd; // 释放工作空间}//对用字符串组成的电文用哈夫曼编码表进行编码void HuffmanCoder::Coder(char ch[]){ofstream outfile("f1.dat",ios::out); //打开数据文件f1for (unsigned int i = 0; i < strlen(ch); i++){for (int j = 0; j < m_HCsize; j++){if (ch[i] == m_HC[j].ch){for (int k = 0; m_HC[j].pstring[k]; k++){cout << m_HC[j].pstring[k];//编码结果打印outfile.put(m_HC[j].pstring[k]);//编码结果写入数据文件f1 }break;}}}cout << endl;outfile.close(); //关闭数据文件}//对用0, 1串组成的电文用哈夫曼树表进行译码void HuffmanCoder::Decoder(HuffmanTree &ht){char ch[256];int j(0), i(0), p, pre, root = ht.m_HTsize-1;ifstream infile("f1.dat",ios::in);//打开数据文件f1while(infile.get(ch[j]))j++; //从数据文件f1中读取 0, 1串组成的电文至chcout << "需译码的二进制电文是: " << endl;j = 0;while(ch[j]){cout << ch[j];j++;}cout << endl;cout << "译码结果: " << endl;p = root;while (i < strlen(ch)){while (p != -1){if (ch[i] == '0'){pre = p;p = ht.m_HT[p].lchild;}else{pre = p;p = ht.m_HT[p].rchild;}i++;}cout << ht.m_HT[pre].ch;i--;p = root;}cout << endl;infile.close();//关闭数据文件}#endif#ifndef _HuffmanTree_#define _HuffmanTree_//#include <fstream>#include "HTnode.h"//#include "HCnode.h"#define max 10000using namespace std;//哈夫曼树类class HuffmanTree{friend class HuffmanCoder;public:// 构造函数: 分配2*n-1个存储单元的顺序空间(正则树)。

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

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

数据结构设计性实验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)练习通过普通树来构造霍夫曼树。

(完整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程序的经验并逐渐培养我们的编程能力、用计算机解决实际问题的能力。

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

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

数据结构哈夫曼树实验报告

数据结构哈夫曼树实验报告

数据结构哈夫曼树实验报告一、实验内容本次实验的主要内容是哈夫曼树的创建和编码解码。

二、实验目的1. 理解并掌握哈夫曼树的创建过程;2. 理解并掌握哈夫曼编码的原理及其实现方法;3. 掌握哈夫曼树的基本操作,如求哈夫曼编码和哈夫曼解码等;4. 学习如何组织程序结构,运用C++语言实现哈夫曼编码和解码。

三、实验原理哈夫曼树的创建:哈夫曼树的创建过程就是一个不断合并权值最小的两个叶节点的过程。

具体步骤如下:1. 将所有节点加入一个无序的优先队列里;2. 不断地选出两个权值最小的节点,并将它们合并成为一个节点,其权值为这两个节点的权值之和;3. 将新的节点插入到队列中,并继续执行步骤2,直到队列中只剩下一棵树,这就是哈夫曼树。

哈夫曼编码:哈夫曼编码是一种无损压缩编码方式,它根据字符出现的频率来构建编码表,并通过编码表将字符转换成二进制位的字符串。

具体实现方法如下:1. 统计每个字符在文本中出现的频率,用一个数组记录下来;2. 根据字符出现的频率创建哈夫曼树;3. 从根节点开始遍历哈夫曼树,给左分支打上0的标记,给右分支打上1的标记。

遍历每个叶节点,将对应的字符及其对应的编码存储在一个映射表中;4. 遍历文本中的每个字符,查找其对应的编码表,并将编码字符串拼接起来,形成一个完整的编码字符串。

哈夫曼解码就是将编码字符串还原为原始文本的过程。

具体实现方法如下:1. 从根节点开始遍历哈夫曼树,按照编码字符串的位数依次访问左右分支。

如果遇到叶节点,就将对应的字符记录下来,并重新回到根节点继续遍历;2. 重复步骤1,直到编码字符串中的所有位数都被遍历完毕。

四、实验步骤1. 定义编码和解码的结构体以及相关变量;3. 遍历哈夫曼树,得到每个字符的哈夫曼编码,并将编码保存到映射表中;4. 将文本中的每个字符用其对应的哈夫曼编码替换掉,并将编码字符串写入到文件中;5. 使用哈夫曼编码重新构造文本,并将结果输出到文件中。

五、实验总结通过本次实验,我掌握了哈夫曼树的创建和哈夫曼编码的实现方法,也学会了如何用C++语言来组织程序结构,实现哈夫曼编码和解码。

哈夫曼树实验报告 (2)

哈夫曼树实验报告 (2)

三、实验要求
设计思路: 数据结构: #define n 100‫ﻩﻩ‬//叶子结点数 #define m 2*n-1// Huffman 树中结点总数 typedef struct {
‫ ﻩ‬int weight; //权值 ‫ ﻩ‬int lchild , rchild , parent; //左右孩子及双亲指针
scanf ("%d",w+i);
HuffmanCoding(HT,HC,w,n);
for(i=1;i<=n;i++){
printf("对应得编码为:");
puts(HC[i]);}
}
}
//****从叶子到根逆向求每个字符得赫夫曼编码****
HC=(HuffmanCode)malloc((n+1)*sizeof(char*));//分配n个字符编码得头指针向量
cd=(char*)malloc(n*sizeof(char));
//分配求编码得工作区间
cd[n-1]='\0';
//编码结束符
else cd[--start]='1';
HC[i]=(char *)malloc((n-start)*sizeof(char)); //为第i个字符编码分配空间
strcpy(HC[i],&cd[start]);
//从 cd 复制编码(串)到 HC

free(cd);
//释放空间

void main()
for(i=1;i<=n;++i)
//逐个字符求赫夫曼树编码
{ int start;
start=n-1;
//编码结束符位置

数据结构课程设计报告-哈夫曼树

数据结构课程设计报告-哈夫曼树

计算机科学学院数据结构课程设计题目:基于哈夫曼树的文件压缩/解压程序学生姓名:***学号:************专业:计算机科学与技术班级:12级(2)班指导教师姓名及职称:陈明讲师起止时间:2014 年3 月——2014 年4 月1 需求分析1.1课题背景及意义近年来,随着计算机技术的发展,多媒体计算机技术、计算机网络技术以及现代多媒体通信技术正在向着信息化、高速化、智能化迅速发展。

各个领域的应用与发展,各个系统的数据量越来越大,给数据的存储、传输以及有效、快速获取信息带来了严重的障碍。

数据压缩技术能够比较有效地解决这个问题。

还有在最近几年中兴起的物联网和云计算都是对海量的数据进行处理和传输的,如果不对数据进行压缩,那么数据传输所需的带宽要求就很高,物理成本上也随之上升。

所以说数据压缩在计算机通信中占有很重要的位置,且涉及领域多,应用广泛,与我们的生活息息相关。

1.2课题要求1.2.1.实现一个基于哈夫曼树的文件压缩程序和文件解压程序。

1.2.2.压缩程序能输入源文件进行压缩,输出压缩文件;1.2.3.解压程序读入压缩文件,根据相应的哈夫曼编码解压还原,得到对应的源文件。

1.2.4.可选做:求出压缩率;打印哈夫曼树;对文件夹压缩;图形图形化窗口操作界面。

1.3任务和要求1.3.1选择1时:输入一个待压缩的文本文件名称(可带路径)。

如:D:\1\XXX.txt压缩文件名称= D:\1\XXX.zip1.3.2选择2时:输入一个待解压的压缩文件名称(可带路径)。

如:D:\1\YYY.txt解压文件名称=D:\1\YYY.zip2概要设计2.1问题解决的思路概述图1 主程序流程图2.2 算法思想:2.2.1输入要压缩的文件首先运行的时候,用户主界面上有菜单提示该如何使用软件,根据菜单提示选择所要执行的项,依次进行,因为各个环节之间有先后顺序。

第一步为输入压缩软件的名称,由键盘输入文件路径和文件名称,读入字符数组中,打开该文件,按照提示进行压缩。

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

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

数据结构课程设计报告题目:哈夫曼编/译码器院(系):计算机工程学院专业:信息与计算科学班级:0902学生:陈辉指导教师:2010年12月目录1实验目的 (2)2概要设计 (2)2.1 总体功能结构 (2)2.2 数据结构设计 (4)2.3 方法及原理 (5)3详细设计和实现 (6)3.1 创建Huffman树 (6)3.2 编码 (9)3.3 译码 (11)4调试与操作说明 (13)总结 (16)1实验目的设计一个利用哈夫曼算法的编码和译码系统,重复地显示并处理以下项目,直到选择退出为止。

【基本要求】(1)初始化:键盘输入字符集大小n、n个字符和n个权值,建立哈夫曼树;(2)编码:利用建好的哈夫曼树生成哈夫曼编码;(3)输出编码;(4)译码功能;(5)设字符集及频度如下表:字符空格 A B C D E F G H I J K L M N O P Q R S T U V W X Y Z频度 186 64 13 22 32 103 21 15 47 57 1 5 32 20 57 63 15 1 48 51 80 23 8 18 1 16 1通过此次课程设计主要达到以下目的:1.了解并掌握数据结构与算法的设计方法,具备初步的独立分析和设计能力;2.初步掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能;3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力;4.训练用系统的观点和软件开发一般规范进行软件开发,培养软件工作者所应具备的科学的工作方法和作风。

本程序采用Visual C++编程实现。

2概要设计2.1 总体功能结构本程序的主要功能是实现对用户输入的字符编码,然后再把编码结果翻译成原字符。

但在进行这些操作之前必须做一项工作,就是创建Huffman树。

哈夫曼树又称最优二叉树,是一种带权路径长度最短的二叉树。

所谓树的带权路径长度,就是树中所有的叶结点的权值乘上其到根结点的路径长度(若根结点为0层,叶结点到根结点的路径长度为叶结点的层数)。

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

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

数据结构课程设计实验报告哈夫曼树的应用计算机学院信管专业数据结构课程设计题目:哈夫曼树的应用班级:姓名:学号:同组人姓名:起迄日期:课程设计地点:指导教师:完成日期:2012年12月目录一、需求分析 (3)二、概要设计 (4)三、详细设计 (6)四、调试分析和测试结果 (7)五、心得体会和总结 (10)六、参考文献 (10)七、附录 (11)一、需求分析(一)实验要求要求用到数据结构课上学到的线性表的知识,所以就要充分而清晰的理解关于线性表的知识。

要求实现的基本功能很简单,只有删除和插入,增加功能也不过是加上修改。

这些在数据结构课上已经讲过,只要能够理解关于线性表的几个相关的基本算法就可以了。

问题是将输入的信息保存入文件和从文件输出。

这里基本是自学的内容,而且要考虑到是否要自行选择保存的磁盘。

综上,做这个课题,要具备的知识就是线性表的基本算法,文件的保存和读取算法,必要的C或者C++知识(本次我将使用C++实现),以及丰富的程序调适经验。

(二)实验任务一个完整的系统应具有以下功能:功能1.从终端读入字符集大小n,以及n个字符和n个权值,建立哈夫曼树并将它存于文件hfmTree中.将已在内存中的哈夫曼树以直观的方式(比如树)显示在终端上;功能2.利用已经建好的哈夫曼树(如不在内存,则从文件htmTree中读入),对文件ToBeTran中的正文进行编码,然后将结果存入文件CodeFile中,并输出结果,将文件CodeFile以紧凑格式先是在终端上,每行50个代码。

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

功能3.利用已建好的哈夫曼树将文件CodeFile中的代码进行译码,结果存入文件TextFile中,并输出结果。

(三)实验步骤分步实施:1)初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;2)完成最低要求:完成功能1;3)进一步要求:完成功能2和3。

有兴趣的同学可以自己扩充系统功能。

哈弗曼树实验报告(3篇)

哈弗曼树实验报告(3篇)

一、实验目的1. 理解并掌握哈弗曼树的构建原理。

2. 学会使用哈弗曼树进行数据编码和解码。

3. 了解哈弗曼编码在数据压缩中的应用。

二、实验原理哈弗曼树(Huffman Tree)是一种带权路径长度最短的二叉树,用于数据压缩。

其基本原理是:将待编码的字符集合按照出现频率从高到低排序,构造一棵二叉树,使得叶子节点代表字符,内部节点代表编码,权值代表字符出现的频率。

通过这棵树,可以生成每个字符的编码,使得编码的平均长度最小。

三、实验环境1. 操作系统:Windows 102. 编程语言:C++3. 开发工具:Visual Studio 2019四、实验步骤1. 构建哈弗曼树(1)创建一个结构体`HuffmanNode`,包含字符、权值、左子树和右子树指针。

```cppstruct HuffmanNode {char data;int weight;HuffmanNode left;HuffmanNode right;};(2)定义一个函数`HuffmanTree()`,用于创建哈弗曼树。

```cppHuffmanNode HuffmanTree(std::vector<char>& chars, std::vector<int>& weights) {// 创建初始二叉树std::vector<HuffmanNode> trees;for (int i = 0; i < chars.size(); ++i) {trees.push_back(new HuffmanNode{chars[i], weights[i], nullptr, nullptr});}// 构建哈弗曼树while (trees.size() > 1) {// 选择两个权值最小的节点auto it1 = std::min_element(trees.begin(), trees.end(),[](HuffmanNode a, HuffmanNode b) {return a->weight < b->weight;});auto it2 = std::next(it1);HuffmanNode parent = new HuffmanNode{0, it1->weight + it2->weight, it1, it2};// 删除两个子节点trees.erase(it1);trees.erase(it2);// 将父节点添加到二叉树集合中trees.push_back(parent);}// 返回哈弗曼树根节点return trees[0];}```2. 生成哈弗曼编码(1)定义一个函数`GenerateCodes()`,用于生成哈弗曼编码。

数据结构实验报告(哈夫曼树)

数据结构实验报告(哈夫曼树)

数据结构实验报告实验题目:Huffman编码与解码姓名:学号:院系:实验名称:Huffman编码与解码实验问题描述:本实验需要以菜单形式完成以下功能:1.输入电文串2.统计电文串中各个字符及其出现的次数3.构造哈弗曼树4.进行哈弗曼编码5.将电文翻译成比特流并打印出来6.将比特流还原成电文数据结构的描述:逻辑结构:本实验可用二叉树实现,其逻辑结构为一对二的形式,即一个结点对应两个结点。

在实验过程中我们也应用到了栈的概念。

存储结构:使用结构体来对数据进行存储:typedef struct{int weight;int parent,lc,rc;}HTNode,*HuffmanTree;typedef struct LNode{char *elem;int stacksize;int top;}SqStack;在main函数里面定义一个哈弗曼树并实现上述各种功能。

程序结构的描述:本次实验一共构造了10个函数:1.void HuffTree(HuffmanTree &HT,int n[],int mun);此函数根据给定的mun个权值构建哈弗曼树,n[]用于存放num个权值。

2.void Select(HuffmanTree &HT,int n,int i,int &s1,int &s2);此函数用于在HT[1,i-1]中选择parent为0且weight为最小的两个结点,其下标分别为s1,s2.3.void HuffmanCoding(HuffmanTree HT,char **&HC,int n);此函数从哈弗曼树HT上求得n 个叶子结点的哈弗曼编码并存入数组HC中。

4.void Coding(HuffmanTree HT,char **HC,int root,SqStack &S);此函数用于哈弗曼编码,先序遍历哈弗曼树HT,求得每个叶子结点的编码字符串,存入数组HC,S为一个顺序栈,用来记录遍历路径,root是哈弗曼数组HT中根结点的位置下标。

数据结构哈夫曼树实验报告

数据结构哈夫曼树实验报告

数据结构哈夫曼树实验报告一、实验目的本次实验的主要目的是深入理解和掌握哈夫曼树的数据结构及其相关算法,并通过实际编程实现来提高对数据结构的应用能力和编程技能。

二、实验环境本次实验使用的编程环境为具体编程语言名称,操作系统为具体操作系统名称。

三、实验原理哈夫曼树,又称最优二叉树,是一种带权路径长度最短的二叉树。

其基本原理是通过构建一棵二叉树,使得权值较大的节点距离根节点较近,权值较小的节点距离根节点较远,从而达到带权路径长度最小的目的。

在构建哈夫曼树的过程中,首先需要将所有的节点按照权值从小到大进行排序。

然后,选取权值最小的两个节点作为左右子树,构建一个新的父节点,该父节点的权值为左右子节点权值之和。

重复这个过程,直到所有的节点都被构建到哈夫曼树中。

哈夫曼编码是基于哈夫曼树的一种编码方式。

对于每个叶子节点,从根节点到该叶子节点的路径上,向左的分支编码为 0,向右的分支编码为 1,这样就可以得到每个叶子节点的哈夫曼编码。

四、实验步骤1、定义节点结构体```ctypedef struct HuffmanNode {char data;int weight;struct HuffmanNode left;struct HuffmanNode right;} HuffmanNode;```2、实现节点排序函数```cvoid sortNodes(HuffmanNode nodes, int n) {for (int i = 0; i < n 1; i++){for (int j = 0; j < n i 1; j++){if (nodesj>weight > nodesj + 1>weight) {HuffmanNode temp = nodesj;nodesj = nodesj + 1;nodesj + 1 = temp;}}}}```3、构建哈夫曼树```cHuffmanNode buildHuffmanTree(HuffmanNode nodes, int n) {while (n > 1) {sortNodes(nodes, n);HuffmanNode left = nodes0;HuffmanNode right = nodes1;HuffmanNode parent =(HuffmanNode )malloc(sizeof(HuffmanNode));parent>data ='\0';parent>weight = left>weight + right>weight;parent>left = left;parent>right = right;nodes0 = parent;nodes1 = nodesn 1;n;}return nodes0;}```4、生成哈夫曼编码```cvoid generateHuffmanCodes(HuffmanNode root, int codes, int index) {if (root>left) {codesindex = 0;generateHuffmanCodes(root>left, codes, index + 1);}if (root>right) {codesindex = 1;generateHuffmanCodes(root>right, codes, index + 1);}if (!root>left &&!root>right) {printf("%c: ", root>data);for (int i = 0; i < index; i++){printf("%d", codesi);}printf("\n");}}```5、主函数```cint main(){HuffmanNode nodes5 ={(HuffmanNode )malloc(sizeof(HuffmanNode)),(HuffmanNode )malloc(sizeof(HuffmanNode)),(HuffmanNode )malloc(sizeof(HuffmanNode)),(HuffmanNode )malloc(sizeof(HuffmanNode)),(HuffmanNode )malloc(sizeof(HuffmanNode))};nodes0>data ='A';nodes0>weight = 5;nodes1>data ='B';nodes1>weight = 9;nodes2>data ='C';nodes2>weight = 12;nodes3>data ='D';nodes3>weight = 13;nodes4>data ='E';nodes4>weight = 16;HuffmanNode root = buildHuffmanTree(nodes, 5);int codes100;generateHuffmanCodes(root, codes, 0);return 0;}```五、实验结果与分析通过运行上述程序,得到了每个字符的哈夫曼编码:A: 00B: 01C: 10D: 110E: 111分析实验结果可以发现,权值较小的字符A 和B 对应的编码较短,而权值较大的字符D 和E 对应的编码较长。

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

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

数据结构课程设计报告实验二哈夫曼编码目录一.问题描述及分析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执行提示:输入所要编码的文本文件。

数据结构实验三哈夫曼树实验报告

数据结构实验三哈夫曼树实验报告

题目:哈夫曼编/译码器一、题目要求:写一个哈夫曼码的编/译码系统,要求能对要传输的报文进行编码和解码。

构造哈夫曼树时,权值小的放左子树,权值大的放右子树,编码时右子树编码为1,左子树编码为0.二、概要设计:数据结构:typedef struct{int bit[MAXBIT];int start;} HCodeType; /* 编码结构体 */typedef struct{int weight;int parent;int lchild;int rchild;char value;} HNode; /* 结点结构体 */函数:void DEMONHuffmanTree (HNode HuffNode[MAXNODE], int n)作用:构造一个哈夫曼树,并循环构建int main ()作用:运用已经构建好的哈弗曼树,进行节点的处理,达到成功解码编译三、详细设计:哈夫曼树的建立:void DEMONHuffmanTree (HNode HuffNode[MAXNODE], int n){int i = 0, j, m1, m2, x1, x2;char x;/* 初始化存放哈夫曼树数组 HuffNode[] 中的结点 */while (i<n){HuffNode[i].weight = 0;arent =-1;HuffNode[i].lchild =-1;HuffNode[i].rchild =-1;scanf("%c",&x);scanf("%c",&HuffNode[i].value); eight);}for (i=n; i<2*n-1; i++){HuffNode[i].weight = 0;arent =-1;HuffNode[i].lchild =-1;HuffNode[i].rchild =-1;HuffNode[i].value=i;}/* 循环构造 Huffman 树 */for (i=0; i<n-1; i++){m1=m2=MAXQZ; eight < m1 && HuffNode[j].parent==-1){m2=m1;eight;x1=j;}else if (HuffNode[j].weight < m2 && HuffNode[j].parent==-1) {m2=HuffNode[j].weight;x2=j;}} /* end for *//* 设置找到的两个子结点 x1、x2 的父结点信息 */HuffNode[x1].parent = n+i;HuffNode[x2].parent = n+i;HuffNode[n+i].weight = HuffNode[x1].weight + HuffNode[x2].weight; HuffNode[n+i].lchild = x1;HuffNode[n+i].rchild = x2;}}叶子节点的哈夫曼编码的保存:for (j=+1; j<n; j++)HuffCode[i].bit[j] = [j];HuffCode[i].start = ;主函数展示:int main(){HNode HuffNode[MAXNODE];HCodeType HuffCode[MAXLEAF],cd;int i, j, c, p, n,k=0;char wen[100];char z;scanf ("%d", &n);HuffmanTree (HuffNode, n);for (i=0; i < n; i++){= n-1;c = i;p = HuffNode[c].parent;while (p != -1) /* 父结点存在 */{if (HuffNode[p].lchild == c)[] = 0;else[] = 1;; /* 求编码的低一位 */c=p;p=HuffNode[c].parent; /* 设置下一循环条件 */ } /* end while */for (j=+1; j<n; j++)HuffCode[i].bit[j] = [j];HuffCode[i].start = ;} /* end for */z=getchar();z=getchar();for(;z!='\n';z=getchar()){wen[k++]=z;for(i=0;i<n;i++){if(z==HuffNode[i].value){for (j=HuffCode[i].start+1; j < n; j++)printf ("%d", HuffCode[i].bit[j]);break;}else;}}printf("\n");for(i=0;i<k;i++){printf("%c",wen[i]);}printf("\n");return 0;}四、调试分析与心得体会:虽然哈夫曼树的建立有书上的参考,但是实际写整个代码的时候还是问题重重。

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

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

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

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

设计原理及实现方法:本设计主要包括以下几个步骤: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)。

计算机科学与技术学院课程设计说明书题目:双向循环链表操作的实现哈夫曼树课程:数据结构院(部):计算机科学与技术学院专业:班级:学生姓名:学号:指导教师:完成日期: 2016/12/29目录课程设计任务书一 (I)课程设计任务书二............................................... I I 双向循环链表操作的实现 (3)一、问题描述 (3)二、数据结构 (4)三、逻辑设计 (6)四、编码 (6)五、测试数据 (7)六、测试情况 (10)所选题目........................................ 错误!未定义书签。

一、问题描述 (11)二、数据结构 (11)三、逻辑设计 (11)四、编码 (12)五、测试数据 (15)六、测试情况 (16)结论 (18)参考文献 (23)课程设计指导教师评语 (24)课程设计任务书一课程设计任务书二指导教师(签字):教研室主任(签字)双向循环链表操作的实现一、问题描述1、建表Head2、插入3、删除4、就地逆置二、数据结构建表public Create(int n) throws Exception {this();Scanner sc = new Scanner(System.in);for (int j = 0; j < n; j++)insert(n, sc.next());}插入public void insert(int i, Object x) throws Exception { Node p = head.next;int j = 0;while (!p.equals(head) && j < i) {p = p.next;j++;}if (j != i && !p.equals(head))throw new Exception("插入位置不对");Node s = new Node(x);p.pr.next=s;s.pr=p.pr;s.next=p;p.pr=s;}删除public void remove(int i) throws Exception {Node p = head.next;int j = 0;while (!p.equals(head) && j < i) {p = p.next;++j;}if (j != i)throw new Exception("删除位置不对");p.pr.next=p.next;p.next.pr=p.pr;}返回元素public Object get(int i) throws Exception {Node p = head.next;int j = 0;while (!p.equals(head) && j < i) {p = p.next;++j;}if (j > i || p.equals(head)) {throw new Exception("第" + i + "个元素不在");}return p.data;}计算长度public int length() {Node p = head.next;int length = 0;while (!p.equals(head)) {p = p.next;++length;}return length;}查找位置public int indexOf(Object x) {Node p = head.next;int j = 0;while (!p.equals(head) && !p.data.equals(x)) { p = p.next;++j;}if (!p.equals(head))return j;elsereturn -1;}遍历public void display() {Node node = head.next;while (!node.equals(head)) {System.out.print(node.data + " ");node = node.next;}System.out.println();}就地逆置public void trs(){Node p=head.next;while(p!=head){Node q=p;Node r=p.next;q.next=q.pr;q.pr=r;p=p.pr;}Node s=head.pr;head.pr=head.next;head.next=s;}三、逻辑设计1、思路:(1)建立节点类Node,定义data、pr、next;(2)建立一个空双向链表;(3)向空双向链表中存入元素值(4)利用insert、remove等方法对链表进行操作;(5)建立main方法,并捕获抛出的异常。

(2) creat()方法:建立一个空链表;(3) creat(int)方法:在空链表的基础上建立一个链表;(4) Insert(int,object)方法:在双向链表中指定位置插入指定的结点;(5) Remove(int)方法:删除指定的位置的结点;(6) Length()方法:链表求长;(7) Get(int)取出某个位置的结点;(8)trs():链表的就地逆置;(9) indexof():返回元素x第一次出现在双向循环链表中的位置号;(10)Display():显示当前的双向链表;(11)Main():主函数。

四、编码package One;import java.util.Scanner;class Node {public Object data;public Node pr;public Node next;public Node() {this(null);}public Node(Object data) {this.data = data;this.pr = null;this.next = null;}}public class Create {public Node head;public Create() {head = new Node();head.pr=head;head.next=head;}// 尾插法public Create(int n) throws Exception {this();Scanner sc = new Scanner(System.in);for (int j = 0; j < n; j++)insert(n, sc.next());}public void insert(int i, Object x) throws Exception { Node p = head.next;int j = 0;while (!p.equals(head) && j < i) {p = p.next;j++;}if (j != i && !p.equals(head))throw new Exception("插入位置不对");Node s = new Node(x);p.pr.next=s;s.pr=p.pr;s.next=p;p.pr=s;}public void remove(int i) throws Exception { Node p = head.next;int j = 0;while (!p.equals(head) && j < i) {p = p.next;++j;}if (j != i)throw new Exception("删除位置不对");p.pr.next=p.next;p.next.pr=p.pr;}public Object get(int i) throws Exception { Node p = head.next;int j = 0;while (!p.equals(head) && j < i) {p = p.next;++j;}if (j > i || p.equals(head)) {throw new Exception("第" + i + "个元素不在");}return p.data;}public int length() {Node p = head.next;int length = 0;while (!p.equals(head)) {p = p.next;++length;}return length;}public int indexOf(Object x) {Node p = head.next;int j = 0;while (!p.equals(head) && !p.data.equals(x)) { p = p.next;++j;}if (!p.equals(head))return j;elsereturn -1;}public void display() {Node node = head.next;while (!node.equals(head)) {System.out.print(node.data + " ");node = node.next;}System.out.println();}public void trs(){Node p=head.next;while(p!=head){Node q=p;Node r=p.next;q.next=q.pr;q.pr=r;p=p.pr;}Node s=head.pr;head.pr=head.next;head.next=s;}}package One;import java.util.Scanner;public class run {public static void main(String[] args) throws Exception { System.out.println("请输入双向循环链表的元素:");Create D = new Create(3);// 建立一个表长为3的单链表D.display();System.out.println("请输入插入表的位置:");Scanner si = new Scanner(System.in);int i=si.nextInt();System.out.println("请输入插入表的值:");Scanner sx = new Scanner(System.in);String x=sx.next();D.insert(i,x);D.display();System.out.println("请输入取出元素的位置:");Scanner sri = new Scanner(System.in);System.out.println(D.get(sri.nextInt()));System.out.println("请输入需要找第一次出现位置的元素");Scanner srw = new Scanner(System.in);System.out.println(D.indexOf(srw.next()));System.out.println("双向链表的长度为:"+D.length());System.out.println("表里全部的元素:");D.display();D.trs();D.display();}}五、测试数据六、测试情况所选题目一、问题描述对输入的一串电文字符实现哈夫曼编码,并对给定的代码串进行译码,输出电文字符串。

相关文档
最新文档