最新中南大学数据结构实验报告

合集下载

中南大学数据结构演示系统课程设计实验报告

中南大学数据结构演示系统课程设计实验报告

中南大学数据结构演示系统课程设计实验报告一、需求分析1、课程设计题目数据结构演示系统1(1)、顺序表的插入、删除和合并等基本操作(2)、利用插入运算建立链表;实现链表的查找、删除、计数、输出等功能以及有序链表的合并。

(3)、串的模式匹配(包括求next和nextval的值)。

2程序模块的功能要求(1)输入的形式和输入值的范围(2)顺序表和链表的输入形式是整形,输入值的范围是-32768~~32767。

串的输入形式是字符型(3)输出的形式顺序表和链表的输出形式是整形;串的输出形式是字符型。

(4)程序所能达到的功能;实现顺序表的创建、插入、删除和合并实现链表的创建、查找、删除、计数、输出和有序链表的合并实现串的模式匹配(包括求next和nextval的值)(5)测试数据:包括正确的输入及其输出结果和含有错误的输入及其输出结果顺序表的输入:12/26/65/65/216/898/989/2156链表输入:12/32/35/56/65/654/985二、概要设计1、定义定义顺序表的结构体typedef struct lnode{int data;struct lnode *next;}linklist;定义链表的的结构体typedef struct{int len;linklist *point;}indexlink;typedef struct{int data[MAXSIZE][MAXSIZE1+1];int len;定义串的结构体}sqlist;typedef struct{char string[MAXSIZE1];int len;}sstring;int next[MAXSIZE1];int nextval[MAXSIZE1];2 流程图(1)主界面(2)顺序表主流程图(3)顺序表插入流程图(4)链表主流程图)链表删除元素流程图(5(6)模式匹配主流程图(7)KMP求next【】流程图3各程序模块之间的层次关系(1)第一层为主界面函数,第二层为顺序表界面函数、链表界面函数、模式匹配界面函数第三层为顺序表子函数、链表子函数、模式匹配子函数(2)主界面函数调用的函数有sqlistfuc()、linklistfuc()、indexfuc()顺序表界面调用的函数有creatsq()、listinsert()、listdelete()、mergelist()链表界面调用的函数有creat()、insert()、delete()、search()、num()、linktraverse()、mergelink()、模式匹配界面调用的函数有creatstring()、KMP()三、详细设计见附录四、调试分析1、调试过程中遇到的问题是如何解决的以及对设计与实现的讨论和分析(1)一开始在在调试程序时遇到了内存错误,最终通过网上查资料找到了出错的原因:在建立对头指针和队尾指针时没有对指针进行初始化,即没有为指针动态分配空间。

数据结构课程设计实验报告完整版

数据结构课程设计实验报告完整版

数据结构课程设计实验报告完整版【正文】一、实验目的本实验主要目的是通过实践,掌握数据结构的基本概念、常见数据结构的实现方式以及在实际应用中的应用场景和效果。

二、实验背景数据结构是计算机科学与技术领域中的一个重要概念,是研究数据的组织方式、存储方式、访问方式以及操作等方面的方法论。

在计算机科学领域,数据结构是实现算法和解决问题的基础,因此对数据结构的理解和应用具有重要意义。

三、实验内容本次数据结构课程设计实验主要分为以下几个部分:1. 实验环境的准备:包括选择合适的开发平台、安装必要的软件和工具。

2. 实验数据的收集和处理:通过合适的方式收集实验所需的数据,并对数据进行处理和整理。

3. 数据结构的选择和实现:根据实验需求,选择合适的数据结构,并进行相应的数据结构实现。

4. 数据结构的测试和优化:对所实现的数据结构进行测试,包括性能测试和功能测试,并根据测试结果对数据结构进行优化和改进。

5. 实验报告的撰写:根据实验过程和结果,撰写完整的实验报告,包括实验目的、实验背景、实验内容、实验结果和结论等。

四、实验过程1. 实验环境的准备本实验选择了Visual Studio作为开发平台,安装了相应版本的Visual Studio,并根据官方指引进行了相应的配置和设置。

2. 实验数据的收集和处理本实验选取了一份包含学生信息的数据集,包括学生姓名、学号、性别、年龄等信息。

通过编写Python脚本,成功提取了所需信息,并对数据进行了清洗和整理。

3. 数据结构的选择和实现根据实验需求,我们选择了链表作为数据结构的实现方式。

链表是一种常见的动态数据结构,能够高效地插入和删除元素,适用于频繁插入和删除的场景。

在实现链表时,我们定义了一个节点结构,包含数据域和指针域。

通过指针的方式将节点连接起来,形成一个链式结构。

同时,我们还实现了相关的操作函数,包括插入、删除、查找等操作。

4. 数据结构的测试和优化在完成链表的实现后,我们对其进行了性能测试和功能测试。

数据结构实验实训报告范文

数据结构实验实训报告范文

一、实验目的1. 理解并掌握数据结构的基本概念和常用算法。

2. 学会使用C语言实现线性表、栈、队列、树和图等基本数据结构。

3. 培养动手实践能力,提高编程水平。

二、实验内容1. 线性表(1)顺序表(2)链表2. 栈(1)顺序栈(2)链栈3. 队列(1)顺序队列(2)链队列4. 树(1)二叉树(2)二叉搜索树5. 图(1)邻接矩阵表示法(2)邻接表表示法三、实验环境1. 操作系统:Windows 102. 编程语言:C语言3. 编译器:Visual Studio 20194. 实验软件:C语言开发环境四、实验步骤1. 线性表(1)顺序表1)定义顺序表结构体2)实现顺序表的初始化、插入、删除、查找等基本操作3)编写测试程序,验证顺序表的基本操作(2)链表1)定义链表结构体2)实现链表的创建、插入、删除、查找等基本操作3)编写测试程序,验证链表的基本操作2. 栈(1)顺序栈1)定义顺序栈结构体2)实现顺序栈的初始化、入栈、出栈、判空等基本操作3)编写测试程序,验证顺序栈的基本操作(2)链栈1)定义链栈结构体2)实现链栈的初始化、入栈、出栈、判空等基本操作3)编写测试程序,验证链栈的基本操作3. 队列(1)顺序队列1)定义顺序队列结构体2)实现顺序队列的初始化、入队、出队、判空等基本操作3)编写测试程序,验证顺序队列的基本操作(2)链队列1)定义链队列结构体2)实现链队列的初始化、入队、出队、判空等基本操作3)编写测试程序,验证链队列的基本操作4. 树(1)二叉树1)定义二叉树结构体2)实现二叉树的创建、遍历、查找等基本操作3)编写测试程序,验证二叉树的基本操作(2)二叉搜索树1)定义二叉搜索树结构体2)实现二叉搜索树的创建、遍历、查找等基本操作3)编写测试程序,验证二叉搜索树的基本操作5. 图(1)邻接矩阵表示法1)定义邻接矩阵结构体2)实现图的创建、添加边、删除边、遍历等基本操作3)编写测试程序,验证邻接矩阵表示法的基本操作(2)邻接表表示法1)定义邻接表结构体2)实现图的创建、添加边、删除边、遍历等基本操作3)编写测试程序,验证邻接表表示法的基本操作五、实验结果与分析1. 线性表(1)顺序表实验结果表明,顺序表的基本操作实现正确,测试程序运行稳定。

