实验报告(数据结构(本)-作业5)(实验2)
数据结构实验报告实验5

数据结构实验报告实验5一、实验目的本次实验的主要目的是深入理解和掌握常见的数据结构,如链表、栈、队列、树和图等,并通过实际编程实现,提高对数据结构的操作和应用能力。
同时,培养解决实际问题的思维和编程能力,提高代码的可读性、可维护性和效率。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容1、链表的基本操作创建链表插入节点删除节点遍历链表2、栈的实现与应用用数组实现栈用链表实现栈栈的应用:括号匹配3、队列的实现与应用用数组实现队列用链表实现队列队列的应用:排队模拟4、二叉树的遍历前序遍历中序遍历后序遍历5、图的表示与遍历邻接矩阵表示法邻接表表示法深度优先遍历广度优先遍历四、实验步骤1、链表的基本操作创建链表:首先定义一个链表节点结构体,包含数据域和指向下一个节点的指针域。
然后通过动态内存分配创建链表节点,并将节点逐个连接起来,形成链表。
插入节点:根据插入位置的不同,分为在表头插入、在表尾插入和在指定位置插入。
在指定位置插入时,需要先找到插入位置的前一个节点,然后进行节点的连接操作。
删除节点:同样需要根据删除位置的不同进行处理。
删除表头节点时,直接将头指针指向下一个节点;删除表尾节点时,找到倒数第二个节点,将其指针置为空;删除指定位置节点时,找到要删除节点的前一个节点,然后调整指针。
遍历链表:通过从链表头开始,依次访问每个节点,输出节点的数据。
2、栈的实现与应用用数组实现栈:定义一个固定大小的数组作为栈的存储空间,同时用一个变量记录栈顶位置。
入栈操作时,先判断栈是否已满,如果未满则将元素放入栈顶位置,并更新栈顶位置;出栈操作时,先判断栈是否为空,如果不空则取出栈顶元素,并更新栈顶位置。
用链表实现栈:与链表的操作类似,将新元素添加在链表头部作为栈顶。
括号匹配:输入一个包含括号的字符串,使用栈来判断括号是否匹配。
遇到左括号入栈,遇到右括号时与栈顶的左括号进行匹配,如果匹配成功则出栈,否则括号不匹配。
数据结构C语言版实验五报告

数据结构C语言版实验五报告实验五一、实验目的1、理解二叉树的类型定义域性质。
2、掌握二叉树的二叉链表储存结构的表示和实现方法。
3、掌握二叉树遍历操作的算法实现。
4、熟悉二叉树遍历操作的应用。
二、实验内容1、建立二叉树的二叉链表储存结构。
2、实现二叉树的先序、中序和后序三种遍历操作(验证性内容)。
3、应用二叉树的遍历操作来实现判断儿科二叉树是否相等的操作(设计性内容)。
4、求从二叉树根结点到指定结点P之间的路径(应用性设计内容)。
三、验证性实验1、实验要求编程实现如下功能:(1)假如二叉树的结点值是字符,根据输入的一颗二叉树的完整先序遍历序列建立一颗以二叉树链表表示的二叉树。
(2)对二叉树进行先序、中序和后序遍历操作,并输出表里序列,观察输出的序列是否与逻辑上的序列一致。
(3)主程序中要求设计一个菜单,允许用户通过菜单来多次选择执行哪一种遍历操作。
2、参考代码:#include#includetypedef struct Bitnode{char data;struct Bitnode *lchild,*rchild;}Bitnode,*Bitree;Bitree create(Bitree T)//创建树{char x;scanf("%c",&x);if(x=='#')T=NULL;else{T=(Bitree)malloc(sizeof(Bitnode));T->data=x;T->lchild=create(T->lchild);T->rchild=create(T->rchild);}return T;Bitree preorder(Bitree T)//前序{if(T!=NULL){printf("%c",T->data);T->lchild=preorder(T->lchild);T->rchild=preorder(T->rchild);}return T;}Bitree InOrderTraverse(Bitree T)//中序{if(T!=NULL){T->lchild=InOrderTraverse(T->lchild); printf("%c",T->data);T->rchild=InOrderTraverse(T->rchild); }return T;}Bitree PostOrderTraverse(Bitree T)//后序{if(T!=NULL){T->lchild=PostOrderTraverse(T->lchild); T->rchild=PostOrderTraverse(T->rchild); printf("%c",T->data);}return T;}int first=0,last=0;Bitree a[10];int Enter(Bitree a[],Bitree e){last=last%10;a[last++]=e;return 0;}Bitree Exit(Bitree a[])first=first%10;return a[first++];}void LeveOrderTraverse(Bitree T)//层序{Enter(a,T);if(T)while(first!=last){K=Exit(a);printf("%c",K->data);if(K->lchild)Enter(a,K->lchild);if(K->rchild)Enter(a,K->rchild);}}void main(){int i=1;char x,y;Bitree T=NULL;printf("create two tree\n");T=create(T);int i;printf("1----前序遍历\n2----中序遍历\n3----后序遍历\n4----层序遍历\n");scanf("%d",&i);if(i==1)preorder(T);if(i==2)InOrderTraverse(T);if(i==3)PostOrderTraverse(T);LeveOrderTraverse(T);printf("\n");}四、设计性实验编程实现根据二叉树的先序遍历序列和中序遍历序列来建立两颗二叉树,并判断这两颗二叉树是否相等。
数据结构_实验五_报告

