东北大学数据结构实验报告
数据结构实验报告实验总结

数据结构实验报告实验总结本次数据结构实验主要涉及线性表、栈和队列的基本操作以及链表的应用。
通过实验,我对这些数据结构的特点、操作和应用有了更深入的了解。
下面对每一部分实验进行总结。
实验一:线性表的基本操作线性表是一种常见的数据结构,本实验要求实现线性表的基本操作,包括插入、删除、查找、遍历等。
在实验过程中,我对线性表的结构和实现方式有了更清晰的认识,掌握了用数组和链表两种方式实现线性表的方法。
实验二:栈的应用栈是一种后进先出(LIFO)的数据结构,本实验要求利用栈实现简单的括号匹配和后缀表达式计算。
通过实验,我了解到栈可以方便地实现对于括号的匹配和后缀表达式的计算,有效地解决了对应的问题。
实验三:队列的应用队列是一种先进先出(FIFO)的数据结构,本实验要求利用队列实现银行排队和迷宫求解。
通过实验,我对队列的应用有了更加深入的了解,了解到队列可以解决需要按顺序处理的问题,如排队和迷宫求解等。
实验四:链表的应用链表是一种常用的数据结构,本实验要求利用链表实现学生信息管理系统。
通过实验,我对链表的应用有了更深入的了解,了解到链表可以方便地实现对于数据的插入、删除和修改等操作,并且可以动态地调整链表的长度,适应不同的需求。
通过本次实验,我掌握了线性表、栈、队列和链表的基本操作,并了解了它们的特点和应用方式。
同时,通过实际编程的过程,我对于数据结构的实现方式和效果有了更直观的认识,也锻炼了自己的编程能力和解决问题的能力。
在实验过程中,我遇到了一些问题,如程序逻辑错误和内存泄漏等,但通过调试和修改,最终成功解决了这些问题,对自己的能力也有了更多的信心。
通过本次实验,我深刻体会到了理论与实践的结合的重要性,也对于数据结构这门课程有了更加深入的理解。
总之,本次数据结构实验给予了我很多有益的启发和收获,对于数据结构的概念、特点和应用有了更深入的理解。
在以后的学习中,我会继续加强对数据结构的学习和研究,不断提高自己的编程能力和解决问题的能力。
数据结构实验三实验报告

数据结构实验三实验报告数据结构实验三实验报告一、实验目的本次实验的目的是通过实践掌握树的基本操作和应用。
具体来说,我们需要实现一个树的数据结构,并对其进行插入、删除、查找等操作,同时还需要实现树的遍历算法,包括先序、中序和后序遍历。
二、实验原理树是一种非线性的数据结构,由结点和边组成。
树的每个结点都可以有多个子结点,但是每个结点只有一个父结点,除了根结点外。
树的基本操作包括插入、删除和查找。
在本次实验中,我们采用二叉树作为实现树的数据结构。
二叉树是一种特殊的树,每个结点最多只有两个子结点。
根据二叉树的特点,我们可以使用递归的方式实现树的插入、删除和查找操作。
三、实验过程1. 实现树的数据结构首先,我们需要定义树的结点类,包括结点值、左子结点和右子结点。
然后,我们可以定义树的类,包括根结点和相应的操作方法,如插入、删除和查找。
2. 实现插入操作插入操作是将一个新的结点添加到树中的过程。
我们可以通过递归的方式实现插入操作。
具体来说,如果要插入的值小于当前结点的值,则将其插入到左子树中;如果要插入的值大于当前结点的值,则将其插入到右子树中。
如果当前结点为空,则将新的结点作为当前结点。
3. 实现删除操作删除操作是将指定的结点从树中移除的过程。
我们同样可以通过递归的方式实现删除操作。
具体来说,如果要删除的值小于当前结点的值,则在左子树中继续查找;如果要删除的值大于当前结点的值,则在右子树中继续查找。
如果要删除的值等于当前结点的值,则有三种情况:- 当前结点没有子结点:直接将当前结点置为空。
- 当前结点只有一个子结点:将当前结点的子结点替代当前结点。
- 当前结点有两个子结点:找到当前结点右子树中的最小值,将其替代当前结点,并在右子树中删除该最小值。
4. 实现查找操作查找操作是在树中寻找指定值的过程。
同样可以通过递归的方式实现查找操作。
具体来说,如果要查找的值小于当前结点的值,则在左子树中继续查找;如果要查找的值大于当前结点的值,则在右子树中继续查找。
数据结构实训实验报告