《数据结构》实验报告

《数据结构》实验报告

《数据结构》实验报告实验一一、实验目的及要求理解线性表的顺序存储结构;熟练掌握顺序表结构及其有关算法的设计;理解线性表的链式存储结构;熟练掌握动态链表结构及其有关算法的设计;根据具体问题的需要,设计出合理的表示数据的链表结构,并设计相关算法;深入了解栈和队列的特性,以便在实际问题背景下灵活运用他们;同时巩固对这两种结构的构造方法的理解。

二、实验环境硬件:计算机软件:Microsoft Visual C++三、实验内容1.以顺序表作存储结构,实现线性表的插入、删除;2.以单链表作存储结构,实现有序表的合并;3.利用栈(以顺序栈作存储结构)实现进制转换,并用队列(以链队列作存储结构)计算并打印杨辉三角。

四、源程序清单五、实验结果六、总结实验二一、实验目的及要求掌握二叉树的动态存储结构--二叉链表,掌握二叉树的三种遍历方法,会运用三种遍历的方法求解有关问题。

二、实验环境硬件:计算机软件:Microsoft Visual C++三、实验内容1.以二叉链表作存储结构,建立一棵二叉树;2.输出其先序、中序、后序遍历序列;3.求出它的深度;4.统计其叶子结点数四、源程序清单五、实验结果六、总结实验三一、实验目的及要求掌握图的存储结构及其建立算法,熟练掌握图的两种遍历算法及其应用。

二、实验环境硬件:计算机软件:Microsoft Visual C++三、实验内容1.以邻接矩阵法作存储结构,建立一个无向图;2.输出该图的深度优先搜索序列;3.输出该图的广度优先搜索序列;4. 设计算法求出该图的连通分量个数及边的数目。

四、源程序清单五、实验结果六、总结实验四一、实验目的及要求掌握顺序表的查找方法,尤其是折半查找方法。

掌握二叉排序树的查找算法。

二、实验环境硬件:计算机软件:Microsoft Visual C++三、实验内容1.建立一个顺序表,用顺序查找的方法对其实施查找;2.建立一个有序表,用折半查找的方法对其实施查找;3.建立一个二叉排序树,根据给定值对其实施查找;4.对同一组数据,试用三种方法查找某一相同数据,并尝试进行性能分析。

数据结构实验报告总结

数据结构实验报告总结

数据结构实验报告总结本次数据结构实验主要涉及到线性表、栈和队列的基本操作,通过实验操作和总结,我对数据结构的相关知识有了更深入的理解和掌握。

首先,我们进行了线性表的实验操作。

线性表是一种数据结构,它是由n(n≥0)个数据元素组成的有限序列。

在实验中,我们学习了线性表的顺序存储结构和链式存储结构。

通过代码实现,我深刻理解了顺序表和链表的存储方式和特点。

在实验过程中,我发现顺序表适合查找操作,而链表适合插入和删除操作。

这让我对线性表的应用场景有了更清晰的认识。

其次,我们进行了栈的实验操作。

栈是一种特殊的线性表,它只能在表的一端进行插入和删除操作。

在实验中,我学习了栈的基本操作,包括入栈和出栈。

通过实际操作,我深刻理解了栈的“先进后出”的特性,以及它在计算机程序设计中的应用。

我发现栈在递归算法、表达式求值和括号匹配等方面有着重要的作用,这让我对栈的实际应用有了更深入的认识。

最后,我们进行了队列的实验操作。

队列是一种特殊的线性表,它只能在表的一端进行插入操作,而在另一端进行删除操作。

在实验中,我学习了队列的基本操作,包括入队和出队。

通过实际操作,我深刻理解了队列的“先进先出”的特性,以及它在计算机程序设计中的重要性。

我发现队列在广度优先搜索、模拟系统等方面有着重要的应用,这让我对队列的实际应用有了更深入的了解。

通过本次数据结构实验,我不仅掌握了线性表、栈和队列的基本操作,还深刻理解了它们在实际应用中的重要性。

我相信这些知识和经验对我的学习和工作都将有着重要的帮助。

在未来的学习和实践中,我将继续加强对数据结构的理解和运用,不断提升自己的编程能力和解决问题的能力。

总之,本次数据结构实验让我受益匪浅,我将继续努力学习和实践,不断提升自己的专业能力。

希望通过不懈的努力,能够在数据结构领域取得更大的成就。

数据结构实验报告2篇

数据结构实验报告2篇

数据结构实验报告数据结构实验报告精选2篇(一)实验目的:1. 熟悉数据结构的基本概念和基本操作;2. 掌握线性表、栈、队列、链表等经典数据结构的实现方法;3. 掌握数据结构在实际问题中的应用。

实验内容:本次实验主要包括以下几个部分:1. 线性表的实现方法,包括顺序表和链表,分别使用数组和链表来实现线性表的基本操作;2. 栈的实现方法,包括顺序栈和链式栈,分别使用数组和链表来实现栈的基本操作;3. 队列的实现方法,包括顺序队列和链式队列,分别使用数组和链表来实现队列的基本操作;4. 链表的实现方法,包括单链表、双链表和循环链表,分别使用指针链、双向链和循环链来实现链表的基本操作;5. 综合应用,使用各种数据结构来解决实际问题,例如使用栈来实现括号匹配、使用队列来实现马铃薯游戏等。

实验步骤及结果:1. 线性表的实现方法:a) 顺序表的基本操作:创建表、插入元素、删除元素、查找元素等;b) 链表的基本操作:插入节点、删除节点、查找节点等;c) 比较顺序表和链表的优缺点,分析适用场景。

结果:通过实验,确认了顺序表适用于频繁查找元素的情况,而链表适用于频繁插入和删除节点的情况。

2. 栈的实现方法:a) 顺序栈的基本操作:进栈、出栈、判空、判满等;b) 链式栈的基本操作:进栈、出栈、判空、判满等。

结果:通过实验,掌握了栈的基本操作,并了解了栈的特性和应用场景,例如括号匹配。

3. 队列的实现方法:a) 顺序队列的基本操作:入队、出队、判空、判满等;b) 链式队列的基本操作:入队、出队、判空、判满等。