实验报告实验五图的遍历及其应用实现一、实验目的1.熟悉图常用的存储结构。
2.掌握在图的邻接矩阵和邻接表两种结构上实现图的两种遍历方法实现。
3.会用图的遍历解决简单的实际问题。
二、实验内容[题目一] :从键盘上输入图的顶点和边的信息,建立图的邻接表存储结构,然后以深度优先搜索和广度优先搜索遍历该图,并输出起对应的遍历序列. 试设计程序实现上述图的类型定义和基本操作,完成上述功能。
该程序包括图类型以及每一种操作的具体的函数定义和主函数。
[题目二]:在图G中求一条从顶点 i 到顶点 s 的简单路径设计要求:1、上机前,认真学习教材,熟练掌握图的构造和遍历算法,图的存储结构也可使用邻接矩阵等其他结构.2、上机前,认真独立地写出本次程序清单,流程图。
图的构造和遍历算法分别参阅讲义和参考教材事例三、实验步骤㈠、数据结构与核心算法的设计描述#define MAX_VERTEX_NUM 20//变量声明typedef struct ArcNode//弧结点定义{int adjvex; //该弧所指向的顶点的位置struct ArcNode *nextarc;//指向下一条弧的指针//InfoType *info;}ArcNode;typedef struct VNode//顶点结点定义{char data; //顶点信息ArcNode *firstarc; //指向第一条依附该顶点的弧的指针}VNode,AdjList[MAX_VERTEX_NUM];typedef struct//图的定义{AdjList vertices;int vexnum,arcnum; //图的当前顶点数和弧数int kind; //图的种类标志}ALGraph;ALGraph G; //定义图变量bool visited[MAX_VERTEX_NUM]; //访问标志数组typedef struct QueueNode//队列结点类型定义{int data; //结点中所存值QueueNode *next; //指向下一个结点}QueueNode;typedef struct//队列定义{QueueNode *first; //队列的头指针QueueNode *rear; //队列的尾指针}QueueLink;相关函数声明:void CreateGraph(MGraph &G)// 输入图的顶点和边的信息,建立图void DFSTraverse(Graph G, int v)//深度优先搜索遍历图void BFSTraverse(Graph G, int v)//广度优先搜索遍历图int LocateVertices(ALGraph G,char a)//查找字符a在图中的位置int FirstAdjVex(ALGraph G,int v)//查找图中位置v的第一个邻接点在图中所在的位置int NextAdjVex(ALGraph G,int v,int w)//查找相对于图中位置v的邻接点w的下一邻接点在图中的位置void DestroyGraph(ALGraph &G)//销毁图void DFS(ALGraph G,int v)//利用递归实现对图中一个极大强连通分量的遍历void DFSTraverse(ALGraph G)//深度遍历访问图void InitQueue(QueueLink &Queue)//初始化队列void EnQueue(QueueLink &Queue,int i)//元素i入队列void DeQueue(QueueLink &Queue,int &i)//队列头元素出队int QueueEmpty(QueueLink Queue)//判断队列是否为空,若为空则返回1,否则返回0void DestroyQueue(QueueLink &Queue)//销毁队列void BFSTraverse(ALGraph G)//利用队列实现图的广度优先遍历㈢程序调试及运行结果分析在调试过程中,LocateVertices(ALGraph G,char a)函数中少了一个return -1语句,经过修改得到正确的结果。
数据结构 实验报告

