数据结构 实验七
数据结构图的实验报告
数据结构图的实验报告数据结构图的实验报告引言:数据结构图是计算机科学中重要的概念之一。
它是一种用图形表示数据元素之间关系的数据结构,广泛应用于算法设计、程序开发和系统优化等领域。
本实验报告旨在介绍数据结构图的基本原理、实验过程和结果分析。
一、实验目的本次实验的主要目的是掌握数据结构图的基本概念和操作方法,以及通过实验验证其在解决实际问题中的有效性。
具体而言,我们将通过构建一个社交网络关系图,实现对用户关系的管理和分析。
二、实验方法1. 确定数据结构在本次实验中,我们选择了无向图作为数据结构图的基础。
无向图由顶点集和边集组成,每条边连接两个顶点,且没有方向性。
2. 数据输入为了模拟真实的社交网络,我们首先需要输入一组用户的基本信息,如姓名、年龄、性别等。
然后,根据用户之间的关系建立边,表示用户之间的交流和联系。
3. 数据操作基于构建好的数据结构图,我们可以进行多种操作,如添加用户、删除用户、查询用户关系等。
这些操作将通过图的遍历、搜索和排序等算法实现。
三、实验过程1. 数据输入我们首先创建一个空的无向图,并通过用户输入的方式逐步添加用户和用户关系。
例如,我们可以输入用户A和用户B的姓名、年龄和性别,并建立一条边连接这两个用户。
2. 数据操作在构建好数据结构图后,我们可以进行多种操作。
例如,我们可以通过深度优先搜索算法遍历整个图,查找与某个用户具有特定关系的用户。
我们也可以通过广度优先搜索算法计算某个用户的社交网络影响力,即与该用户直接或间接相连的其他用户数量。
3. 结果分析通过实验,我们可以观察到数据结构图在管理和分析用户关系方面的优势。
它能够快速地找到用户之间的关系,帮助我们了解用户的社交网络结构和影响力。
同时,数据结构图也为我们提供了一种可视化的方式来展示用户之间的关系,使得分析更加直观和易于理解。
四、实验结果通过实验,我们成功构建了一个社交网络关系图,并实现了多种数据操作。
我们可以根据用户的姓名、年龄和性别等信息进行查询,也可以根据用户之间的关系进行遍历和排序。
数据结构实验
数据结构实验数据结构实验是计算机科学与技术专业的重要课程之一。
通过对这门课程的学习和实验,可以让学生深入了解数据结构在计算机科学中的重要性和应用。
一、实验的目的与意义数据结构实验的主要目的是帮助学生更深入地理解数据结构在计算机科学中的应用。
在实验中,学生可以通过编写代码和执行各种数据结构算法来更好地理解数据结构的实现原理。
通过实验,学生可以更清楚地了解算法的效率、时间复杂度和空间复杂度等概念。
此外,数据结构实验也有助于提高学生的编程能力。
在实验中,学生需要编写具有规范的代码,确保算法的正确性,同时还需要处理大量的数据,这可以提高学生的编程能力和耐心。
二、实验内容简介数据结构实验通常包括以下几个方面的内容:1.线性结构:顺序存储和链式存储线性表、栈、队列等。
2.非线性结构:数组、链表、二叉树等。
3.查找算法:顺序查找、二分查找、哈希查找等。
4.排序算法:插入排序、选择排序、归并排序、堆排序等。
5.图论算法:图的遍历、最短路径、最小生成树等。
6.字符串算法:KMP算法、BM算法等。
三、实验中的具体操作实验中的具体操作是根据具体的算法和数据结构来进行的。
以下是一个简单的例子:线性表的实验假设学生已经学习了顺序存储结构和链式存储结构的操作,以下是在实验中需要进行的具体操作:1.顺序存储结构创建一个空的顺序表插入一个元素到指定位置删除一个元素查找指定元素的位置输出顺序表的所有元素2.链式存储结构创建一个空的链表插入一个元素到指定位置删除一个元素查找指定元素的位置输出链表的所有元素在实验中,学生需要将这些操作封装成具体的函数,并且通过调用这些函数来实现对线性表的操作。
同时,学生还需要进行大量的测试和调试,以保证代码的正确性和实验的效果。
四、实验中的注意事项在进行数据结构实验时,学生需要注意以下几个方面:1.理论和实验相结合:不仅要理解理论知识,还要进行实验操作,才能更好地掌握数据结构。
2.代码规范:要写出规范、可读性强的代码,让他人容易理解。
数据结构实训实验报告
一、实验背景数据结构是计算机科学中一个重要的基础学科,它研究如何有效地组织和存储数据,并实现对数据的检索、插入、删除等操作。
为了更好地理解数据结构的概念和原理,我们进行了一次数据结构实训实验,通过实际操作来加深对数据结构的认识。
二、实验目的1. 掌握常见数据结构(如线性表、栈、队列、树、图等)的定义、特点及操作方法。
2. 熟练运用数据结构解决实际问题,提高算法设计能力。
3. 培养团队合作精神,提高实验报告撰写能力。
三、实验内容本次实验主要包括以下内容:1. 线性表(1)实现线性表的顺序存储和链式存储。
(2)实现线性表的插入、删除、查找等操作。
2. 栈与队列(1)实现栈的顺序存储和链式存储。
(2)实现栈的入栈、出栈、判断栈空等操作。
(3)实现队列的顺序存储和链式存储。
(4)实现队列的入队、出队、判断队空等操作。
3. 树与图(1)实现二叉树的顺序存储和链式存储。
(2)实现二叉树的遍历、查找、插入、删除等操作。
(3)实现图的邻接矩阵和邻接表存储。
(4)实现图的深度优先遍历和广度优先遍历。
4. 算法设计与应用(1)实现冒泡排序、选择排序、插入排序等基本排序算法。
(2)实现二分查找算法。
(3)设计并实现一个简单的学生成绩管理系统。
四、实验步骤1. 熟悉实验要求,明确实验目的和内容。
2. 编写代码实现实验内容,对每个数据结构进行测试。
3. 对实验结果进行分析,总结实验过程中的问题和经验。
4. 撰写实验报告,包括实验目的、内容、步骤、结果分析等。
五、实验结果与分析1. 线性表(1)顺序存储的线性表实现简单,但插入和删除操作效率较低。
(2)链式存储的线性表插入和删除操作效率较高,但存储空间占用较大。
2. 栈与队列(1)栈和队列的顺序存储和链式存储实现简单,但顺序存储空间利用率较低。
(2)栈和队列的入栈、出队、判断空等操作实现简单,但需要考虑数据结构的边界条件。
3. 树与图(1)二叉树和图的存储结构实现复杂,但能够有效地表示和处理数据。
数据结构图实验报告
数据结构图实验报告数据结构图实验报告1. 引言数据结构是计算机科学中的重要概念之一,它研究数据的组织、存储和管理方式。
图作为一种重要的数据结构,广泛应用于各个领域,如网络拓扑、社交网络分析等。
本实验旨在通过实际操作,深入理解数据结构图的基本概念和操作。
2. 实验目的本实验的主要目的是掌握图的基本概念和相关操作,包括图的创建、遍历、搜索和最短路径算法等。
3. 实验环境本实验使用C++语言进行编程,采用图的邻接矩阵表示法进行实现。
4. 实验内容4.1 图的创建在实验中,我们首先需要创建一个图。
通过读取输入文件中的数据,我们可以获得图的顶点数和边数,并根据这些信息创建一个空的图。
4.2 图的遍历图的遍历是指从图的某个顶点出发,按照一定的规则依次访问图中的其他顶点。
常用的图的遍历算法有深度优先搜索(DFS)和广度优先搜索(BFS)。
我们可以通过实验来比较这两种遍历算法的效率和应用场景。
4.3 图的搜索图的搜索是指从图的某个顶点出发,找到与之相关的特定顶点或边。
常用的图的搜索算法有深度优先搜索和广度优先搜索。
在实验中,我们可以通过输入特定的顶点或边,来观察图的搜索算法的执行过程和结果。
4.4 图的最短路径算法图的最短路径算法是指在图中找到两个顶点之间的最短路径。
常用的最短路径算法有迪杰斯特拉算法和弗洛伊德算法。
通过实验,我们可以比较这两种算法的执行效率和应用场景。
5. 实验结果与分析通过实验,我们可以得到以下结论:- 图的邻接矩阵表示法在创建和操作图的过程中具有较高的效率。
- 深度优先搜索算法适用于查找图中的连通分量和回路等问题。
- 广度优先搜索算法适用于查找图中的最短路径和最小生成树等问题。
- 迪杰斯特拉算法适用于求解单源最短路径问题,而弗洛伊德算法适用于求解多源最短路径问题。
6. 实验总结通过本次实验,我们深入学习了数据结构图的基本概念和相关操作。
图作为一种重要的数据结构,具有广泛的应用价值。
在今后的学习和工作中,我们可以运用所学的知识,解决实际问题,提高工作效率。
数据结构 实验
数据结构实验1-引言本文档旨在详细介绍数据结构实验的内容、目的、方法和结果分析。
本实验旨在通过实践操作,加深对数据结构相关概念和算法的理解,并掌握其应用能力。
2-实验背景在这一部分,介绍数据结构的基本概念和相关背景知识,包括但不限于以下内容:●数据结构的定义和分类●相关算法的基本原理和应用场景●实验所涉及的数据结构和算法的基本特点和使用方法3-实验目的明确实验的目标和意义,包括:●掌握特定数据结构的基本操作和算法●理解和应用相关数据结构的特性与优势●通过实验验证和分析数据结构与算法的效率和性能4-实验准备●需要的实验设备和环境●相关程序和算法的准备●实验中所用到的数据集合和数据样本●关键参数和变量的说明和定义5-实验步骤这一部分详细描述实验的步骤和操作流程,包括但不限于以下内容:5-1 数据结构的初始化步骤1:…步骤2:…5-2 数据结构的插入操作步骤1:…步骤2:…5-3 数据结构的删除操作步骤1:…步骤2:…5-4 数据结构的查找操作步骤1:…步骤2:…5-5 数据结构的排序操作步骤1:…步骤2:…6-实验结果分析根据实验步骤和操作,详细分析实验结果,包括但不限于以下内容:●运行时间、内存占用等性能指标的分析●数据结构操作的正确性和有效性分析●不同数据集合和数据样本的测试结果对比7-结论总结实验的结果和分析,明确实验是否达到预期目标。
并提出对进一步改进和优化的建议。
8-附件列出实验中使用到的附件,包括但不限于以下内容:●程序代码文件●数据集合和数据样本文件●实验结果数据表格或截图9-法律名词及注释列出文档中涉及的法律名词和相关解释,以确保文档内容的准确性和合规性。
数据结构实验报告
数据结构实验报告一、实验目的本实验旨在通过对数据结构的学习和实践,掌握基本的数据结构概念、原理及其应用,培养学生的问题分析与解决能力,提升编程实践能力。
二、实验背景数据结构是计算机科学中的重要基础,它研究数据的存储方式和组织形式,以及数据之间的关系和操作方法。
在软件开发过程中,合理选用和使用数据结构,能够提高算法效率,优化内存利用,提升软件系统的性能和稳定性。
三、实验内容本次实验主要涉及以下几个方面的内容:1.线性表的基本操作:包括线性表的创建、插入、删除、查找、修改等操作。
通过编程实现不同线性表的操作,掌握它们的原理和实现方法。
2.栈和队列的应用:栈和队列是常用的数据结构,通过实现栈和队列的基本操作,学会如何解决实际问题。
例如,利用栈实现括号匹配,利用队列实现银行排队等。
3.递归和回溯算法:递归和回溯是解决很多求解问题的常用方法。
通过编程实现递归和回溯算法,理解它们的思想和应用场景。
4.树和二叉树的遍历:学习树和二叉树的遍历方法,包括前序、中序和后序遍历。
通过编程实现这些遍历算法,加深对树结构的理解。
5.图的基本算法:学习图的基本存储结构和算法,包括图的遍历、最短路径、最小生成树等。
通过编程实现这些算法,掌握图的基本操作和应用。
四、实验过程1.具体实验内容安排:根据实验要求,准备好所需的编程环境和工具。
根据实验要求逐步完成实验任务,注意记录并整理实验过程中遇到的问题和解决方法。
2.实验数据采集和处理:对于每个实验任务,根据要求采集并整理测试数据,进行相应的数据处理和分析。
记录实验过程中的数据和结果。
3.实验结果展示和分析:将实验结果进行适当的展示,例如表格、图形等形式,分析实验结果的特点和规律。
4.实验总结与反思:总结实验过程和结果,回顾实验中的收获和不足,提出改进意见和建议。
五、实验结果与分析根据实验步骤和要求完成实验任务后,得到了相应的实验结果。
对于每个实验任务,根据实验结果进行适当的分析。
数据结构实验(使用版)
实验一顺序表的应用一.实验目的1、掌握线性表的顺序存储结构的基本操作的实现。
2、设计并实现顺序表的应用程序,提高编程能力。
二.实验内容编写程序实现:1、在原来的顺序表中将顺序表实现逆置。
2、要求顺序表的内容由用户输入,并分别显示出逆置前和逆置后的顺序表。
三.实验设备及实验环境实验设备:微机一台实验环境:C语言运行环境实验二单链表的应用三.实验目的1、掌握线性表的链式存储结构的基本操作的实现。
2、设计并实现单链表的应用程序,提高编程能力。
四.实验内容编写程序实现:1、在原有的单链表中,将单链表实现逆置。
(即不增加新的结点)2、程序要求单链表的内容由用户输入,并分别显示出逆置前和逆置后的单链表。
三.实验设备及实验环境实验设备:微机一台实验环境:C语言运行环境实验三栈和队列的应用一.实验目的1、掌握栈和队列的基本操作的实现。
2、利用栈和队列的特点解决实际问题,提高编程能力。
二.实验内容(1是必做题目,2和3可选其一)编写两个程序分别实现:1、进制之间的转换:如将10进制转换为2进制,10进制数n和要转换的进制d通过键盘输入。
2、利用栈解决火车调度问题,将本来杂乱无章的车厢排成软席(S)在前,硬席(H)在后。
车厢序列通过键盘输入,如HSHSHSSSH,输出SSSSSHHHH。
3、利用队列模拟医院排队系统。
三.实验设备及实验环境实验设备:微机一台实验环境:C语言运行环境实验四二叉树的操作(一)一、实验目的1、熟悉二叉树的概念和存储结构。
2、掌握二叉树的基本操作和实现方法。
二.实验内容1、利用栈并且采用非递归先序算法建立二叉树。
2、要求通过键盘输入二叉树的先序遍历顺序从而建立一棵二叉树。
三.实验设备及实验环境实验设备:微机一台实验环境:C语言运行环境实验五二叉树的基本操作(二)一、实验目的1.熟悉二叉树的遍历方法。
2.掌握非递归中序遍历、先序遍历和后序遍历算法的实现。
二.实验内容(中序非递归遍历必做、先序和后序可选其一)1、在前一实验的基础上,利用栈实现一棵二叉树的非递归遍历。
数据结构实验7
实验七二叉树的建立与遍历一、实验目的1、了解二叉树的定义及基本运算。
2、掌握二叉树的描述方法、特点、性质及存储结构。
3、掌握二叉树的基本操作算法。
4、自主设计二叉树建立、遍历等操作的整个程序。
二、实验内容根据建立任意给定的二叉树,并对此二叉树进行前序、中序、后序、层次四种遍历。
基本要求:1)具有二叉树的创建功能;2)可以进行二叉树的四种方式的遍历,遍历方式可由用户选择,遍历结果;3)可统计二叉树中叶子结点、度位2的结点个数及总结点数;4)可在二叉树中查找某一元素;5)通过键盘可以建立任意给定的二叉树,并能完成以上操作控制。
5)自己编写、调试所有功能函数程序。
三、程序设计思路用链式存储结构建立一个二叉树,将二叉树分为根结点、左子树和右子树三部分建立。
二叉树的遍历是指按照某种顺序访问二叉树中的每个结点,使每个结点被访问一次且只被访问一次。
常用的二叉树遍历方法如下:前序遍历:访问次序:根→左→右,中序遍历:访问次序:左→根→右,后序遍历:访问次序:左→右→根层次遍历:访问次序:从上到下、从左到右一层一层进行可按如下格式定义二叉树的链式存储结构:typedef char datatype;typedef struct BiTNode{ datatype data;struct BiTNode *lchild, *rchild;}BiTNode,*BiTree;模块划分:1)void CreateBinTree(BiTree *T):以递归方式建立二叉树;2)void PreOrder(BiTree bt)函数:前序遍历函数;3)void InOrderOut(BiTree T)函数:中序遍历函数;4)void PostOrder(BiTree bt)函数:后序遍历函数;5)void LevelOrder(BiTree bt)函数:层次遍历函数;6)int Allnode(BiTree root)函数:计算总结点个数函数;7)BiTree Search(BiTree bt, datatype x)函数:查找函数;8)int n2(BiTree bt)函数:计算度为2结点个数函数;9)int CountLeaf(BiTree bt)函数:计算叶子结点个数函数。
数据结构(C语言版) 实验报告
数据结构(C语言版) 实验报告数据结构(C语言版) 实验报告第一章引言本实验报告主要介绍了在C语言环境下进行数据结构实验的相关内容。
数据结构是计算机科学中最基础的一门课程,它主要涉及到如何将数据组织和存储以便高效地访问和操作。
本实验报告将按照以下章节进行详细介绍。
第二章实验目的本实验的主要目的是通过实践操作,加深对数据结构的理解,并运用C语言编写相应的数据结构代码。
第三章实验环境1.操作系统:________Windows 102.编程语言:________C语言3.开发工具:________Visual Studio Code第四章实验内容1.线性表1.1 顺序表的实现1.1.1 初始化线性表1.1.2 插入操作1.1.3 删除操作1.1.4 查找操作1.2 链表的实现1.2.1 单链表的创建和遍历1.2.2 单链表的插入和删除操作 1.2.3 单链表的反转1.3 栈1.3.1 栈的实现1.3.2 栈的应用1.4 队列1.4.1 队列的实现1.4.2 队列的应用2.树2.1 二叉树的实现2.1.1 二叉树的创建和遍历2.1.2 二叉树的查找操作2.1.3 二叉树的插入和删除操作2.2 平衡二叉树2.2.1 平衡二叉树的实现2.2.2 平衡二叉树的插入和删除操作 2.3 堆2.3.1 堆的实现2.3.2 堆的操作2.4 哈夫曼树2.4.1 哈夫曼树的构建2.4.2 哈夫曼编码和解码3.图3.1 图的表示方法3.1.1 邻接矩阵3.1.2 邻接表3.2 图的遍历算法3.2.1 深度优先搜索(DFS)3.2.2 广度优先搜索(BFS)3.3 最小树3.3.1 Kruskal算法3.3.2 Prim算法3.4 最短路径3.4.1 Dijkstra算法3.4.2 Floyd算法第五章实验结果本实验通过编写相关的数据结构代码和算法,成功实现了线性表、树和图的基本功能。
经测试,各功能模块能正常运行,并能给出正确的结果。
数据结构图实验报告
1. 了解熟知图的定义和图的基本术语,掌握图的几种存储结构。
2. 掌握邻接矩阵和邻接表定义及特点,并通过实例解析掌握邻接矩阵和邻接表的类型定义。
3. 掌握图的遍历的定义、复杂性分析及应用,并掌握图的遍历方法及其基本思想。
1. 建立无向图的邻接矩阵2. 图的深度优先搜索3. 图的广度优先搜索建立无向图的邻接矩阵:源代码:#include "stdio.h"#include "stdlib.h"#define MAXSIZE 30typedef structchar vertex[MAXSIZE];//顶点为字符型且顶点表的长度小于MAXSIZEint edges[MAXSIZE][MAXSIZE];//边为整形且 edges 为邻近矩阵}MGraph;//MGraph 为采用邻近矩阵存储的图类型void CreatMGraph(MGraph *g,int e,int n){//建立无向图的邻近矩阵 g- >egdes,n 为顶点个数, e 为边数int i,j,k;printf("Input data of vertexs(0~n-1):\n");for(i=0;i<n;i++)g- >vertex[i]=i; //读入顶点信息for(i=0;i<n;i++)for(j=0;j<n;j++)g- >edges[i][j]=0; //初始化邻接矩阵for(k=1;k<=e;k++)//输入 e 条边{printf("Input edges of(i,j):");scanf("%d,%d",&i,&j);g- >edges[i][j]=1;g- >edges[j][i]=1;}void main(){int i,j,n,e;MGraph *g; //建立指向采用邻接矩阵存储图类型指针g=(MGraph*)malloc(sizeof(MGraph));//生成采用邻接举证存储图类型的存储空间printf("Input size of MGraph:"); //输入邻接矩阵的大小scanf("%d",&n);printf("Input number of edge:"); //输入邻接矩阵的边数scanf("%d",&e);CreatMGraph(g,e,n); //生成存储图的邻接矩阵printf("Output MGraph:\n");//输出存储图的邻接矩阵for(i=0;i<n;i++){for(j=0;j<n;j++)printf("%4d",g- >edges[i][j]);printf("\n");}}1) 源代码:#include "stdio.h"#include "stdlib.h"#define MAXSIZE 30typedef struct node//邻接表结点{int adjvex;//邻接点域struct node *next;//指向下一个邻接边结点的指针域}EdgeNode; //邻接表结点类型typedef struct vnode//顶点表结点{int vertex;//顶点域EdgeNode *firstedge; // 指向邻接表第一个邻接边节点的指针域}VertexNode;//顶点表结点类型void CreatAdjlist(VertexNode g[],int e,int n){//建立无向图的邻接表, n 为顶点数, e 为边数, g[]存储 n 个顶点表结点EdgeNode *p;int i,j,k;printf("Input data of vetex(0~n-1);\n");for(i=0;i<n;i++)//建立有 n 个顶点的顶点表{g[i].vertex=i; //读入顶点 i 信息g[i].firstedge=NULL; //初始化指向顶点 i 的邻接表表头指针}for (k=1;k<=e;k++)//输入 e 条边{printf("Input edge of(i,j):");scanf("%d,%d",&i,&j);p=(EdgeNode*)malloc(sizeof(EdgeNode));p- >adjvex=j; //在顶点 vi 的邻接表中添加邻接点为j 的结点p- >next=g[i].firstedge; //插入是在邻接表表头进行的g[i].firstedge=p;p=(EdgeNode*)malloc(sizeof(EdgeNode));p- >adjvex=i; //在顶点 vj 的邻接表中添加邻接点为 i 的结点p- >next=g[j].firstedge; //插入是在邻接表表头进行的g[j].firstedge=p;}}int visited[MAXSIZE]; //MAXSIZE 为大于或者等于无向图顶点个数的常量void DFS(VertexNode g[],int i){EdgeNode *p;printf("%4d",g[i].vertex); //输出顶点 i 信息,即访问顶点 i visited[i]=1;p=g[i].firstedge; //根据顶点 i 的指针 firstedge 查找其邻接表的第一个邻接边结点while(p!=NULL){if(!visited[p- >adjvex]) //如果邻接的这个边结点未被访问过DFS(g,p- >adjvex); //对这个边结点进行深度优先搜索p=p- >next; //查找顶点 i 的下一个邻接边结点}}void DFSTraverse(VertexNode g[],int n){//深度优先搜索遍历以邻接表存储的图,其中 g 为顶点数, n 为顶点个数int i;for(i=0;i<n;i++)visited[i]=0; //访问标志置 0for(i=0;i<n;i++)//对 n 个顶点的图查找未访问过的顶点并由该顶点开始遍历if(!visited[i]) //当 visited[i]等于 0 时即顶点 i 未访问过DFS(g,i); //从未访问过的顶点 i 开始遍历}void main(){int e,n;VertexNode g[MAXSIZE]; //定义顶点表结点类型数组 gprintf("Input number of node:\n");//输入图中节点个数边的个数scanf("%d",&n);printf("Input number of edge:\n");//输入图中边的个数scanf("%d",&e);printf("Make adjlist:\n");CreatAdjlist(g,e,n); //建立无向图的邻接表printf("DFSTraverse:\n");DFSTraverse(g,n); //深度优先遍历以邻接表存储的无向图printf("\n");}1) 源代码:#include "stdio.h"#include "stdlib.h"#define MAXSIZE 30typedef struct node1//邻接表结点{int adjvex; //邻接点域struct node1 *next;//指向下一个邻接边结点的指针域}EdgeNode; //邻接表结点类型typedef struct vnode//顶点表结点{int vertex;//顶点域EdgeNode *firstedge; // 指向邻接表第一个邻接边结点的指针域}VertexNode; //顶点表结点类型void CreatAdjlist(VertexNode g[],int e,int n){ //建立无向图的邻接表,n 为顶点数,e 为边数,g[]存储 n 个顶点表结点EdgeNode *p;int i,j,k;printf("Input data of vetex(0~n-1):\n");for(i=0;i<n;i++) //建立有 n 个顶点的顶点表{g[i].vertex=i; //读入顶点 i 信息g[i].firstedge=NULL; //初始化指向顶点 i 的邻接表表头指针}for(k=1;k<=e;k++) //输入 e 条边{printf("Input edge of(i,j):");scanf("%d,%d",&i,&j);p=(EdgeNode *)malloc(sizeof(EdgeNode));p- >adjvex=j;//在定点 vi 的邻接表中添加邻接点为 j 的结点p- >next=g[i].firstedge;//插入是在邻接表表头进行的g[i].firstedge=p;p=(EdgeNode *)malloc(sizeof(EdgeNode));p- >adjvex=i; //在顶点 vj 的邻接表中添加邻接点为 i 的结点p- >next=g[j].firstedge; //插入是在邻接表表头进行的g[j].firstedge=p;}}typedef struct node{int data;struct node *next;}QNode; //链队列结点的类型typedef struct{QNode *front,*rear; //将头、尾指针纳入到一个结构体的链队列}LQueue; //链队列类型void Init_LQueue(LQueue **q) //创建一个带头结点的空队列{QNode *p;*q=(LQueue *)malloc(sizeof(LQueue)); //申请带头、尾指针的链队列p=(QNode *)malloc(sizeof(QNode)); //申请链队列的头结点p- >next=NULL;//头结点的 next 指针置为空(*q)- >front=p; //队头指针指向头结点(*q)- >rear=p; //队尾指针指向头结点}int Empty_LQueue(LQueue *q) //判队空{if(q- >front==q- >rear) //队为空return 1;elsereturn 0;}void In_LQueue(LQueue *q,int x) //入队{QNode *p;p=(QNode *)malloc(sizeof(QNode)); //申请新链队列结点p- >data=x;p- >next=NULL; //新结点作为队尾结点时其 next 域为空q- >rear- >next=p; //将新结点*p 链到原队尾结点之后q- >rear=p; //使队尾指针指向新的队尾结点*p}void Out_LQueue(LQueue *q,int *x) //出队{QNode *p;if(Empty_LQueue(q))printf("Queue is empty!\n");//对空,出队失败else{p=q- >front- >next; //指针 p 指向链队列第一个数据结点(即对头结点)q- >front- >next=p- >next;//头结点的 next 指针指向链队列第二个数据结点(即删除第一个数据结点)*x=p- >data; //将删除的对头结点数据经由 x 返回free(p);if(q- >front- >next==NULL) //出队后队为空,则置为空q- >rear=q- >front;}}int visited[MAXSIZE]; //MAXSIZE 为大于或者等于无向图顶点个数的常量void BFS(VertexNode g[],LQueue *Q,int i){//广度优先搜索遍历邻接表存储的图,g 为顶点表,Q 为队指针,i 为第 i 个顶点int j,*x=&j;EdgeNode *p;printf("%4d",g[i].vertex); //输出顶点 i 信息,即访问顶点 i visited[i]=1; //置顶点 i 为访问过标志In_LQueue(Q,i); //顶点 i 入队 Qwhile(!Empty_LQueue(Q)) //当队 Q 非空时{Out_LQueue(Q,x); //对头顶点出队并送 j (暂记为顶点 j )p=g[j].firstedge;// 根据顶点 j 的表头指针查找其邻接表的第一个邻接边结点while(p!=NULL){if(!visited[p- >adjvex])//如果邻接的这个边结点未被{printf("%4d",g[p- >adjvex].vertex); // 输出这个邻接边结点的顶点信息visited[p- >adjvex]=1; //置该邻接边结点为访问过标志In_LQueue(Q,p- >adjvex); //将该邻接边结点送人队 Q}p=p- >next;//在顶点j 的邻接表中查找j 的下一个邻接边结点}}}void main(){int e,n;VertexNode g[MAXSIZE];//定义顶点表结点类型数组 gLQueue *q;printf("Input number of node:\n"); //输入图中结点个数scanf("%d",&n);printf("Input number of edge:\n");//输入图中边的个数scanf("%d",&e);printf("Make adjlist:\n ");CreatAdjlist(g,e,n);//建立无向图的邻接表Init_LQueue(&q);//队列 q 初始化printf("BFSTraverse:\n");BFS(g,q,0); //广度优先遍历以邻接表存储的无向图printf("\n");}1.通过本次试验让我对图的遍历以及图的深度和广度优先搜索有了更深刻的记忆和理解,将课本理论的知识得以实践。
数据结构实验七
数据结构实验报告——实验7一、实验目的掌握二叉链表及二叉树的创建、遍历;二、实验内容1、(必做题)假设二叉树中数据元素类型是字符型,请采用二叉链表实现二叉树的以下基本操作:(1)根据二叉树的先序序列和中序序列构造二叉树;(2)根据先序遍历二叉树;(3)根据中序遍历二叉树;(4)根据后序遍历二叉树。
测试数据包括如下错误数据:先序:1234;中序:12345先序:1234;中序:1245先序:1234;中序:42312、(必做题)对于一棵二叉树,请实现:(1)计算二叉树的叶子数目;(2)计算二叉树的深度。
3、(选做题)给定n个权值,请构造它们的最优二叉树(赫夫曼树)。
三、算法描述(采用自然语言描述)1、分别输入n个先序序列和中序序列,先序序列中第一个字符为根节点,在中序序列中找到根节点所在的位置,在根节点左边的为左子树节点,在根节点右边的为右子树节点,然后采用递归的形式依次对左右子树进行构造;二叉树的遍历也是采用递归的形式,先序遍历二叉树:先序遍历根,先序遍历左子树,先序遍历右子树;中序遍历二叉树:中序遍历左子树,中序遍历根,中序遍历右子树;后序遍历二叉树:后序遍历左子树,后序遍历右子树,后序遍历根。
四、详细设计五、程序代码(给出必要注释)1、#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define N 100typedef char ElementType ;typedef struct node{ElementType data ;struct node * leftChild ;struct node * rightChild ;}BTNode;BTNode *createBT(char *pre , char *in ,int n) {BTNode *b;char *p ;int k ;if(n<=0)return NULL;b=(BTNode *)malloc(sizeof(BTNode));b->data = *pre ;int j=0;for(p=in;p<in+n;p++){if(*p == *pre)break;}k=p-in;b->leftChild = createBT(pre+1,in,k);b->rightChild = createBT(pre+1+k,p+1,n-k-1);return b ;void showBTPreOrder(BTNode *b){if(b != NULL){printf("%c ",b->data);showBTPreOrder(b->leftChild);showBTPreOrder(b->rightChild);}}void showBTInOrder(BTNode *b){if(b!=NULL){showBTInOrder(b->leftChild);printf("%c ",b->data);showBTInOrder(b->rightChild);}}void showBTTailOrder(BTNode *b){if(b==NULL)return;showBTTailOrder(b->leftChild);showBTTailOrder(b->rightChild);printf("%c ",b->data);}int main(){char pre[N];char in[N];int n = 0;char ch;BTNode* b=NULL;printf("请输入先序序列\n");while((ch = getchar())&&ch!='\n')pre[n++] = ch;printf("请输入中序序列\n");n = 0;while((ch = getchar())&&ch!='\n')in[n++] = ch;b=createBT(pre,in,n);printf("先序遍历二叉树:\n");showBTPreOrder(b);printf("\n");printf("中序遍历二叉树:\n");showBTInOrder(b);printf("\n");printf("后序遍历二叉树:\n");showBTTailOrder(b);printf("\n");return 0 ;}2、#include <stdio.h>#include <stdlib.h>#include <malloc.h>#define N 100typedef char ElementType ;typedef struct node{ElementType data ;struct node * leftChild ;struct node * rightChild ;}BTNode;BTNode *createBT(char *pre , char *in ,int n) {BTNode *b;char *p ;int k ;if(n<=0)return NULL;b=(BTNode *)malloc(sizeof(BTNode));b->data = *pre ;int j=0;for(p=in;p<in+n;p++){if(*p == *pre)break;}k=p-in;b->leftChild = createBT(pre+1,in,k);b->rightChild = createBT(pre+1+k,p+1,n-k-1);return b ;}int Count(BTNode * top){if(top == NULL){return 0;}else if ((top->leftChild==NULL) && (top->rightChild==NULL)){ return 1;}else{return Count(top->leftChild)+Count(top->rightChild);}}int TreeDepth(BTNode * top){int rightdep=0;int leftdep=0;if(top==NULL)return -1;if(top->leftChild!=NULL)leftdep=TreeDepth(top->leftChild);elseleftdep=-1;if(top->rightChild!=NULL)rightdep=TreeDepth(top->rightChild);elserightdep=-1;return (rightdep>leftdep) ? rightdep+1 : leftdep+1;}int main(){char pre[N];char in[N];int n = 0;char ch;BTNode* b=NULL;printf("请输入先序序列\n");while((ch = getchar())&&ch!='\n')pre[n++] = ch;printf("请输入中序序列\n");n = 0;while((ch = getchar())&&ch!='\n')in[n++] = ch;b=createBT(pre,in,n);printf("二叉树的叶子数目为:%d\n",Count(b));printf("二叉树的深度为:%d\n",TreeDepth(b));return 0 ;}六、测试和结果(给出测试用例,并给出测试结果)1、2、七、用户手册(告诉用户如何使用程序,使用注意事项等)两个程序只能输入字符,并且两次输入的字符个数要一样,字符个数上限为100。
通讯录管理系统--071何荣贤
《数据结构》实验报告题目: 实验七 通讯录管理系统学号:2010810071 成 绩班级: 计算1013日期:2011.12.13 姓名:何荣贤指导老师:杨艳华一、实验目的:本次的实验目的在于使读者深入了解查找表的特性,掌握各种查找方法,以便在实际问题背景下灵活运用他们;并且回顾文件操作的使用。
二、实验环境:本次试验在VC++环境下调试。
三、实验内容与完成情况:1.问题描述编程完成通讯录的一般性管理工作,如通讯录中记录的增加、修改、查找、删除、输出等功能。
2.基本要求一个完整的系统应具有以下功能:⑴每个记录包含姓名、电话号码、住址等个人信息;⑵将建立的通讯录以磁盘文件的形式存储,所有的通讯录管理活动均以文件操作的方式进 行;⑶在查找通讯录中的记录时,以记录的“姓名”为查找关键字进行查找。
3.程序代码#include<stdio.h>#include<string.h>#include<stdlib.h>#include<conio.h>#define header1 "|---------------------电话簿-----------------------|\n" #define header2 "| num | name | phonenum | address |\n" #define header3 "|-------|----------|---------------|---------------|\n" #define end "|----------------------结束------------------------|"#define N 100typedef struct tele{int num;char name[10];char address[20];}telebook;void menu(){system("cls");printf("\n\n\n"); /*输出主菜单*/printf("\t\t|* **** 欢迎进入电话薄管理系统! **** *|\n"); printf("\t\t|********************menu********************|\n"); printf("\t\t| |\n"); printf("\t\t| 1 增加 2 读取 |\n"); printf("\t\t| |\n"); printf("\t\t| 3 查找 4 修改 |\n"); printf("\t\t| |\n"); printf("\t\t| 5 删除 6 排序 |\n"); printf("\t\t| |\n"); printf("\t\t| 0 退出 |\n"); printf("\t\t|********************************************|\n"); }void printheader() /*输出菜单头*/{printf(header1);printf(header2);printf(header3);}int add(telebook temp[]){int i;int m=0;FILE *fp;system("cls");exit(0);}printf("每次输入一百个人的信息!\n");printf("如果输入0退出输入!\n");for(i=m;i<(100+m);i++){printf("num:");scanf("%d",&temp[i].num);if(temp[i].num==0)break;printf("name:");scanf("%s",&temp[i].name);printf("phonenum:");scanf("%s",&temp[i].phonenum);printf("address:");scanf("%s",&temp[i].address);fwrite(&temp[i],sizeof(struct tele),1,fp);}m+=100;fclose(fp);system("cls");return 0;}int read(telebook temp[]){int count,i;FILE *fp;system("cls");exit(0);}printheader();for(count=0;fread(&temp[count],sizeof(struct tele),1,fp)==1;count++);/*读取文件内信息的个数。
数据结构实验报告
数据结构实验报告一、引言数据结构是计算机科学中的重要概念,它涉及到组织和管理数据的方式和算法。
数据结构实验是计算机科学专业的必修实践课程之一,通过实验,我们可以探索不同的数据结构类型,并理解它们的优势和应用。
本报告旨在总结我在数据结构实验中的学习和实践经验。
二、实验目的本次实验的主要目的是熟练掌握线性表、二叉树和图等常见数据结构的构建与操作方法。
通过编写代码,我们可以加深对这些数据结构的理解并且通过实验验证其性能。
三、实验过程1.线性表实验:在这一部分,我们使用C++语言实现了顺序表和链表两种线性表的数据结构,并比较了它们在插入、删除、查找等操作上的性能差异。
2.二叉树实验:我们在实验中实现了二叉树的构建和遍历算法,包括前序遍历、中序遍历和后序遍历。
通过实验,我们发现不同的遍历算法对于不同的问题有不同的效果。
3.图实验:本次实验中,我们实现了图的邻接矩阵和邻接表两种存储结构,并比较了它们在图的遍历和搜索等操作上的性能差异。
同时,我们还实现了最小生成树和最短路径算法,这些算法对实际应用具有重要意义。
四、实验结果根据我们的实验结果,我们可以得出以下结论:1.对于插入和删除等频繁变动的操作,链表比顺序表更适合,因为链表的插入和删除操作时间复杂度为O(1),而顺序表的插入和删除操作时间复杂度为O(n)。
2.在二叉树的遍历中,前序遍历是最简单和常用的一种方式,而中序遍历和后序遍历在某些特定情况下更有用。
例如,在寻找路径上的节点时,后序遍历可以更方便地找出叶子节点。
3.在图的存储中,邻接表比邻接矩阵更节省空间,特别在稀疏图的情况下。
而邻接矩阵在搜索操作中更高效,因为邻接矩阵可以在O(1)的时间内检查两个节点之间是否存在边。
4.最小生成树和最短路径算法在实际生活中有很多应用,例如在城市规划和网络布线中。
通过实验可以发现,Prim算法和Dijkstra算法都可以有效地解决这些问题。
五、实验总结通过本次实验,我对线性表、二叉树和图等常见数据结构有了更深入的了解,并且通过实践中的编码和测试,提高了我的编程能力和问题解决能力。
数据结构实验报告(实验)
数据结构实验报告(实验)数据结构实验报告(实验)1. 实验目的1.1 理解数据结构的基本概念和操作1.2 学会使用数据结构解决实际问题1.3 掌握常用数据结构的实现和应用2. 实验环境2.1 操作系统:Windows 102.2 编程语言:C++2.3 开发工具:Visual Studio3. 实验内容3.1 实验一:线性表的实现和应用3.1.1 设计并实现线性表的基本操作函数3.1.2 实现线性表的插入、删除、查找等功能 3.1.3 实现线性表的排序算法3.1.4 应用线性表解决实际问题3.2 实验二:栈和队列的实现和应用3.2.1 设计并实现栈的基本操作函数3.2.2 设计并实现队列的基本操作函数3.2.3 实现栈和队列的应用场景3.2.4 比较栈和队列的优缺点3.3 实验三:树的实现和应用3.3.1 设计并实现二叉树的基本操作函数3.3.2 实现二叉树的创建、遍历和查找等功能3.3.3 实现树的遍历算法(前序、中序、后序遍历)3.3.4 应用树解决实际问题4. 数据结构实验结果4.1 实验一的结果4.1.1 线性表的基本操作函数实现情况4.1.2 线性表的插入、删除、查找功能测试结果4.1.3 线性表的排序算法测试结果4.1.4 线性表解决实际问题的应用效果4.2 实验二的结果4.2.1 栈的基本操作函数实现情况4.2.2 队列的基本操作函数实现情况4.2.3 栈和队列的应用场景测试结果4.2.4 栈和队列优缺点的比较结果4.3 实验三的结果4.3.1 二叉树的基本操作函数实现情况4.3.2 二叉树的创建、遍历和查找功能测试结果 4.3.3 树的遍历算法测试结果4.3.4 树解决实际问题的应用效果5. 实验分析与总结5.1 实验问题与解决方案5.2 实验结果分析5.3 实验总结与心得体会6. 附件附件一:实验源代码附件二:实验数据7. 法律名词及注释7.1 版权:著作权法规定的对原创作品享有的权利7.2 专利:国家授予的在一定时间内对新型发明享有独占权利的证书7.3 商标:作为标识企业商品和服务来源的标志的名称、符号、图案等7.4 许可协议:指允许他人在一定条件下使用自己的知识产权的协议。
数据结构实验七-二分排序
1
void main() {
rec A; int j,n,i; printf("\n\n 输入初始数据(每个数据一空格隔开,-1结束):"); n=0; scanf("%d", &j); while(j!=-1) {
n++; A[n]=j; scanf("%d",&j); } printf("插入排序\n\n排序前\n\n"); for (i=1;i<=n;i++) printf("%d ", A[i]); InsertSort1(A,n); printf("\n\n排序后\n\n"); for (i=1;i<=n;i++) printf("%d ", A[i]); }
2
数据结构实验报告七
班级:
姓名: 吴前斌
学号:
课程名称
数据结构
实验项目 排序
实验项目类型 验演综设 证示合计
指导掌握二分排序的基本概念,掌握二分排序的基本思想和算法实现。
二、实验内容 设计一个算法用二分查找实现插入排序的“寻找插入位置”操作。
三、实验要求 二分查找:在有序表中进行,先确定表的中点位置,再通过比较确定下一步查找哪个半区。
四、实验过程及结果:
# include "stdio.h" # define Max 20 typedef int elemtype; typedef elemtype rec[Max];
void InsertSort1(rec A,int n) {
int i,j,low,high,mid,now; for(i=2; i<=n; i++) {
数据结构(C语言版) 实验报告
数据结构(C语言版) 实验报告数据结构(C语言版) 实验报告1:引言1.1 问题描述在本实验中,我们需要设计一个基于C语言的数据结构,用于解决特定问题。
1.2 目的本实验的目的是通过设计和实现数据结构,加深对数据结构和C语言的理解,并应用所学的知识解决实际问题。
1.3 相关工作在这一章节中,我们将介绍与本实验相关的先前工作,并分析其优缺点,为我们的设计提供参考。
2:需求分析2.1 功能需求本节将详细描述所设计的数据结构需要实现的功能。
2.2 性能需求在这一节中,我们将明确数据结构的性能需求,例如时间复杂度和空间复杂度限制。
3:数据结构设计3.1 数据结构定义在这一节中,我们将给出所设计数据结构的定义,并详细说明每个字段的含义和作用。
3.2 数据结构操作在这一节中,我们将详细描述每个数据结构操作的实现。
这些操作包括插入,删除,查找等。
4:算法设计4.1 算法描述在这一节中,我们将给出在实现数据结构过程中使用的算法的详细描述。
我们将分析算法的时间复杂度,并讨论其优缺点。
4.2 算法优化在这一节中,我们将分析并设计优化算法,以提高数据结构的性能。
5:实验结果在这一节中,我们将给出实验结果,并分析实验数据。
我们还将展示实验中所涉及的示例输入和输出。
6:结论在这一节中,我们将总结本实验的设计和实现,并讨论所得实验结果的意义和潜在的改进方向。
7:附录本文档附带以下附件:- 代码实现:包含所设计数据结构的C语言源代码。
- 实验数据文件:包含用于测试数据结构的示例输入和输出文件。
8:法律名词及注释本文档中涉及的法律名词及注释见附件。
数据结构实验7实验报告
2018.12.3
开始编写代码,参考了书上的代码和网上的一些代码,主要是深度优先搜索和广度优先搜索的详细操作有一些不明白,所以在纸上推演了一下,先编写邻接表的代码,然后再编写邻接矩阵的代码,两个代码只需要改一下数据的存储方式以及函数的一些实现方式。
2018.12.4
在进行测试程序的时候,发现有一组数据DFS输出有些奇怪,然后画了图对照之后发现数据输入有误,是输入时不小心建立了一个环路,然后百度后发现DFS可以用于检测图中是否存在环路
2018.12.5
在进行输入样例设计的时候,百度了一些比较典型的深度搜索图来进行样例设计,
然后发现
这幅图的DFS输出最后有误,然后单步调试之后发现是first函数返回值的问题
由于之前调试过程中发现如果返回numV的话会出现顶点值溢出的情况,然后改为numV-1,但是书上给出的DFS算法中
如果上一遍历顶点不再有子节点,那么w会被返回编号为numV-1的顶点,而如果此时刚好numV-1顶点未被遍历的话,就会导致提前遍历该结点,于是我在if语句加了一个条件
此时正确输出
2018.12.6
某个软件出bug错误地修改了注册表,导致桌面文件全部丢失且无法恢复,重新编写代码,这也是告诉我要勤备份文件,防止意外发生。
1-7次数据结构实验报告
实验1(2学时)实验名称:线性表及其应用实验内容:1.实现顺序表的删除操作;2.实现单链表的删除操作;3.编程实现单链表相同数据元素删除操作;4.实现带有头结点的单链表的逆置操作。
实验目的与要求:1.深刻理解线性表的抽象数据类型;2.熟练掌握线性表的两种存储方式的基本操作的实现。
实验环境或器材、原理与说明:装有VC++6.0的PC机实验过程(步骤)或程序代码:(必须有)实验预习过程中的问题:(必须有)实验结果与分析:(必须有)实验体会与建议:(必须有)实验2(2学时)实验名称:栈和队列及其应用实验内容:1.实现顺序栈和链栈的出栈、取栈顶元素操作;2.实现循环队列和链队列的出队、取队头元素操作;3.设计算法编程实现,利用循环队列生成杨辉三角形。
实验目的与要求:1.掌握栈的基本操作;2.掌握队列的基本操作;3.会使用栈和队列的基本操作解决较复杂的应用题。
实验环境或器材、原理与说明:装有VC++6.0的PC机实验过程(步骤)或程序代码:(必须有)实验预习过程中的问题:(必须有)实验结果与分析:(必须有)实验体会与建议:(必须有)实验3(2学时)实验名称:串实验内容:1.使用串的堆分配存储方法实现串的基本操作;2.编写程序实现:求子串在主串中的位置,并置换子串。
实验目的与要求:1.了解串的操作特性;2.掌握串的基本操作以顺序存储方式进行存储的实现。
实验环境或器材、原理与说明:装有VC++6.0的PC机实验过程(步骤)或程序代码:(必须有)实验预习过程中的问题:(必须有)实验结果与分析:(必须有)实验体会与建议:(必须有)实验4(4学时)实验名称:树及其应用实验内容:1.完成指导书实训内容“1调试验证”部分;2.创建一颗二叉树,并按其形状显示输出;3.按照先序、中序和后序顺序分别对给定二叉树线索化。
实验目的与要求:1.理解树、二叉树的含义与性质,树和二叉树的存储结构;2.掌握二叉树的三种遍历方法和相应算法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数学与软件科学学院数据结构实验报告
学期: 2014至 2015 第 2 学期2015年 6 月3日
课程名称:数据结构专业:信息与计算机科学
实验编号: 07 实验项目:Huffman树与Huffman树编码算法实验目的:
掌握Huffman树的编码方法和算法实现。
实验内容:(类C算法的程序实现)
(1) 建立Huffman树编码的表示结构,对给定输入信息集合进行Huffman编码,输出编码结果(必做)
(2) 利用Huffman编码算法实现给定信息串的编码结果(必做)
实验准备:
1) 计算机设备;2) 程序调试环境的准备,如TC环境;3) 实验内容的算法分析与代码设计与分析准备。
实验步骤:
1.录入程序代码并进行调试和算法分析;
2.编写实验报告。
存储结构:
Huffman树的结点结构实现方法:
Typedef struct {
unsigned int weight;
unsigned int parent,lchild,rchild;
} HTNode, *HuffmanCode; //动态分配数组存储Huffman树
typedef char **HuffmanCode; //动态分配数组存储Huffman编码表
实验结果:
实验的完整的C程序代码,以及程序实现与结果分析。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include<iostream>
using namespace std;
#define MAX 100
typedef struct{
int weight;
int parent,lchild,rchild;
}HTNode,*HuffmanTree;
typedef char **HuffmanCode;
void Select(HuffmanTree *HT,int n,int *s1,int *s2)
{ int i,m,k;
m=1000;
k=1000; /*定义一个极大值*/
for(i=1;i<=n;i++)
if(m>HT[i]->weight!=0&&HT[i]->parent==0)
{ m=HT[i]->weight;
*s1=i; /*修改s1的值*/
}
for(i=1;i<=n;i++)
if(k>HT[i]->weight&&i!=*s1&&HT[i]->parent==0)
{ k=HT[i]->weight;
*s2=i; /*S2值*/
}
printf("%d,%d",*s1,*s2);
}
void HuffmanCoding(HuffmanTree *HT,HuffmanCode *HC,int *w,int n){ int i,c,m,s1,s2,start,f;
char *cd;
HuffmanTree p;
if(n<=1) return;
m=2*n-1;
*HT=(HuffmanTree)malloc((m+1)*sizeof(HTNode)); /*0号单元不用*/ for(p=*HT,i=1;i<=n;++i,++p,++w)/*初始化*/
{ (*p).weight=*w;
(*p).parent=0;
(*p).rchild=0;
(*p).lchild=0;
}
for(;i<=m;++i,++p)
{
(*p).weight=0;
(*p).parent=0;
(*p).lchild=0;
(*p).rchild=0;
}
for(i=n+1;i<=m;++i){/*建huffman树*/
Select(HT,i-1,&s1,&s2);
(*HT[s1]).parent=i;
(*HT[s2]).parent=i;
(*HT[i]).lchild=s1;
(*HT[i]).rchild=s2;
(*HT[i]).weight=(*HT[s1]).weight+(*HT[s2]).weight;
}
*HC=(HuffmanCode)malloc((n+1)*sizeof(char*));
cd=(char*)malloc(n*sizeof(char));
cd[n-1]='\0';
for(i=1;i<=n;++i)
{ start=n-1;
for(c=i,f=(*HT[i]).parent;f!=0;c=f,f=(*HT[f]).parent)
if((*HT[f]).lchild==c)
cd[--start]='0';
else
cd[--start]='1';
*HC[i]=(char*)malloc((n-start)*sizeof(char));
strcpy(*HC[i],&cd[start]);
}
free(cd);
}
void main()
{
int i,n,w[MAX];
HuffmanTree HT;
HuffmanCode HC;
printf("input number of root node(2=<n<=100):");
scanf("%d",&n);
getchar();
for(i=1;i<=n;i++)
{
scanf("%d",&w[i]);
getchar();
}
HuffmanCoding(&HT,&HC,w,n);
getchar();
getchar();
}
实验心得:
经过本次实验,我对Huffman树的建立与编码的获得过程更加了解,这是二叉树的使用实例,平时还应多注意学得算法的具体使用实例方法,学以致用,并且学会对问题的多种方法解决,并能正确度量算法的好坏。