结果:通过实验,掌握了队列的基本操作,并了解了队列的特性和应用场景,例如马铃薯游戏。

4. 链表的实现方法:a) 单链表的基本操作:插入节点、删除节点、查找节点等;b) 双链表的基本操作:插入节点、删除节点、查找节点等;c) 循环链表的基本操作:插入节点、删除节点、查找节点等。

结果:通过实验,掌握了链表的基本操作,并了解了链表的特性和应用场景。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告一、实验目的数据结构是计算机科学中一门重要的基础课程,通过本次实验,旨在加深对数据结构基本概念和算法的理解,提高编程能力和解决实际问题的能力。

具体目标包括:1、掌握常见数据结构(如数组、链表、栈、队列、树、图等)的基本操作和实现方法。

2、学会运用数据结构解决实际问题,培养算法设计和分析的能力。

3、提高程序设计的规范性和可读性,培养良好的编程习惯。

二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。

三、实验内容本次实验共包括以下几个部分:(一)线性表的实现与操作1、顺序表的实现定义一个顺序表结构体,包含数据元素数组和表的长度。

实现顺序表的初始化、插入、删除、查找等基本操作。

2、链表的实现定义链表节点结构体,包含数据域和指针域。

实现链表的创建、插入、删除、遍历等操作。

(二)栈和队列的实现与应用1、栈的实现采用顺序存储或链式存储实现栈。

实现栈的入栈、出栈、栈顶元素获取等操作,并应用于表达式求值。

2、队列的实现用循环队列或链式队列实现队列。

实现队列的入队、出队、队头元素获取等操作,应用于模拟排队系统。

(三)树的基本操作与遍历1、二叉树的实现定义二叉树节点结构体,包含数据域、左子树指针和右子树指针。

实现二叉树的创建、插入、删除节点等操作。

2、二叉树的遍历分别实现前序遍历、中序遍历和后序遍历,并输出遍历结果。

(四)图的表示与遍历1、邻接矩阵和邻接表表示图定义图的结构体,使用邻接矩阵和邻接表两种方式存储图的信息。

实现图的创建、添加边等操作。

2、图的遍历分别用深度优先搜索(DFS)和广度优先搜索(BFS)遍历图,并输出遍历序列。

四、实验步骤(一)线性表的实现与操作1、顺序表的实现首先,定义了一个结构体`SeqList` 来表示顺序表,其中包含一个整数数组`data` 用于存储数据元素,以及一个整数`length` 表示表的当前长度。

在初始化函数`InitSeqList` 中,将表的长度初始化为 0,并分配一定的存储空间给数组。

数据结构实训实验报告

数据结构实训实验报告

一、实验背景数据结构是计算机科学中一个重要的基础学科,它研究如何有效地组织和存储数据,并实现对数据的检索、插入、删除等操作。

为了更好地理解数据结构的概念和原理,我们进行了一次数据结构实训实验,通过实际操作来加深对数据结构的认识。

二、实验目的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. 操作系统:Windows 102. 编程语言:C语言3. 开发环境:Visual Studio 20194. 实训教材:《数据结构》(C语言版)三、实训内容本次实训主要内容包括线性表、栈、队列、树、图等基本数据结构的创建、操作和应用。

1. 线性表(1)单链表的创建、插入、删除和查找操作(2)双向链表的创建、插入、删除和查找操作(3)循环链表的创建、插入、删除和查找操作2. 栈(1)栈的创建、入栈、出栈和判断栈空操作(2)应用栈实现括号匹配3. 队列(1)队列的创建、入队、出队和判断队列空操作(2)应用队列实现广度优先搜索4. 树(1)二叉树的创建、插入、删除和遍历操作(2)二叉查找树的创建、插入、删除和查找操作5. 图(1)图的创建、添加边、删除边和遍历操作(2)图的深度优先遍历和广度优先遍历四、实训过程1. 线性表首先,我们学习了单链表、双向链表和循环链表的基本概念和创建方法。

通过编写代码,实现了链表的插入、删除和查找操作。

在实训过程中,我们遇到了一些问题,如链表插入操作时指针的移动、删除操作时避免内存泄漏等。

通过查阅资料和与同学讨论,我们逐步解决了这些问题。

2. 栈接着,我们学习了栈的基本概念和操作方法。

通过编写代码,实现了栈的创建、入栈、出栈和判断栈空操作。

在实训过程中,我们遇到了栈空和栈满的情况,通过设置标志位和循环队列的方法解决了这些问题。

此外,我们还学习了应用栈实现括号匹配,加深了对栈的应用理解。

3. 队列然后,我们学习了队列的基本概念和操作方法。

通过编写代码,实现了队列的创建、入队、出队和判断队列空操作。

在实训过程中,我们遇到了队列空和队列满的情况,通过设置标志位和循环队列的方法解决了这些问题。

数据结构 实验报告

数据结构 实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中非常重要的一门课程,通过本次实验,旨在加深对常见数据结构(如链表、栈、队列、树、图等)的理解和应用,提高编程能力和解决实际问题的能力。

二、实验环境本次实验使用的编程语言为C++,开发工具为Visual Studio 2019。

操作系统为 Windows 10。

三、实验内容1、链表的实现与操作创建一个单向链表,并实现插入、删除和遍历节点的功能。

对链表进行排序,如冒泡排序或插入排序。

2、栈和队列的应用用栈实现表达式求值,能够处理加、减、乘、除和括号。

利用队列实现银行排队系统的模拟,包括顾客的到达、服务和离开。

3、二叉树的遍历与操作构建一棵二叉树,并实现前序、中序和后序遍历。

进行二叉树的插入、删除节点操作。

4、图的表示与遍历用邻接矩阵和邻接表两种方式表示图。

实现图的深度优先遍历和广度优先遍历。

四、实验步骤及结果1、链表的实现与操作首先,定义了链表节点的结构体:```cppstruct ListNode {int data;ListNode next;ListNode(int x) : data(x), next(NULL) {}};```插入节点的函数:```cppvoid insertNode(ListNode& head, int val) {ListNode newNode = new ListNode(val);head = newNode;} else {ListNode curr = head;while (curr>next!= NULL) {curr = curr>next;}curr>next = newNode;}}```删除节点的函数:```cppvoid deleteNode(ListNode& head, int val) {if (head == NULL) {return;}ListNode temp = head;head = head>next;delete temp;return;}ListNode curr = head;while (curr>next!= NULL && curr>next>data!= val) {curr = curr>next;}if (curr>next!= NULL) {ListNode temp = curr>next;curr>next = curr>next>next;delete temp;}}```遍历链表的函数:```cppvoid traverseList(ListNode head) {ListNode curr = head;while (curr!= NULL) {std::cout << curr>data <<"";curr = curr>next;}std::cout << std::endl;}```对链表进行冒泡排序的函数:```cppvoid bubbleSortList(ListNode& head) {if (head == NULL || head>next == NULL) {return;}bool swapped;ListNode ptr1;ListNode lptr = NULL;do {swapped = false;ptr1 = head;while (ptr1->next!= lptr) {if (ptr1->data > ptr1->next>data) {int temp = ptr1->data;ptr1->data = ptr1->next>data;ptr1->next>data = temp;swapped = true;}ptr1 = ptr1->next;}lptr = ptr1;} while (swapped);}```测试结果:创建了一个包含 5、3、8、1、4 的链表,经过排序后,输出为 1 3 4 5 8 。