数据结构实验报告一、实验目的数据结构是计算机科学中非常重要的一门课程,通过本次实验,旨在加深对常见数据结构(如链表、栈、队列、树、图等)的理解和应用,提高编程能力和解决实际问题的能力。
二、实验环境本次实验使用的编程语言为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.线性表的基本操作:包括线性表的创建、插入、删除、查找、修改等操作。
通过编程实现不同线性表的操作,掌握它们的原理和实现方法。
2.栈和队列的应用:栈和队列是常用的数据结构,通过实现栈和队列的基本操作,学会如何解决实际问题。
例如,利用栈实现括号匹配,利用队列实现银行排队等。
3.递归和回溯算法:递归和回溯是解决很多求解问题的常用方法。
通过编程实现递归和回溯算法,理解它们的思想和应用场景。
4.树和二叉树的遍历:学习树和二叉树的遍历方法,包括前序、中序和后序遍历。
通过编程实现这些遍历算法,加深对树结构的理解。
5.图的基本算法:学习图的基本存储结构和算法,包括图的遍历、最短路径、最小生成树等。
通过编程实现这些算法,掌握图的基本操作和应用。
四、实验过程1.具体实验内容安排:根据实验要求,准备好所需的编程环境和工具。
根据实验要求逐步完成实验任务,注意记录并整理实验过程中遇到的问题和解决方法。
2.实验数据采集和处理:对于每个实验任务,根据要求采集并整理测试数据,进行相应的数据处理和分析。
记录实验过程中的数据和结果。
3.实验结果展示和分析:将实验结果进行适当的展示,例如表格、图形等形式,分析实验结果的特点和规律。
4.实验总结与反思:总结实验过程和结果,回顾实验中的收获和不足,提出改进意见和建议。
五、实验结果与分析根据实验步骤和要求完成实验任务后,得到了相应的实验结果。
对于每个实验任务,根据实验结果进行适当的分析。
数据结构的实验报告