一、实验背景数据结构是计算机科学中一个重要的基础学科,它研究如何有效地组织和存储数据,并实现对数据的检索、插入、删除等操作。
为了更好地理解数据结构的概念和原理,我们进行了一次数据结构实训实验,通过实际操作来加深对数据结构的认识。
二、实验目的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)二叉树和图的存储结构实现复杂,但能够有效地表示和处理数据。
东北大学数据结构实验分析

课程编号:B0801010501.实验目的实验一:1.理解队列的概念以及用法2.掌握queue类的使用3.熟练运用队列先进先岀,模拟打印机的工作过程实验二:1.理解图的概念2.理解并掌握图的存储,并利用邻接表来存储图的信息3.理解并掌握Dijkstra算法4.运用Dijkstra算法解决最短路径的问题针对每次实验,写岀你认为比较重要的实验目的2.实验内容与实验步骤2.1打印机模拟程序的内容与步骤(1)简短明确地写岀实验的内容模拟打印机打印的过程,以先来先服务的策略来完成打印工作。
先从一个文件中读取所有任务的大小与到达时间,并将其存储在workload队列中。
使用一个计数器来模拟时间的流逝,当当前时间与workload队列中的一个任务的到达时间相等的时候,该任务被弹岀,并被压入到另一个等待执行的队列中。
该等待执行的队列以先入先出的准则依次弹出任务并执行。
最后计算出任务总数与,总等待时间,平均等待时间。
(2)简短描述抽象数据类型或设计的函数描述,说明为什么要使用这种抽象数据类型,并说明你的解决设想①一个simulator的抽闲类和它的实现类fifo类。
该类的simulate函数用来实现先进先岀策略的打印算法。
②两个队列,一个workload队列,一个是等待执行队列。
Workload队列中存放的是所有的打印任务,通过文件读取并保存。
而等待执行队列则是为了实现FIFO功能的队列,即时间小的就先被压入等待执行队列,自然也就先被pop并执行。
解决设想:利用一个int型变量模拟时间的流逝,然后当等待执行队列为空的时候,就不断循环检查workload队列中是否有任务到达,若有则将其弹岀并push进等待执行队列。
而当等待执行队列中有任务时则执行它,并且同时判断workload队列中是否有任务到达。
若workload和等待执行队列同时为空了,则程序结束。
-1 -⑶简短明确地写岀你实验所采用的存储结构及其用途,详细说明其中的属性的含义。
数据结构实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中重要的基础课程,通过本次实验,旨在深入理解和掌握常见数据结构的基本概念、操作方法以及在实际问题中的应用。
具体目的包括:1、熟练掌握线性表(如顺序表、链表)的基本操作,如插入、删除、查找等。
2、理解栈和队列的特性,并能够实现其基本操作。
3、掌握树(二叉树、二叉搜索树)的遍历算法和基本操作。
4、学会使用图的数据结构,并实现图的遍历和相关算法。
二、实验环境本次实验使用的编程环境为具体编程环境名称,编程语言为具体编程语言名称。
三、实验内容及步骤(一)线性表的实现与操作1、顺序表的实现定义顺序表的数据结构,包括数组和表的长度等。
实现顺序表的初始化、插入、删除和查找操作。
2、链表的实现定义链表的节点结构,包含数据域和指针域。
实现链表的创建、插入、删除和查找操作。
(二)栈和队列的实现1、栈的实现使用数组或链表实现栈的数据结构。
实现栈的入栈、出栈和栈顶元素获取操作。
2、队列的实现采用循环队列的方式实现队列的数据结构。
完成队列的入队、出队和队头队尾元素获取操作。
(三)树的实现与遍历1、二叉树的创建以递归或迭代的方式创建二叉树。
2、二叉树的遍历实现前序遍历、中序遍历和后序遍历算法。
3、二叉搜索树的操作实现二叉搜索树的插入、删除和查找操作。
(四)图的实现与遍历1、图的表示使用邻接矩阵或邻接表来表示图的数据结构。
2、图的遍历实现深度优先遍历和广度优先遍历算法。
四、实验结果与分析(一)线性表1、顺序表插入操作在表尾进行时效率较高,在表头或中间位置插入时需要移动大量元素,时间复杂度较高。
删除操作同理,在表尾删除效率高,在表头或中间删除需要移动元素。
2、链表插入和删除操作只需修改指针,时间复杂度较低,但查找操作需要遍历链表,效率相对较低。
(二)栈和队列1、栈栈的特点是先进后出,适用于函数调用、表达式求值等场景。
入栈和出栈操作的时间复杂度均为 O(1)。
2、队列队列的特点是先进先出,常用于排队、任务调度等场景。
东北大学数据结构实验报告