中南大学数据结构实验报告1(线性表)

中南大学数据结构实验报告1(线性表)

实验一线性表的操作算法一、实验目的:1了解线性表的逻辑结构和存储结构,以及定义在逻辑结构上的各种基本运算2分别以数组和链表为存储结构,实现线性表的插入,删除,查找,排序,合并等操作二、实验内容:用C/C++语言编写程序,分别以数组和链表为存储结构,完成以下功能:1输入数据,创建一个线性表2可在线性表的任意位置插入新结点3可删除线性表的任意一个结点4可在线性表中查找结点5将线性表从小至大排序6将两个线性表合并三、详细设计:顺序表#include<iostream>using namespace std;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define OVERFLOW -2typedef int Status;typedef int ElemType;#define LIST_INIT_SIZE 100#define LISTINCREMENT 10typedef struct { //结构体ElemType *elem;int length;int listsize;}SqList;SqList Lx;Status InitList_Sq(SqList &L) //分配空间{ L.elem=new ElemType[LIST_INIT_SIZE];if(!L.elem)exit(OVERFLOW);L.length =0;L.listsize=LIST_INIT_SIZE;return OK;}Status ListInsert(SqList &L,int i,ElemType e) //插入新元素{ int *q,*p;ElemType *newbase;if(i<1 || i>L.length+1) return ERROR;if(L.length>=L.listsize){ newbase=new ElemType[L.listsize+LISTINCREMENT];if(!newbase) exit(OVERFLOW);L.elem=newbase;L.listsize+=LISTINCREMENT;}q=&(L.elem[i-1]);for (p=&(L.elem[L.length-1]);p>=q;--p)*(p+1)=*p;*q=e;++L.length;return OK;}Status Listlength(SqList L) //长度{ int *p=L.elem; //判断线形表是否存在while(p){ return (L.length); }}Status GetElem(SqList L, int i,ElemType &e) //取元素{ if(i<1 || i>L.length)return ERROR;else{ e=L.elem[i-1];return e;}}void MergeList(SqList La,SqList Lb,SqList &Lc) //合并{ ElemType ai,bj;InitList_Sq(Lc);int i=1,j=1,k=0;int La_len,Lb_len;La_len=Listlength(La);Lb_len=Listlength(Lb);while((i<=La_len)&&(j<=Lb_len)){ GetElem(La,i,ai);GetElem(Lb,j,bj);if(ai<=bj){ ListInsert(Lc,++k,ai);++i; }else{ ListInsert(Lc,++k,bj);++j; }}while(i<=La_len){ GetElem(La,i++,ai);ListInsert(Lc,++k,ai);}while(j<=Lb_len){ GetElem(Lb,j++,bj);ListInsert(Lc,++k,bj);}}void show(SqList L,int i) //显示{ int j;ElemType k;cout<<"顺序表显示如下:"<<endl;for(j=0;j<i-1;j++){ k=L.elem[j];cout<<k<<"->"; }if(j==i-1 && i>0){ k=L.elem[j]; cout<<k; }cout<<endl;}void create(SqList &L,int n) //输入元素{ int e;for(int i=0;i<n;i++){ cin>>e;L.elem[i]=e;L.length=i+1; }}Status ListDelete_Sq(SqList &L,int i,ElemType &e) //删除{ ElemType *p, *q;if(i<1 || i>L.length) return ERROR;p=&(L.elem[i-1]);e=*p;q=L.elem+L.length-1;for(++p;p<=q;++p) *(p-1)=*p;--L.length;return OK;}Status Listxiugei(SqList &L,int i,ElemType &e) //修改{ if(i<1 || i>L.length)return ERROR;else{ L.elem[i-1]=e;return OK; }}void shuru(SqList &L1) //顺序表的创建{ int a;InitList_Sq(L1);cout<<"请输入顺序表的长度:";cin>>a;cout<<"请输入顺序表的元素(共"<<a<<"个)"<<endl;create(L1,a);show(L1,a);}void shanchu(SqList &L1) //删除顺序表里的元素{ int a;int j; ElemType e1;a=L1.length;cout<<"请选择所要删除元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要删除元素的位置:";cin>>j; }ListDelete_Sq(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a-1);}void charu(SqList &L1) //插入元素到顺序表里{ int a; int j; ElemType e1;a=L1.length;cout<<"请选择所要插入元素的位置:";cin>>j;while(j<0||j>Listlength(L1)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要插入元素的位置:";cin>>j; }cout<<"要插入的元素:";cin>>e1;ListInsert(L1,j,e1);cout<<"修改后的顺序表数据:"<<endl;show(L1,a+1);}void hebing(SqList &L3) //合并两个顺序表{ SqList L1,L2;int a,b;InitList_Sq(L1); InitList_Sq(L2);cout<<"请输入第一个有序表的长度:"; cin>>a;cout<<"请输入第一个有序表的元素(共"<<a<<"个)"<<endl;create(L1,a);show(L1,a);cout<<"请输入第二个有序表的长度:"; cin>>b;cout<<"请输入第二个有序表的元素(共"<<b<<"个)"<<endl;create(L2,b);show(L2,b);MergeList(L1,L2,L3);cout<<"合并后的有序表如下:"; show(L3,a+b);}void main() //主菜单{ int choice;for(;;){ cout<<"顺序表的基本操作"<<endl;cout<<"1.顺序表的创建"<<endl;cout<<"2.顺序表的显示"<<endl;cout<<"3.顺序表的长度"<<endl;cout<<"4.插入元素到顺序表里"<<endl;cout<<"5.删除顺序表里的元素"<<endl;cout<<"6.合并两个顺序表"<<endl;cout<<"7.退出系统"<<endl;cout<<"请选择:";cin>>choice;switch(choice){ case 1: shuru(Lx);break;case 2: show(Lx,Lx.length);break;case 3: cout<<"顺序表的长度:"<<Listlength(Lx)<<endl;break;case 4: charu(Lx);break;case 5: shanchu(Lx);break;case 6: hebing(Lx);break;case 7: cout<<"退出系统!"<<endl;exit(0);break;default : cout<<"输入有误,请重新选择"<<endl;break; }}}链表#include<iostream>using namespace std;#define true 1#define false 0#define ok 1#define error 0#define overflow -2typedef int Status;typedef int ElemType;typedef struct LNode //存储结构{ ElemType data;struct LNode *next;}LNode,*LinkList;void CreateList(LinkList &L,int n) //尾插法创建单链表{ LinkList p;L=new LNode;L->next=NULL; //建立一个带头结点的单链表LinkList q=L; //使q指向表尾for(int i=1;i<=n;i++){ p=new LNode;cin>>p->data;p->next=NULL;q->next=p;q=p; }}Status GetElem(LinkList L,int i,ElemType &e)//取第i个元素{ LinkList p=L->next;int j=1;while(p&&j<i){ p=p->next;++j; }if(!p||j>i) return error; //第i个元素不存在e=p->data;return ok;}Status LinkInsert(LinkList &L,int i,ElemType e) //插入{ LinkList p=L;int j=0;while(p&&j<i-1){ p=p->next;++j; } //寻找第i-1个结点 if(!p||j>i-1)return error; //i小于1或者大于表长加1 LinkList s=new LNode; //生成新结点s->data=e;s->next=p->next; //插入L中p->next=s;return ok;}Status ListDelete(LinkList &L,int i,ElemType &e) // 删除{ LinkList p=L;LinkList q;int j=0;while(p->next&&j<i-1){ //寻找第i个结点,并令p指向其前驱 p=p->next;++j; }if(!(p->next)||j>i-1) return error; //删除位置不合理q=p->next;p->next=q->next; //删除并释放结点e=q->data;delete(q);return ok;}void MergeList(LinkList &La,LinkList &Lb,LinkList &Lc) { //合并两个顺序链表LinkList pa,pc,pb;pa=La->next;pb=Lb->next;Lc=pc=La;while(pa&&pb){ if(pa->data<=pb->data){ pc->next=pa;pc=pa;pa=pa->next; }else{ pc->next=pb;pc=pb;pb=pb->next; }}pc->next=pa?pa:pb;delete(Lb);}void show(LinkList L) //显示{ LinkList p;p=L->next;while(p){ cout<<p->data<<"-->";p=p->next; }cout<<endl;}int Length(LinkList L,int i) //表长{ i=0;LinkList p=L->next;while(p){ ++i;p=p->next; }return i;}void xiugai(LinkList L) //修改{ int i,j=1;ElemType k;ElemType e,m;LinkList p=L->next;cout<<"请输入要修改的元素位置(0<i<length):";cin>>i;GetElem(L,i,e);cout<<"该位置的元素:"<<e<<endl;cout<<"修改后的元素值:";cin>>k;while(p&&j<i){ p=p->next;++j; }m=p->data;p->data=k;cout<<"修改后的单链表显示如下:"<<endl;show(L);}void hebing() //合并两个单链表{ int a,b;LinkList La,Lb,Lc;cout<<"请输入第一个有序链表的长度:"<<endl;cin>>a;cout<<"请输入第一个有序链表的元素共("<<a<<"个):"<<endl;CreateList(La,a);show(La);cout<<"请输入第二个有序链表的长度:"<<endl;cin>>b;cout<<"请输入第二个有序链表的元素共("<<b<<"个):"<<endl;CreateList(Lb,b);show (Lb);MergeList(La,Lb,Lc);cout<<"合并后的有序链表如下:"<<endl;show(Lc);}void main() //主函数{ int select;int x;ElemType y;LinkList list;for(;;){ cout<<"单链表的基本操作"<<endl;cout<<"1.单链表的创建"<<endl;cout<<"2.单链表的显示"<<endl;cout<<"3.单链表的长度"<<endl;cout<<"4.插入元素到单链表里"<<endl;cout<<"5.删除单链表里的元素"<<endl;cout<<"6.合并两个单链表"<<endl;cout<<"7.退出系统"<<endl;cout<<"请选择:";cin>>select;switch(select){ case 1:cout<<"请输入单链表的长度:"<<endl;cin>>x;cout<<"请输入"<<x<<"个元素"<<endl;CreateList(list,x);break;case 2: cout<<"单链表显示如下:"<<endl;show(list);break;case 3: int s;cout<<"单链表的长度为:"<<Length(list,s)<<endl;break;case 4: cout<<"请选择要插入的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要插入元素的位置:";cin>>x; }cout<<"要插入的元素值:";cin>>y;LinkInsert( list,x,y);cout<<"插入后单链表显示如下:"<<endl;show(list);break;case 5: cout<<"请选择要删除的位置:"; cin>>x;while(x<0||x>Length(list,s)){ cout<<"输入有误,请重新输入"<<endl;cout<<"请选择所要删除元素的位置:";cin>>x; }ListDelete(list,x,y);cout<<"要删除的元素值:"<<y<<endl;cout<<"删除后的单链表显示如下:"<<endl;show(list);break;case 6: hebing();break;case 7: exit(0);break;default : cout<<"输入有误,请重新输入"<<endl;break;}}}四、实验结果:顺序表链表。