一、实验目的本次实验旨在让学生掌握数据结构的基本概念、逻辑结构、存储结构以及各种基本操作,并通过实际编程操作,加深对数据结构理论知识的理解,提高编程能力和算法设计能力。
二、实验内容1. 线性表(1)顺序表1)初始化顺序表2)向顺序表插入元素3)从顺序表删除元素4)查找顺序表中的元素5)顺序表的逆序操作(2)链表1)创建链表2)在链表中插入元素3)在链表中删除元素4)查找链表中的元素5)链表的逆序操作2. 栈与队列(1)栈1)栈的初始化2)入栈操作3)出栈操作4)获取栈顶元素5)判断栈是否为空(2)队列1)队列的初始化2)入队操作3)出队操作4)获取队首元素5)判断队列是否为空3. 树与图(1)二叉树1)创建二叉树2)遍历二叉树(前序、中序、后序)3)求二叉树的深度4)求二叉树的宽度5)二叉树的镜像(2)图1)创建图2)图的深度优先遍历3)图的广度优先遍历4)最小生成树5)最短路径三、实验过程1. 线性表(1)顺序表1)初始化顺序表:创建一个长度为10的顺序表,初始化为空。
2)向顺序表插入元素:在顺序表的第i个位置插入元素x。
3)从顺序表删除元素:从顺序表中删除第i个位置的元素。
4)查找顺序表中的元素:在顺序表中查找元素x。
5)顺序表的逆序操作:将顺序表中的元素逆序排列。
(2)链表1)创建链表:创建一个带头结点的循环链表。
2)在链表中插入元素:在链表的第i个位置插入元素x。
3)在链表中删除元素:从链表中删除第i个位置的元素。
4)查找链表中的元素:在链表中查找元素x。
5)链表的逆序操作:将链表中的元素逆序排列。
2. 栈与队列(1)栈1)栈的初始化:创建一个栈,初始化为空。
2)入栈操作:将元素x压入栈中。
3)出栈操作:从栈中弹出元素。
4)获取栈顶元素:获取栈顶元素。
5)判断栈是否为空:判断栈是否为空。
(2)队列1)队列的初始化:创建一个队列,初始化为空。
2)入队操作:将元素x入队。
3)出队操作:从队列中出队元素。
数据结构实验报告
数据结构实验报告本次数据结构实验的主要内容是关于树的相关操作,包括树的创建、遍历、查找等。
通过实验,我们将对树的基本概念和操作进行深入了解,并掌握相关算法的实现和应用。
首先,我们将介绍树的创建和基本操作。
树是一种非线性数据结构,由节点和边组成,具有层次关系。
在实验中,我们通过数组和链表两种方式来创建树。
数组表示法是将树的节点按照从上到下、从左到右的顺序存储在一维数组中,通过计算节点的下标来实现对树的操作。
链表表示法则是利用指针来表示节点之间的关系,实现树的各种操作。
在创建树的过程中,我们需要考虑节点的插入、删除和修改等操作,以及树的遍历方式,包括前序遍历、中序遍历和后序遍历。
其次,我们将介绍树的查找操作。
在实际应用中,我们经常需要对树进行查找操作,以找到特定的节点或者进行相关的数据处理。
在本次实验中,我们将学习如何实现对树的查找操作,包括深度优先搜索(DFS)和广度优先搜索(BFS)两种方式。
通过这些查找算法,我们可以高效地找到树中的特定节点,并进行相应的处理。
最后,我们将进行树的应用实例分析。
树作为一种重要的数据结构,在实际应用中有着广泛的应用。
我们将通过实例分析,介绍树在各种领域的应用,包括文件系统、数据库索引、网络路由等方面。
通过这些实例,我们可以更好地理解树的重要性和实际应用。
总之,本次数据结构实验涉及了树的创建、遍历、查找和应用等方面,通过实验,我们将对树的相关概念和操作有更深入的理解,并掌握相关算法的实现和应用。
希望通过本次实验,能够对数据结构有更深入的认识,为今后的学习和应用打下良好的基础。
数据结构实验报告
数据结构实验报告一、实验目的本次实验的目的是通过实际操作,深入理解数据结构的概念、特性和应用,并运用所学知识进行问题解决和算法设计。
二、实验内容本次实验主要包括以下内容:1. 数组的创建和操作:- 数组的定义和初始化- 数组元素的读取和修改- 数组的遍历和排序2. 链表的创建和操作:- 单链表的定义和初始化- 单链表的插入和删除- 单链表的遍历和逆序输出3. 栈和队列的创建和操作:- 栈的初始化和压栈、弹栈操作- 队列的初始化和入队、出队操作4. 树的创建和操作:- 二叉树的定义和初始化- 二叉树的遍历(前序、中序、后序遍历)- 二叉树的查找、插入和删除操作三、实验步骤和方法1. 数组的创建和操作:- 根据题目要求,声明和初始化数组;- 使用循环结构,遍历数组,并根据需求进行元素的修改;- 运用排序算法对数组进行排序,并验证排序结果的正确性。
2. 链表的创建和操作:- 根据题目要求,创建单链表的结构体和相关操作函数;- 使用动态内存分配函数malloc(),创建链表节点并插入到链表中;- 根据题目要求,设计相应的插入和删除函数,实现链表的插入和删除操作;- 遍历链表,并将链表节点的数据逆序输出。
3. 栈和队列的创建和操作:- 根据题目要求,创建栈和队列的结构体和相关操作函数;- 使用数组和指针实现栈和队列的功能,并初始化相关变量;- 实现栈的压栈和弹栈操作,并验证结果的正确性;- 实现队列的入队和出队操作,并验证结果的正确性。
4. 树的创建和操作:- 根据题目要求,创建二叉树的结构体和相关操作函数;- 使用动态内存分配函数malloc(),创建二叉树的节点,并根据题目要求插入到二叉树中;- 实现二叉树的遍历(前序、中序、后序遍历),并验证遍历结果的正确性;- 根据题目要求,实现二叉树的查找、插入和删除操作。
四、实验结果与分析在实验过程中,我按照题目的要求,使用所学的数据结构相关知识,设计了相应的代码,并通过调试和运行,得到了实验结果。
数据结构实验报告-树(二叉树)
实验5:树(二叉树)(采用二叉链表存储)一、实验项目名称二叉树及其应用二、实验目的熟悉二叉树的存储结构的特性以及二叉树的基本操作。
三、实验基本原理之前我们都是学习的线性结构,这次我们就开始学习非线性结构——树。
线性结构中结点间具有唯一前驱、唯一后继关系,而非线性结构中结点的前驱、后继的关系并不具有唯一性。
在树结构中,节点间关系是前驱唯一而后继不唯一,即结点之间是一对多的关系。
直观地看,树结构是具有分支关系的结构(其分叉、分层的特征类似于自然界中的树)。
四、主要仪器设备及耗材Window 11、Dev-C++5.11五、实验步骤1.导入库和预定义2.创建二叉树3.前序遍历4.中序遍历5.后序遍历6.总结点数7.叶子节点数8.树的深度9.树根到叶子的最长路径10.交换所有节点的左右子女11.顺序存储12.显示顺序存储13.测试函数和主函数对二叉树的每一个操作写测试函数,然后在主函数用while+switch-case的方式实现一个带菜单的简易测试程序,代码见“实验完整代码”。
实验完整代码:#include <bits/stdc++.h>using namespace std;#define MAX_TREE_SIZE 100typedef char ElemType;ElemType SqBiTree[MAX_TREE_SIZE];struct BiTNode{ElemType data;BiTNode *l,*r;}*T;void createBiTree(BiTNode *&T){ElemType e;e = getchar();if(e == '\n')return;else if(e == ' ')T = NULL;else{if(!(T = (BiTNode *)malloc(sizeof (BiTNode)))){cout << "内存分配错误!" << endl;exit(0);}T->data = e;createBiTree(T->l);createBiTree(T->r);}}void createBiTree2(BiTNode *T,int u) {if(T){SqBiTree[u] = T->data;createBiTree2(T->l,2 * u + 1);createBiTree2(T->r,2 * u + 2); }}void outputBiTree2(int n){int cnt = 0;for(int i = 0;cnt <= n;i++){cout << SqBiTree[i];if(SqBiTree[i] != ' ')cnt ++;}cout << endl;}void preOrderTraverse(BiTNode *T) {if(T){cout << T->data;preOrderTraverse(T->l);preOrderTraverse(T->r);}}void inOrderTraverse(BiTNode *T) {if(T){inOrderTraverse(T->l);cout << T->data;inOrderTraverse(T->r);}}void beOrderTraverse(BiTNode *T){if(T){beOrderTraverse(T->l);beOrderTraverse(T->r);cout << T->data;}}int sumOfVer(BiTNode *T){if(!T)return 0;return sumOfVer(T->l) + sumOfVer(T->r) + 1;}int sumOfLeaf(BiTNode *T){if(!T)return 0;if(T->l == NULL && T->r == NULL)return 1;return sumOfLeaf(T->l) + sumOfLeaf(T->r);}int depth(BiTNode *T){if(!T)return 0;return max(depth(T->l),depth(T->r)) + 1;}bool LongestPath(int dist,int dist2,vector<ElemType> &ne,BiTNode *T) {if(!T)return false;if(dist2 == dist)return true;if(LongestPath(dist,dist2 + 1,ne,T->l)){ne.push_back(T->l->data);return true;}else if(LongestPath(dist,dist2 + 1,ne,T->r)){ne.push_back(T->r->data);return true;}return false;}void swapVer(BiTNode *&T){if(T){swapVer(T->l);swapVer(T->r);BiTNode *tmp = T->l;T->l = T->r;T->r = tmp;}}//以下是测试程序void test1(){getchar();cout << "请以先序次序输入二叉树结点的值,空结点用空格表示:" << endl; createBiTree(T);cout << "二叉树创建成功!" << endl;}void test2(){cout << "二叉树的前序遍历为:" << endl;preOrderTraverse(T);cout << endl;}void test3(){cout << "二叉树的中序遍历为:" << endl;inOrderTraverse(T);cout << endl;}void test4(){cout << "二叉树的后序遍历为:" << endl;beOrderTraverse(T);cout << endl;}void test5(){cout << "二叉树的总结点数为:" << sumOfVer(T) << endl;}void test6(){cout << "二叉树的叶子结点数为:" << sumOfLeaf(T) << endl; }void test7(){cout << "二叉树的深度为:" << depth(T) << endl;}void test8(){int dist = depth(T);vector<ElemType> ne;cout << "树根到叶子的最长路径:" << endl;LongestPath(dist,1,ne,T);ne.push_back(T->data);reverse(ne.begin(),ne.end());cout << ne[0];for(int i = 1;i < ne.size();i++)cout << "->" << ne[i];cout << endl;}void test9(){swapVer(T);cout << "操作成功!" << endl;}void test10(){memset(SqBiTree,' ',sizeof SqBiTree);createBiTree2(T,0);cout << "操作成功!" << endl;}void test11(){int n = sumOfVer(T);outputBiTree2(n);}int main(){int op = 0;while(op != 12){cout << "-----------------menu--------------------" << endl;cout << "--------------1:创建二叉树--------------" << endl;cout << "--------------2:前序遍历----------------" << endl;cout << "--------------3:中序遍历----------------" << endl;cout << "--------------4:后序遍历----------------" << endl;cout << "--------------5:总结点数----------------" << endl;cout << "--------------6:叶子节点数--------------" << endl;cout << "--------------7:树的深度----------------" << endl;cout << "--------------8:树根到叶子的最长路径----" << endl;cout << "--------------9:交换所有节点左右子女----" << endl;cout << "--------------10:顺序存储---------------" << endl;cout << "--------------11:显示顺序存储-----------" << endl;cout << "--------------12:退出测试程序-----------" << endl;cout << "请输入指令编号:" << endl;if(!(cin >> op)){cin.clear();cin.ignore(INT_MAX,'\n');cout << "请输入整数!" << endl;continue;}switch(op){case 1:test1();break;case 2:test2();break;case 3:test3();break;case 4:test4();break;case 5:test5();break;case 6:test6();break;case 7:test7();break;case 8:test8();break;case 9:test9();break;case 10:test10();break;case 11:test11();break;case 12:cout << "测试结束!" << endl;break;default:cout << "请输入正确的指令编号!" << endl;}}return 0;}六、实验数据及处理结果测试用例:1.创建二叉树(二叉链表形式)2.前序遍历3.中序遍历4.后序遍历5.总结点数6.叶子结点数7.树的深度8.树根到叶子的最长路径9.交换所有左右子女10.顺序存储七、思考讨论题或体会或对改进实验的建议通过这次实验,我掌握了二叉树的顺序存储和链式存储,体会了二叉树的存储结构的特性,掌握了二叉树的树上相关操作。
数据结构课程实验报告
数据结构课程实验报告数据结构课程实验报告引言:数据结构是计算机科学中非常重要的一门课程,它研究了数据的组织、存储和管理方法。
在数据结构课程中,我们学习了各种数据结构的原理和应用,并通过实验来加深对这些概念的理解。
本文将对我在数据结构课程中的实验进行总结和分析。
实验一:线性表的实现与应用在这个实验中,我们学习了线性表这种基本的数据结构,并实现了线性表的顺序存储和链式存储两种方式。
通过实验,我深刻理解了线性表的插入、删除和查找等操作的实现原理,并掌握了如何根据具体应用场景选择合适的存储方式。
实验二:栈和队列的实现与应用栈和队列是两种常见的数据结构,它们分别具有后进先出和先进先出的特点。
在这个实验中,我们通过实现栈和队列的操作,加深了对它们的理解。
同时,我们还学习了如何利用栈和队列解决实际问题,比如迷宫求解和中缀表达式转后缀表达式等。
实验三:树的实现与应用树是一种重要的非线性数据结构,它具有层次结构和递归定义的特点。
在这个实验中,我们学习了二叉树和二叉搜索树的实现和应用。
通过实验,我掌握了二叉树的遍历方法,了解了二叉搜索树的特性,并学会了如何利用二叉搜索树实现排序算法。
实验四:图的实现与应用图是一种复杂的非线性数据结构,它由节点和边组成,用于表示事物之间的关系。
在这个实验中,我们学习了图的邻接矩阵和邻接表两种存储方式,并实现了图的深度优先搜索和广度优先搜索算法。
通过实验,我深入理解了图的遍历方法和最短路径算法,并学会了如何利用图解决实际问题,比如社交网络分析和地图导航等。
实验五:排序算法的实现与比较排序算法是数据结构中非常重要的一部分,它用于将一组无序的数据按照某种规则进行排列。
在这个实验中,我们实现了常见的排序算法,比如冒泡排序、插入排序、选择排序和快速排序等,并通过实验比较了它们的性能差异。
通过实验,我深入理解了排序算法的原理和实现细节,并了解了如何根据具体情况选择合适的排序算法。
结论:通过这些实验,我对数据结构的原理和应用有了更深入的理解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程实验报告
学生姓名 学 号
班 级 指导老师
实验名称 实验成绩
实验报告
实
验
概
述
实验目的:
掌握线性表的链式存储结构及基本操作,深入了解顺序表的基本特性。
实验要求:
(1)建立一个评委打分的单向链表。
(2)显示删除相关结点后的链表信息。
(3)显示要求的结果。
请认真阅读以上实验的问题描述,按照实验要求认真独立完成实验。如果在实验过程中
遇到困难,你可以通过以下辅助方式,顺利完成本实验。
实验基本原理:
1) 声明线性表的数据类型;
2) 一般在头文件中声明(该头文件中还应包括操作接口的声明);
3) 告诉编译器该数据类型占内存空间的大小;
4) 定义线性表类型的变量;
5) 在函数中或实现代码中的定义;
6) 告诉编译器为变量分配内存空间;7) 操作线性表类型变量;
8) 操作变量中保存的数据;
实
验
内
容
实验设计思路、步骤和方法等:+
(1)评委信息结点用结构变量存储,包含三个成员项,即姓名、年龄、评分。结构类型
定义如下:
//定义评委信息
struct pw
{
char name[8]; //姓名
short age; //年龄
float score; //评分
};
(2)用头插法或尾插法建立带头结点的单链表,本实验采用尾插法。
(3)遍历链表并逐次比较求最高分和最低分。
(4)在链表中物理删除,即实际删除最高分和最低分结点;也可以进行逻辑删除,即在
被删结点的数据域设置一个删除标记,本实验采用物理删除的方法。
(5)遍历链表,累加求和,计算总分及平均分,并输出相关信息。
如果对于自己编写好的程序不知道是否正确,你可以查看“实验程序”进行核查。
实验过程(实验中涉及的记录、数据、分析):
//实验1.1 线性表的链接存储结构
#include
#include
#include
#define PWRS 5 //定义评委人数
//定义评委信息
struct pw
{
char name[8]; //姓名
short age; //年龄
float score; //评分
};
typedef struct pw PW;
//定义链表结点
struct node
{
PW data;
struct node * next;
};
typedef struct node NODE;
NODE *create(int n); //建立单链表
void input(NODE *s,int i); //输入第i个评委信息
void output(NODE *s); //输出评委信息
void traverse(NODE *head); //遍历链表
void calc(NODE *head); //计算及数据处理
void main()
{
NODE *head=NULL;
head=create(PWRS); //建立评委信息单链表
printf("\n所有评委的评分信息如下:\n");
traverse(head); //输出所有评委的评分信息
calc(head); //计算成绩
printf("该参赛者去掉一个最高分和一个最低分后的有效评委的评分信息如下:\n");
traverse(head); //输出有效评委的评分信息
}
//尾插法建立带头结点的单链表
NODE *create(int n)
{
NODE *head,*p,*q;
int i;
p=(NODE*)malloc(sizeof(NODE));
head=p; q=p; p->next=NULL;
for(i=1; i<=n; i++)
{
p=(NODE*)malloc(sizeof(NODE));
input(p,i);
p->next=NULL;
q->next=p;
q=p;
}
return (head);
}
//输入评委信息,包括姓名、年龄和评分
void input(NODE *s,int i)
{
printf("请输入第 %d 个评委的姓名、年龄和评分:",i);
scanf("%s%d%f",&s->data.name,&s->data.age,&s->data.score);
}
//输出评委信息
void output(NODE *s)
{
printf("评委姓名:%6s 年龄:%d 评
分:%6.2f\n",s->data.name,s->data.age,s->data.score);
}
//遍历链表,输出所有评委的评分信息
void traverse(NODE *head)
{
NODE *p=head->next; //指向第一个结点
while(p!=NULL)
{
output(p);
p=p->next;
}
printf("\n");
}
//输出最高分及最低分评委信息,删除最高分及最低分结点并计算参赛者的最后平均
分
void calc(NODE *head)
{
NODE *q,*p,*pmin,*pmax;
float sum=0; //总分
float ave=0; //平均分
//查找最高分和最低分并计算总分
p=head->next;
pmin=pmax=p;
while(p!=NULL)
{
sum+=p->data.score;
if(p->data.score>pmax->data.score) pmax=p; //pmax指向最高分结点
if(p->data.scoredata.score) pmin=p; //pmin指向最低分结点
p=p->next;
}
//输出最高分及最低分评委信息
printf("给出最高分的评委姓名:%6s 年龄:%d 评
分:%6.2f\n",pmax->data.name,pmax->data.age,pmax->data.score);
printf("给出最低分的评委姓名:%6s 年龄:%d 评
分:%6.2f\n",pmin->data.name,pmin->data.age,pmin->data.score);
printf("\n");
//去掉一个最高分和一个最低分,计算并输出参赛者的最后平均分
sum-=pmax->data.score;
sum-=pmin->data.score;
ave=sum/(PWRS-2);
printf("该参赛者去掉一个最高分和一个最低分后的平均得分为:%6.2f\n",ave);
printf("\n");
//在链表中删除最高分和最低分结点
for(q=head,p=head->next;p!=NULL;q=p,p=p->next)
{
if(p==pmin) { q->next=p->next; p=q; } //删除最低分结点
if(p==pmax) { q->next=p->next; p=q; } //删除最高分结点
}
}
实验结果:
程序运行结果如下:
实 验 小 结 实验的心得体会: (1)线性表采用链式存储(链表)时,用结构变量存储结点,动态生成结点,用指针链接结点,能有效利用存储空间,插入删除方便。
(2)链表不能随机访问,是顺序访问方式,可从某结点访问到其后继结点,通常对单
链表的遍历即从表头结点顺序访问到表尾结点,任何在链表上做的查找运算都是在遍
历的基础上进行的。
(3)单链表操作的关键步骤包括:
1)建立链表的头插法:指针变量 p 开辟单元,生成结点,指针变量 q 始终指向头结
点;操作为:p->next=q->next; q->next=p;
2)建立链表的尾插法:指针变量 p 开辟单元,生成结点,指针变量 q 始终指向尾结
点;操作为: q->next=p; q=p;
3)插入:p结点的后面插入新结点s;操作为:s->next=p->next; p->next=s;
4)删除:p,q 指向相邻结点,q结点是p结点的后继,删除q结点;操作为:
p->next=q->next;
5)遍历:p指向后继结点;操作为:p=p->next;
实验思考:
指
导
教
师
评
语
指导教师 日期