.. ... ... 实 验 报 告一、实验目的(1) 掌握线性表的基本操作(插入、删除、查找)以及线性表合并等运算在顺序存储结构、链式存储结构上的实现。
重点掌握链式存储结构实现的各种操作。
(2) 掌握线性表的链式存储结构的应用。
二、实验内容与实验步骤(1)实验内容:实现约瑟夫环,约瑟夫环(Joseph )问题的一种描述是:编号为1、2、3……n 的n 个人按照顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数的上限值m ,从第一个人开始按照顺时针的方向自1开始顺序报数,报到m 时停止报数。
报m 的人出列,将他的密码作为新的m 值,从他的顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
设计一个程序求出出列顺序。
(2)抽象数据类型和设计的函数描述,说明解决设想。
首先定义一个链表,用其中的data 项存储每个人的编号,用password 项存储每个人所持有的密码,并且声明一个指针。
之后使用CreatList_CL 函数来创建一个循环链表,在其中的data 和password 中存入编号和密码,最后使最后一个节点的next 指向L ,使其能够形成循环队列。
定义了函数Display 来显示链表当中的内容,以确定存储的数据没有错误。
定义了函数Delete_L 来实现约瑟夫环中依次删除的功能,依次比较,如果某个人所持的密码和m 值相等,则删除这个结点,并且输出此时该结点的编号和密码,实现出列的功能。
(3) 简短明确地写出实验所采用的存储结构,并加以说明。
该实验我主要采用的是线性表的链式存储结构,首先定义了链表的结构,其中包括data 项和password 项,分别存储每个人的编号和所持密码,还声明了指向下一个结点的指针,该指针可以连接各个结点,并且将最后一个结点的指针指向第一个结点使之成为一个循环链表。
三、实验环境操作系统:Windows 7调试软件名称:Visio Studio2017 上机地点:信息楼B405 四、实验过程与分析(1)主要的函数或操作内部的主要算法,分析这个算法的时、空复杂度,并说明设计的巧妙之处。
东北大学数据结构运动会竞赛成绩统计实验报告

《数据结构》实验报告实验内容:运动会竞赛成绩统计数据结构实验报告一.课题概述 (1)二.概要设计原理 (1)三.详细程序清单及注释说明 (2)四.运行与测试及结果 (7)五.本人编写函数 (11)六.心得体会 (13)七.参考文献 (13)一、课题概述1.实验目的:线性表应用类实验题目参考2.实验内容:运动会竞赛成绩统计【问题描述】东北大学第51届运动大会成功举行。
共有N个学院的男女代表队参赛。
大会共设M个男子项目和W个女子项目。
大会即将闭幕,准备公布成绩。
【实验要求】设计运动会竞赛成绩统计程序。
(1)采用顺序表或链表等数据结构。
(2)统计各代表队的男女总分和团体总分。
(3)公布各单项成绩的前六名和团体成绩的前三名。
(4)可以查询成绩。
二、概要设计原理本程序主要采用了链表的存储结构,实现了对数据的存储,访问等操作。
本程序实现了男子团体成绩、女子团体成绩、总成绩的输出。
以及对个单项和团体成绩的前六名的输出。
并实现了查找功能。
程序主要分为四个函数:1.Zongfen()这个函数主要实现计算各学院的男子总分、女子总分、以及团体总分的计算以及存储操作。
2.tuandui_paiming()此函数运用了排顺函数,实现了对团体总分的排序,以及前六名的输出。
3.danxiang_paiming()此函数运用了排序函数,实现了对单项成绩的排名,以及对各个单项前六名的输出。
4.chazhao()通过此函数,可以实现对各个学院的查找,并且显示出各个学院的单项成绩,以及男子团体成绩、女子团体成绩、总成绩的输出。
5.main()6.主函数,实现对所有函数的协调,并且执行了一些程序中相当关键的部分,对整个程序的执行以及正确的输出起到了很大的作用。
7.zhujiemain()主界面函数,实现函数运行时界面的输出,以及对接下来操作的选择,是整个程序的关键部分。
三、详细程序清单及注释说明#include<>#include<>#include<>typedef struct xueyuan{char name[10]; 成绩及团体排名 ----\n""---- 2.单项排名----\n""---- 3.查找----\n""---- 其他.退出----\n""----------------------------------------------------\n");int choose;printf("请输入您的选择:");scanf("%d",&choose);switch(choose){case 1:zongfen();tuandui_paiming();break;case 2:danxiang_paiming();break;case 3:chazhao();break;default:exit(0);}}void main() 界面2.各学院总分3.团体总分4.单项排名5.查找—信息---机械6.退出五.本人编写函数#include<>#include<>#include<>typedef struct xueyuan{char name[10]; 成绩及团体排名 ----\n""---- 2.单项排名----\n""---- 3.查找----\n""---- 其他.退出----\n""----------------------------------------------------\n");int choose;printf("请输入您的选择:");scanf("%d",&choose);switch(choose){case 1:zongfen();tuandui_paiming();break;case 2:danxiang_paiming();break;case 3:chazhao();break;default:exit(0);}}void main() //主函数{shuju();zhujiemian();}六.心得体会通过这次的程序设计,使自己对链表的操作有了更进一步的了解。
数据结构第一次实验报告