中南大学结构试验报告

中南大学结构试验报告

结构实验报告班级:土木x班专业:xxxxxx学号:xxxxxxxxxxx姓名:xxxx中南大学土木工程学院目录实验一电阻应变片的粘贴及防潮技术 (2)实验二静态电阻应变仪单点接桥练习 (4)实验三简支钢桁架梁静载试验 (9)实验四钢筋混凝土简支梁静载试验 (14)实验五测定结构动力特性与动力反应 (21)实验六钢筋混凝土结构无损检测 (27)实验一电阻应变片的粘贴及防潮技术一、试验目的1.了解应变片选取的原则及质量鉴别方法;2.掌握应变片的粘贴技术。

二、仪器和设备1.电阻应变片(型号:3mm×2mm;灵敏系数:2.08)、连接端子、连接导线;2.惠斯登电桥、放大镜、高阻表;3.万能试验机、静态电阻应变仪、螺丝刀;4.打磨机、砂布、铅笔;5.丙酮(或无水酒精)、药棉、镊子;6.剥线钳、剪刀、白胶布、绝缘胶布;7.502胶水(或环氧树脂)、塑料膜;8.直尺、游标卡尺。

三、试验步骤1.划线定位:在钢片上选定应变片位置划出十字线,且深度适中。

2.砂纸打磨钢片表面,使其符合光洁度要求。

3.清洁表面:用棉纱沾丙酮清洁打磨位置表面,清洁后不可用手指触碰。

4.对正调整:用透明胶带将应变片与钢片位置临时固定,移动胶带使其到达正确位置。

5.涂胶粘贴:在应变片反面滴一滴胶水,拇指按压挤出多余胶水。

6.粘贴接件:将应变片接线拉起至根部,在紧连应变片的下部用胶水粘接一片连接片。

7.焊接引线:将应变片引线焊接在接线片上,焊点要求光滑牢固。

8.焊接导线:把连接应变仪的导线焊接在接线片上,并用绝缘胶带固定在钢片上。

9.检验:用高阻表检验连接好的应变片电阻值。

四、现场图片划线定位打磨清洗粘贴按压焊接引线焊接导线电阻检验五、心得体会通过这次试验我知道了电阻应变片是根据电阻应变效应作成的传感器。

在发生机械变形时,电阻应变片的电阻会发生变化。

使用时,用粘合剂将应变计贴在被测试件表面上,试件变形时,应变计的敏感栅与试件一同变形,使其电阻发生变化,在有测量电路将电阻变化转化为电压或电流的变化。

数据结构课程实验报告

数据结构课程实验报告

数据结构课程实验报告一、实验目的。

本次实验旨在通过对数据结构课程所学知识的应用,加深对数据结构相关算法和数据操作的理解,提高学生的编程能力和实际应用能力。

二、实验内容。

1. 实现顺序表、链表、栈、队列等数据结构的基本操作;2. 设计并实现数据结构相关算法,如查找、排序等;3. 进行实验数据的输入、输出和结果展示;4. 对实验结果进行分析和总结。

三、实验过程。

1. 针对顺序表、链表、栈、队列等数据结构,首先进行了相关操作的实现。

在实现过程中,需要考虑数据结构的特点和操作规则,确保操作的正确性和高效性。

2. 针对数据结构相关算法,如查找、排序等,设计并实现了相应的算法。

在实现过程中,需要考虑算法的时间复杂度和空间复杂度,确保算法的效率和稳定性。

3. 进行了实验数据的输入、输出和结果展示。

通过编写测试用例,对实现的数据结构和算法进行了测试,验证其正确性和可靠性。

4. 对实验结果进行了分析和总结。

通过对实验数据和测试结果的分析,总结了实验中遇到的问题和解决方法,以及实验的收获和体会。

四、实验结果。

经过实验测试,实现的数据结构和算法均能正确运行并得到预期的结果。

通过实验,加深了对数据结构相关知识的理解,提高了编程能力和实际应用能力。

五、实验总结。

本次实验使我对数据结构相关知识有了更深入的理解,同时也提高了我的编程能力和实际应用能力。

在未来的学习和工作中,我将继续努力,不断提升自己的能力,为将来的发展打下坚实的基础。

六、实验感想。

通过本次实验,我深刻感受到了数据结构在实际应用中的重要性,也意识到了自己在数据结构方面的不足之处。

在今后的学习和工作中,我将更加努力地学习和应用数据结构知识,不断提高自己的能力,为未来的发展做好充分的准备。

七、参考文献。

1. 《数据结构与算法分析》。

2. 《C语言程序设计》。

3. 《数据结构课程实验指导书》。

以上就是本次数据结构课程实验的报告内容,希望能对大家有所帮助。

感谢您的阅读!。

数据结构实验实训总结报告

数据结构实验实训总结报告

一、实验背景随着计算机技术的飞速发展,数据结构作为计算机科学的重要基础,已经成为现代软件开发和数据处理的关键技术。

为了提高学生的数据结构应用能力,我们学校开设了数据结构实验实训课程。

本课程旨在通过实验实训,使学生深入理解数据结构的基本概念、性质、应用,掌握各种数据结构的实现方法,提高编程能力和解决实际问题的能力。

二、实验内容本次数据结构实验实训主要包括以下内容:1. 数据结构的基本概念和性质通过实验,使学生掌握线性表、栈、队列、串、树、图等基本数据结构的概念、性质和应用场景。

2. 数据结构的存储结构通过实验,使学生熟悉线性表、栈、队列、串、树、图等数据结构的顺序存储和链式存储方法,了解不同存储结构的优缺点。

3. 数据结构的操作算法通过实验,使学生掌握线性表、栈、队列、串、树、图等数据结构的插入、删除、查找、遍历等基本操作算法。

4. 数据结构的实际应用通过实验,使学生了解数据结构在各个领域的应用,如网络数据结构、数据库数据结构、人工智能数据结构等。

三、实验过程1. 实验准备在实验开始前,教师首先对实验内容进行讲解,使学生了解实验目的、实验步骤和实验要求。

同时,教师要求学生预习实验内容,熟悉相关理论知识。

2. 实验实施(1)线性表:通过实现线性表的顺序存储和链式存储,实现插入、删除、查找等操作。

(2)栈和队列:通过实现栈和队列的顺序存储和链式存储,实现入栈、出栈、入队、出队等操作。

(3)串:通过实现串的顺序存储和链式存储,实现串的插入、删除、查找等操作。

(4)树:通过实现二叉树、二叉搜索树、平衡二叉树等,实现树的插入、删除、查找、遍历等操作。

(5)图:通过实现图的邻接矩阵和邻接表存储,实现图的插入、删除、查找、遍历等操作。

3. 实验总结实验结束后,教师组织学生进行实验总结,总结实验过程中的收获和不足,提出改进措施。

四、实验成果通过本次数据结构实验实训,学生取得了以下成果:1. 掌握了数据结构的基本概念、性质和应用场景。

中南大学数据结构实验报告(七)

中南大学数据结构实验报告(七)

实验七1.需求分析本实验目的是使读者,掌握常用排序方法的基本思想,通过实验加深理解各种排序算法,通过实验掌握各种排序方法的时间复杂度分析,了解各种排序方法的优缺点及适用范围。

1.排序算法的实现(设计性实验)问题描述排序是计算机领域的一项重要技术,是程序设计中的一种重要运算。

它的功能是将一个数据元素的任意序列重新排列成一个按键有序的序列。

学习和研究各种排序方法是计算机工作者的一项重要工作课题。

基本要求随机产生n个整数(依次为n赋值100、200、300、1 000和2 000),将其存于数组A[1..n]中。

对主要算法(顺序查找、插入排序、归并排序、堆排序和快速排序)进行实验比较,计算出平均比较次数c n、平均移动次数m n及执行时间t n。

c n和m n由程序自动计算,t n由系统时间计算。

对实验结果数据进行对比分析。

测试数据由随机数生成器决定。

实现提示(1) 设计一个驱动程序,其任务是,随机输入一组原始数据A[1..n],对于查找还需准备一个键码值(可以随机产生,也可在A[1..n]中按索引号挑选若干有代表性的数据)。

对每组原始数据,分别调用查找或排序算法过程。

(2) 为了自动计算c n和m n需要在每个算法过程中的适当位置插入计数操作。

手工计算每个算法的执行时间t n时,为了减少计时误差,删除所插入的计数操作,并按n的大小确定一个K,对每个查找或排序算法过程反复调用K次,在调用开始前设置一个计时起点t0,在K次调用执行后可打印信息。