数据结构第一次实验报告实验报告:数据结构第一次实验摘要:本次实验旨在通过实践操作,加深对数据结构的理解,并掌握数据结构的基本操作。
实验中,我们使用C++编程语言实现了链表、栈和队列的相关操作,并对其进行了测试和分析。
实验结果表明,我们成功地完成为了链表、栈和队列的实现,并验证了它们的正确性和效率。
1. 引言数据结构是计算机科学中的重要基础课程,它研究数据的组织方式和存储结构,以及对数据进行操作和处理的方法。
本次实验旨在通过实践操作,加深对数据结构的理解,并掌握数据结构的基本操作。
2. 实验目的- 熟悉链表、栈和队列的基本概念;- 掌握链表、栈和队列的基本操作;- 分析链表、栈和队列的时间复杂度。
3. 实验方法3.1 链表的实现我们使用C++编程语言实现了链表的基本操作,包括创建链表、插入节点、删除节点和打印链表等。
具体实现过程如下:- 定义一个链表节点结构体,并在结构体中定义节点的数据域和指针域;- 创建链表,即定义一个头节点,并设置头节点的指针域为空;- 插入节点,即在链表中指定位置插入一个新节点;- 删除节点,即删除链表中指定位置的节点;- 打印链表,即遍历链表并输出节点的数据。
3.2 栈的实现我们使用C++编程语言实现了栈的基本操作,包括入栈、出栈和判断栈是否为空等。
具体实现过程如下:- 定义一个栈结构体,并在结构体中定义一个数组和一个指针top,用于存储栈元素和指示栈顶位置;- 入栈,即将一个元素压入栈中,同时将指针top向上挪移一个位置;- 出栈,即将栈顶元素弹出栈,同时将指针top向下挪移一个位置;- 判断栈是否为空,即判断指针top是否指向栈底。
3.3 队列的实现我们使用C++编程语言实现了队列的基本操作,包括入队、出队和判断队列是否为空等。
具体实现过程如下:- 定义一个队列结构体,并在结构体中定义一个数组、一个指针front和一个指针rear,用于存储队列元素和指示队首和队尾位置;- 入队,即将一个元素插入队列尾部,同时将指针rear向后挪移一个位置;- 出队,即将队首元素删除,同时将指针front向后挪移一个位置;- 判断队列是否为空,即判断指针front和指针rear是否相等。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验报告课程名称:数据结构班级:实验成绩:实验名称:顺序表和链表的应用学号:批阅教师签字:实验编号:实验一:实验日期:2017-11-25指导教师:组号:实验时间:18:30~22:30一、实验目的(1)掌握线性表的基本操作(插入、删除、查找)以及线性表合并等运算在顺序存储结构、链式存储结构上的实现。
重点掌握链式存储结构实现的各种操作。
(2)掌握线性表的链式存储结构的应用。
二、实验容与实验步骤(1)实验容:实现约瑟夫环,约瑟夫环(Joseph)问题的一种描述是:编号为1、2、3……n的n个人按照顺时针方向围坐一圈,每人持有一个密码(正整数)。
一开始任选一个正整数作为报数的上限值m,从第一个人开始按照顺时针的方向自1开始顺序报数,报到m时停止报数。
报m的人出列,将他的密码作为新的m值,从他的顺时针方向上的下一个人开始重新从1报数,如此下去,直至所有人全部出列为止。
设计一个程序求出出列顺序。
(2)抽象数据类型和设计的函数描述,说明解决设想。
首先定义一个链表,用其中的data项存储每个人的编号,用password项存储每个人所持有的密码,并且声明一个指针。
之后使用CreatList_CL函数来创建一个循环链表,在其中的data和password中存入编号和密码,最后使最后一个节点的next指向L,使其能够形成循环队列。
定义了函数Display来显示链表当中的容,以确定存储的数据没有错误。
定义了函数Delete_L来实现约瑟夫环中依次删除的功能,依次比较,如果某个人所持的密码和m 值相等,则删除这个结点,并且输出此时该结点的编号和密码,实现出列的功能。
(3)简短明确地写出实验所采用的存储结构,并加以说明。
该实验我主要采用的是线性表的链式存储结构,首先定义了链表的结构,其中包括data 项和password项,分别存储每个人的编号和所持密码,还声明了指向下一个结点的指针,该指针可以连接各个结点,并且将最后一个结点的指针指向第一个结点使之成为一个循环链表。
三、实验环境操作系统:Windows 7调试软件名称:Visio Studio2017上机地点:信息楼B405四、实验过程与分析(1)主要的函数或操作部的主要算法,分析这个算法的时、空复杂度,并说明设计的巧妙之处。
本实验中主要的函数包括创建链表、显示链表容和出列过程四个部分。
主要函数的代码如下:创建链表:typedef int Datatype;typedef struct node//链表的定义{Datatype data;int password;struct node *next;}ListNode,*CLinkList;void CreatList_CL(CLinkList *L,int n)//创建一个链表{int i,pin;CLinkList p,q;(*L)=(CLinkList)malloc(sizeof(ListNode));if((*L)==NULL)printf("error\n");else(*L)->next=NULL;q=*L;for(i=0;i<n;i++){p=(CLinkList)malloc(sizeof(ListNode));if(p==NULL)printf("error\n");printf("请输入第%d个人的密码:",i+1);scanf("%d",&pin);p->data=i+1;p->password=pin;q->next=NULL;q->next=p;q=p;}q->next=(*L)->next;//指向L结点,形成}创建这个链表的时间复杂度为O(n),空间复杂度为O(n2)。
显示链表中的信息容:void Display(CLinkList *L,int n){int i;CLinkList p;p=(*L)->next;printf("\n显示链表容\n");for(i=0;i<n;i++){printf("编号:%2d 密码:%d\n",p->data,p->password);p=p->next;}}该算法的时间复杂度为O(n),空间复杂度为O(n2)。
删除结点,完成出列功能:void Delete_L(CLinkList *L,int n,int m){int i=0,j;CLinkList p,q;q=(*L);p=(*L)->next;printf("\n删除的顺序:\n");while(i<n){for(j=0;j<m-1;j++){q=p;p=p->next;}printf("编号:%d 密码:%d\n",p->data,p->password);m=p->password;q->next=p->next;free(p);p=q->next;n--;}}该算法的时间复杂度为O(n2),空间复杂度为O(n2)。
该设计的巧妙之处在于并不需要额外的空间来存储数据,因而空间复杂度较低,而且线性表的链式存储结构可以用物理位置上的邻接关系来表示结点间的逻辑关系,这样使读者在阅读代码的过程中可以更加方便和便于理解。
它可以随机存取表中的任一结点,还可以免插入和删除操作带来的大量的结点的移动,能给结点动态分配存,这样就不存在存储空间不足的情况,而且循环链表还可以方便的从链表的最后一个结点遍历到链表的第一个结点。
使操作更加方便。
(2)你在调试过程中发现了怎样的问题?又做了怎样的改进1)在最开始的调试阶段,我发现链表插入结束之后,不能按照正常情况下输出链表的容,只能正常显示第一个人的数据,在显示第二个人的信息是数据为乱码。
之后我发现,在插入链表的过程中,我是在执行循环插入数据的循环中将结点的指针指向了第一个结点,因而,在进行链表显示的过程中,第二个结点的容不是正常的数据。
之后我将q->next=(*L)->next;这条指令放到了整个插入循环的外部,这样表示在插入所有数据之后,最后一个结点的指针指向了第一个结点,形成了一个循环队列,此时链表的数据显示正确。
2)再次调试时,我发现人员出列时,只有第一个人出列正常,在第二个人出列时程序自动终止,不能正常显示之后出列的人的信息,并且程序自动终止运行,经过检查我发现在经过一次删除后,没有将指针指向下一个结点,因而出现问题。
经过更改,程序运行正常。
3)在实验的开始阶段,数据遍历总是出现问题,经过查找资料我发现了约瑟夫环头结点的特殊性,因此我不再使用头结点,程序便恢复正常了。
(2)测试结果五、实验结果总结回答以下问题:(1)你的测试充分吗?为什么?你是怎样考虑的?答:我认为我的测试充分,因为我随机选用了很多组不同的数据进行测试,并且每次测试的结果都是正确的答案,这样选取的数据具有很强的随机性,具有代表性,因而我认为我的测试比较充分。
(2)你的存储结构的选取是不是很适合这个应用?为什么?答:我认为我选取的线性链式存储结构适合这个应用,因为首先此题中描述的情景中表示人们按照顺时针的方向进行排队,此时头尾相连,这与循环链表的结构十分相似,使用循环链表的结构,这样可以很方便的从链表的最后一个结点访问到链表的第一个结点,并且这样的存储方式是用物理位置上的邻接关系来表示结点间的逻辑关系,根据这个特点,该种结构可以随机存取表中的任一结点,而且它也可以避免插入和删除操作带来的大量结点的移动,并且可以随时分配空间和释放空间,这样可以减少空间的使用量,并且可以做到灵活的扩充空间,这样的结构很适合这个应用。
(3)用一段简短的代码及说明论述你的应用中有关插入和删除元素是如何做的?答:插入元素:首先定义了两个临时指针p和q来分别表示新插入结点的指针和第一个结点的指针,在每次插入之前应该动态的分配存,输入要输入的信息,并且将各种数据存储到链表中相应的项里,将前一个结点的next赋值为空,再将前一个结点的指针指向下一个结点,此时完成一个元素的插入。
依次类推,运用循环来实现所有人的数据的插入,关键代码如下:p=(CLinkList)malloc(sizeof(ListNode));if(p==NULL)printf("error\n");printf("请输入第%d个人的密码:",i+1);scanf("%d",&pin);p->data=i+1;p->password=pin;q->next=NULL;q->next=p;q=p;删除元素:进行循环来实现每个元素出列的功能,首先每个人进行循环,一次进行报数,在报到m-1之前都不进行删除元素这个动作,在m时,把此时结点中的password中的数值赋给m然后运用q->next=p->next;将结点删除,同时释放结点p,将人数减1,以此类推完成所有的删除操作,直到所有的元素出列,关键代码如下:while(i<n){for(j=0;j<m-1;j++){q=p;p=p->next;}printf("编号:%d 密码:%d\n",p->data,p->password);m=p->password;q->next=p->next;free(p);p=q->next;n--;}(4)在你的应用中是否用到了头结点?你觉得使用头结点为你带来方便了吗?答:在我的应用中我没有用到头结点。
在实验的一开始,我使用了头结点,但是使用头结点给数据的遍历带来了困难,因此我便放弃使用头结点。
(5)源程序的大致的执行过程是怎样的?答:首先用编译器编写一个.c的文件,然后编译生成.obj的文件,通过连接将目标文件连接生成一个.exe文件,之后运行文件就可以执行了。
六、附录(1)实验设想和建议这次实验提高了我对数据结构中关于循环链表和顺序表的理解,提高了我的编程能力,学校以后最好可以增加实验课的课时,这样我们可以更大程度的提高自己的编程能力。
另外我认为该实验不仅可以使用使用链表指针来实现,还可以使用数组来模拟链表来实现约瑟夫环,用数组的下标来指向前一个和后一个元素,之后进行删除来实现约瑟夫环。
(2)参考资料:《数据结构(第二版)》闫玉宝编著清华大学实验报告课程名称:数据结构班级:实验成绩:实验名称:栈、队列、字符串和数组学号:批阅教师签字:实验编号:实验二:实验日期:2017-11-20指导教师:组号:实验时间:18:30~22:30一、实验目的(1)掌握栈、队列、串和数组的抽象数据类型的特征。