设计时的终点为t1,则(t1t0)/K便是算法的大致执行时间。

选作内容对不同的输入表长做试验,观察含义相同的变量相对于表长的变化关系,还可以对稳定性做验证。

2.统计成绩(综合性实验)问题描述给出n个学生的m门考试的成绩表,每个学生的信息由学号、姓名及各科成绩组成。

对学生的考试成绩进行有关统计,并打印统计表。

基本要求(1) 按总数高低次序,打印出名次表,分数相同的为同一名次。

中南大学 计算机体系结构实验报告

中南大学 计算机体系结构实验报告

计算机体系结构课程设计学院:信息科学与工程学院专业班级:指导老师:学号:姓名:.目录实验1 对指令操作码进行霍夫曼编码 (3)一、实验目的 (3)二、实验内容 (3)三、设计思路 (4)四、关键代码 (4)五、实验截图 (5)六、源代码 (5)实验2 使用LRU 方法更新Cache (8)一、实验目的 (8)二、实验内容 (8)三、设计思路 (9)四、程序截图 (9)五、实验代码 (9)实验总结 (16)参考文献 (16).实验1 对指令操作码进行霍夫曼编码一、实验目的了解和掌握指令编码的基本要求和基本原理二、实验内容1. 使用编程工具编写一个程序,对一组指令进行霍夫曼编码,并输出最后的编码结果以及对指令码的长度进行评价。

与扩展操作码和等长编码进行比较。

2. 问题描述以及问题分析举例说明此问题,例如:P1 P2 P3 P4 P5 P6 P70.45 0.30 0.15 0.05 0.03 0.01 0.01下表所示:对此组指令进行 HUFFMAN 编码正如下图所示:最后得到的HUFFMAN 编码如下表所示:最短编码长度为:H=0.45*1+0.30*2+0.15*3+0.05*4+0.03*5+0.01*6+0.01*6=-1.95.要对指令的操作码进行 HUFFMAN 编码,只要根据指令的各类操作码的出现概率构造HUFFMAN 树再进行 HUFFAM 编码。

此过程的难点构造 HUFFMAN 树,进行 HUFFAM 编码只要对你所生成的 HUFFMAN 树进行中序遍历即可完成编码工作。

三、设计思路观察上图,不难看出构造 HUFFMAN 树所要做的工作:1、先对各指令操作码的出现概率进行排序,构造一个有序链表。

2、再取出两个最小的概率节点相加,生成一个生的节点加入到链表中,同时从两表中删除此两个节点。

3、在对链表进行排序,链表是否只有一个节点,是则 HUFFAN 树构造完毕,否则继续做 2 的操作。

数据结构实习报告(共8篇)

数据结构实习报告(共8篇)

数据结构实习报告(共8篇)数据结构实习报告(共8篇)第1篇:数据结构实_报告附件:实_报告格式,如下:数据结构实_报告班级:姓名:xxx(1514)xxx(1514)xxx(1514)指导教师:日期:题目一、问题描述(把你所选的题目及要求说一下)二、概要设计(抽象数据类型定义)三、详细设计(主要算法和函数间的调用关系)四、调试分析(调式过程中出现的问题及如何改正)五、心得体会(组内成员的分工及实_期间的体会)六、用户手册(系统的使用方法介绍)可参照_题集上的实_报告格式。

第2篇:数据结构实_报告数据结构实_报告班级:13软件二班姓名:殷健学号:1345536225子集和数问题1:问题描述子集和数问题1:子集和问题的为W,c。

其中,W=w1,w2,.,wn是一个正整数的集合,子集和数问题判定是否存在W的一个子集W1,使得W1=cW(02:问题分析程序中设计了函数voidputeSumofSub(ints,intk,intr),其意义是从第k项开始,如果s(已经决策的和数)和wk(当前元素)之和为和数,就把结果输出来,否则如果s与,wk,wk+1之和小于和数,则调用puteSumofsub(s+wk,k+1,r-wk),意为选择此结点的左分支,再判断s和后面所有元素之和是否不小于M(所有的加起来都小,必定无解),并且s+wk+1M,也是无解),若条件符合即调用puteSumofSub(s,k+1,r-wk),即选择当前结点的右分支。

算法展示:#includeusingnamespacestd;#include#include#defineM50claSu mOfSubprivate:intwM;intm;intxM;public:SumOfSub(inta,intb, intn)for(inti=0;i=mvoidmain()intsum=0;intwM;srand(unsigne d)time(NULL);for(inti=0;icoutcoutcoutm;sum=m*sum;cout复杂性分析:对于不同的输入结果,算法的执行次数有所不同,最好情况是n,最坏情况是n*2n。

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

中南大学数据结构实验报告实验题目:(1)单链表的实现(2)栈和队列(3)二叉树的遍历(4)查找与排序学生姓名:代巍学生学号:0909121615指导老师:余腊生所在学院:信息科学与工程学院专业班级:信息安全1201班指导教师评定:签名:实验一单链表的实现一、实验目的了解线性表的逻辑结构和各种存储表示方法,以及定义在逻辑结构上的各种基本运算及其在某种存储结构上如何实现这些基本运算。

在熟悉上述内容的基础上,能够针对具体应用问题的要求和性质,选择合适的存储结构设计出相应的有效算法,解决与线性表相关的实际问题二、实验内容用C/C++语言编写程序,完成以下功能:(1)运行时输入数据,创建一个单链表(2)可在单链表的任意位置插入新结点(3)可删除单链表的任意一个结点(4)在单链表中查找结点(5)输出单链表三、程序设计的基本思想,原理和算法描述:(包括程序的结构,数据结构,输入/输出设计,符号名说明等)用一组地址任意的存储单元存放线性表中的数据元素。

以元素(数据元素的映象) + 指针(指示后继元素存储位置) = 结点(表示数据元素或数据元素的映象)以“结点的序列”表示线性表称作线性链表(单链表)单链表是指数据接点是单向排列的。

一个单链表结点,其结构类型分为两部分:(1)、数据域:用来存储本身数据。

(2)、链域或称为指针域:用来存储下一个结点地址或者说指向其直接后继的指针。

1、单链表的查找对单链表进行查找的思路为:对单链表的结点依次扫描,检测其数据域是否是我们所要查好的值,若是返回该结点的指针,否则返回NULL。

2、单链表的插入因为在单链表的链域中包含了后继结点的存储地址,所以当我们实现的时候,只要知道该单链表的头指针,即可依次对每个结点的数据域进行检测。

假设在一个单链表中存在2个连续结点p、q(其中p为q的直接前驱),若我们需要在p、q之间插入一个新结点s,那么我们必须先为s分配空间并赋值,然后使p的链域存储s的地址,s的链域存储q的地址即可。

(p->link=s;s->link=q),这样就完成了插入操作。

3、单链表的删除删除运算思想方法删除运算是将表的第i个结点删去。

具体步骤:找到i-1 的存储位置p令p-next指向i 的直接后继结点释放结点i 的空间,将其归还给"存储池"。

四、源程序及注释#include <iostream.h>#include <stdlib.h>#include <malloc.h>#include <conio.h>#include <time.h>#define ElemType int// 链表类型typedef struct LNode{ElemType data;struct LNode *next;} LNode, *LinkList;int EmptyList(LinkList &L){if(L->next==NULL){return 0;}else{return 1;}}// 手动建立一个带头结点的线性链表Lvoid SCreateList_L(LinkList &L){ LinkList l,p;int i;ElemType d;l=(LinkList) malloc(sizeof(LNode));L=(LinkList) malloc(sizeof(LNode)); //生成头结点l=L;L->next=NULL;cout<<"请依次输入结点值,以0为结束:"<<endl; for(i=1;i=1;){cin>>d;if(d!=0){p=(LinkList) malloc(sizeof(LNode)); //生成新结点p->data=d;p->next=l->next;l->next=p;l=l->next;}else break;}if(EmptyList(L)) cout<<"生成链表成功!!";else cout<<"链表为空,未生成!!";cin.get();cin.get();} //SCreate_L// 自动建立一个带头结点的线性链表Lvoid ZCreateList_L(LinkList &L,int n){ LinkList l,p;l=(LinkList) malloc(sizeof(LNode));L=(LinkList) malloc(sizeof(LNode)); //生成头结点l=L;L->next=NULL;srand((unsigned)time(NULL));for(int i=n;i>0;--i){p=(LinkList) malloc(sizeof(LNode)); //生成新结点p->data=(rand()%100+1);p->next=l->next;l->next=p;l=l->next;}cout<<"生成链表成功!!";cin.get();cin.get();} //ZCreate_L//建立一个带头结点的线性链表LinkList CreateList_L(){ char c;int n;LinkList L;cout<<"*********建立线性链表*********"<<endl;cout<<"1.手动建立"<<endl;cout<<"2.自动建立"<<endl;cout<<"******************************"<<endl;cin>>c;if(c=='1') {SCreateList_L(L);}else if(c=='2') {cout<<"请输入链表结点的个数:";cin>>n;ZCreateList_L(L,n);} else {cout<<"输入错误,请重新输入:"<<endl;}return L;cin.get();cin.get();}// 计算线性链表L中结点的个数int LengthList(LinkList &L){LinkList p=L->next;int i=0;while (p){++i;p=p->next;}return i;cin.get();cin.get();} //LengthList// 在线性链表L中第i个结点之前插入新的数据元素e void ListInsert_L(LinkList &L){int i;ElemType e;cout<<"第i个结点之前插入新的结点,请输入i:"; cin>>i;while(i<=0 || i>LengthList(L)){cout<<"位置错误,重新输入插入位置:" ;cin>>i;}LinkList p,s;p=L;int j=0;while(p && j<i-1) {p=p->next;++j;}if(!p || j>i-1) {cout<<"输入错误!!"; cin.get();cin.get();}else {cout<<"新结点的数据为:";cin>>e;s=(LinkList) malloc(sizeof(LNode));s->data=e;s->next=p->next;p->next=s;cout<<"插入成功!!";}cin.get();cin.get();} //ListInsert_L// 删除线性链表L中的第i个结点void ListDelete_L(LinkList &L){int i;ElemType e;cout<<"请输入要删除第i个结点的i值:"; cin>>i;while(i<=0 || i>LengthList(L)){cout<<"位置错误,重新输入删除位置:";cin>>i;}LinkList p,q;p=L; int j=0;q=(LinkList) malloc(sizeof(LNode));while (p->next && j<i-1){p=p->next;++j;} //寻找第i个结点if(!(p->next) || j>i-1) {cout<<"删除位置不合理"; cin.get();cin.get();}else{q=p->next;p->next=q->next;e=q->data;cout<<"删除成功!!"<<endl<<"删除的结点值为:"<<e; free(q); //删除并释放结点}cin.get();cin.get();} //ListDelete_L// 输出线性链表L中的所有数据元素void PrintList(LinkList &L){LinkList p=L->next;cout<<"所有数据如下所示:"<<endl;while (p){cout<<p->data<<" ";p=p->next;}cin.get();cin.get();} //PrintListvoid SearchList(LinkList &L)//查找某一结点,显示其位置{int i=0;ElemType n;cout<<"请输入要找的数据:";cin>>n;if(L==NULL) {cout<<"链表为空!!";}LinkList p=L->next;while (p->data!=n && p->next!=NULL) {p=p->next; i=i+1;}if(p->data==n) {cout<<"找到了对应的结点,在链表的第"<<i+1<<"位上!";} else cout<<"链表上找不到相应的的结点!!";cin.get();cin.get();}void DestroyList(LinkList &L)//退出系统前,内部做结尾工作{while(L){LinkList p;p=L;L=L->next;free(p);}L=NULL;cout<<"线性链表L已销毁!!"<<endl;}//DestroyListint menu_select() //选择函数{char *m[7]={ "1.建立线性链表","2.某一结点前插入一个结点","3.删除一个结点","4.计算结点个数并输出","5.查找并显示某一结点位置","6.输出所有节点","0.退出系统"};int i;char c1;do{system("cls");/*清屏*/cout<<"\n\n=========链表的基本操作=========\n\n"; for(i=0;i<7;i++)cout<<m[i]<<endl;cout<<"\n==================================\n"; cout<<"请选择(1-6,0):";cin>>c1;}while(c1<'0'||c1>'6');return(c1-'0');}void main(){LinkList L=NULL;for( ; ; ){switch(menu_select()){case 1:L=CreateList_L();system("pause");break;case 2:if(L!=NULL) ListInsert_L(L); else {cout<<"链表为空,请先建链表!!"; cin.get();cin.get();break;}system("pause");break;case 3:if(L!=NULL) ListDelete_L(L); else {cout<<"链表为空,请先建链表!!"; cin.get();cin.get();break;}system("pause");break;case 4:if(L!=NULL) {int i=LengthList(L);cout<<"结点的个数为:"<<i; cin.get();cin.get();}else {cout<<"链表为空,请先建链表!!";cin.get();cin.get();break;}system("pause");break;case 5:if(L!=NULL) SearchList(L);else {cout<<"链表为空,请先建链表!!";cin.get();cin.get();break;}system("pause");break;case 6:if(L!=NULL) PrintList(L);else {cout<<"链表为空,请先建链表!!";cin.get();cin.get();break;}system("pause");break;case 0:if(L!=NULL) DestroyList(L); exit(0);}}}五、实验结果实验二栈和队列一、实验目的了解栈和队列的特性。

相关文档
最新文档