数据结构课程实验报告(15)
数据结构课程实验报告

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

数据结构实验报告一、实验目的数据结构是计算机科学中非常重要的一门课程,通过本次实验,旨在加深对常见数据结构(如链表、栈、队列、树、图等)的理解和应用,提高编程能力和解决实际问题的能力。
二、实验环境本次实验使用的编程语言为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)出队操作:从队列中出队元素。
数据结构实验报告

数据结构实验报告树是一种非线性的数据结构,它由节点和边组成,节点之间存在层次关系。
树的应用十分广泛,特别是在存储和检索数据上。
在本次实验中,我对树的应用进行了研究和实践,并撰写了本篇实验报告。
本次实验中,我首先学习了树的基本概念和相关术语。
树由根节点、子节点、叶节点以及它们之间的连接边组成。
每个节点可以有多个子节点,但只能有一个父节点(除了根节点)。
叶节点是没有子节点的节点。
这种层次结构使得树可以用来表示具有层次关系的数据,例如家谱、目录结构等。
接下来,我学习了树的不同种类和它们的特点。
最常见的树结构包括二叉树、二叉树(BST)、平衡二叉树、AVL树等。
二叉树是一种每个节点最多有两个子节点的树结构。
二叉树是二叉树的一种特殊形式,其中左子树的所有节点值都小于根节点的值,右子树的所有节点值都大于根节点的值。
平衡二叉树是一种高度平衡的二叉树,它的左右子树的高度差不超过1、AVL树是一种自平衡的二叉树,它通过旋转和重新平衡来保持树的平衡性。
为了更好地理解树的应用,我选择了二叉树(BST)作为本次实验的主要研究对象。
BST是一种高效的数据结构,可以用来存储一组有序的数据,并且支持快速的查找、插入和删除操作。
我首先实现了BST的基本操作,包括插入节点、删除节点和查找节点。
通过这些操作,我可以在BST中存储和检索数据。
在插入节点时,我按照BST的特性将节点插入到相应的位置,并保持树的有序性。
在删除节点时,我考虑了不同的情况,包括删除叶节点、删除只有一个子节点的节点以及删除有两个子节点的节点。
在查找节点时,我使用了递归的方式在树中查找节点的值。
接着,我实现了一些BST的扩展操作。
首先是中序遍历,它可以按照节点的值的升序输出BST中的所有节点。
其次是最小值和最大值的查找,它们分别返回BST中的最小值和最大值。
最后是查找一些节点的前驱和后继,前驱是小于该节点的最大节点,后继是大于该节点的最小节点。
这些扩展操作可以进一步提升BST的功能和灵活性。
数据结构课程设计实验报告

景德镇陶瓷大学数据结构课程设计报告题目:通讯录管理院系名称:信息学院专业名称:信息与计算科学班级:学生姓名:学号:指导教师:设计起止时间:2017.06.5——2017.06.16一. 设计目的1、通过本次课程设计巩固《数据结构》中所学的内容;2、提高自己上机编程以及调试能力。
二. 设计内容建立一个通讯录,能够实现储存联系人、添加联系人、删除联系人等功能。
输入的通讯录联系人包编号、姓名、性别、电话、地址等信息。
三.概要设计程序流程图四.调试情况,设计技巧及体会1.改进方案1、菜单界面可以更加优化的美观些。
2、联系人的查询太繁琐,需要改进算法。
2.体会回顾起此课程设计,至今我仍感慨颇多,从理论到实践,在这段日子里,可以说得是苦多于甜,但是可以学到很多很多的东西,同时不仅可以巩固了以前所学过的知识,而且学到了很多在书本上所没有学到过的知识。
通过这次课程设计使我懂得了理论与实际相结合是很重要的,只有理论知识是远远不够的,只有把所学的理论知识与实践相结合起来,从理论中得出结论,才能真正为社会服务,从而提高自己的实际动手能力和独立思考的能力。
五.参考文献1、《数据结构》杨剑主编清华大学出版社2、《数据结构(C语言版)》.严蔚敏_吴伟民.主编清华大学出版社3、网上相关资料六、附录:源代码#include<iostream.h>#include"stdio.h"#include "stdlib.h"#include <string>#define maxsize 10000#define overload 0#define ok 1#define error 2typedef int Status;typedef struct{char num[10];char name[5];char sex[5];char tel[15];char adj[30];}data;typedef struct{int length;data *elem;}Sqlist;Status InitList(Sqlist &L){L.elem=new data[maxsize];if(!L.elem)exit(overload);L.length=0;return ok;}Status Add(){Sqlist L;data e;int i;i=1;char chose;cout<<"请输入姓名:"<<endl;cin>>;cout<<endl;cout<<"请输入学号:"<<endl;cin>>e.num;cout<<endl;cout<<"请输入性别:"<<endl;cin>>e.sex;cout<<endl;cout<<"请输入地址:"<<endl;cin>>e.adj;cout<<endl;cout<<"请输入电话:"<<endl;cin>>e.tel;L.elem[i-1] = e;cout<<endl;cout<<"是否继续更新通讯录信息,是请输入Y,否请输入N"<<endl;cin>>chose;if(chose=='Y'){Add();}return ok;}Status ListDelete(){Sqlist L;int i;cin>>i;if((i<1)||(L.length)) return error;for(int j=i;j<=L.length;j++){L.elem[j-1]=L.elem[j];--L.length;}return ok;}Status LocationElem(Sqlist &L, char e) {cin>>e;for(int i=0;i<=L.length;i++){if(L.elem[i].adj==e)return i+1;elsereturn 0;if(L.elem[i].name==e)return i+1;elsereturn 0;if(L.elem[i].num==e)return i+1;elsereturn 0;if(L.elem[i].sex==e)return i+1;elsereturn 0;if(L.elem[i].tel==e)return i+1;elsereturn 0;if((L.elem[i].adj==e)return i+1;elsereturn 0;}}Status TraverseList(){Sqlist L;for(int i=0;i<=L.length;i++)cout<<L.elem[i].name<<endl;cout<<L.elem[i].sex<<endl;cout<<L.elem[i].num<<endl;cout<<L.elem[i].tel<<endl;cout<<L.elem[i].adj<<endl;return ok;}void Cover(){cout<<" 通讯录管理系统"<<endl;cout<<" 1、新建通讯录信息"<<endl;cout<<" 2、删除通讯录信息"<<endl;cout<<" 3、查询通讯录信息"<<endl;cout<<" 4、输出通讯录信息"<<endl;cout<<" 请选择菜单号1--4 。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
课程实验报告课程名称:数据结构专业班级:信安1302学号:姓名:指导教师:报告日期:2015. 5. 12计算机科学与技术学院目录1 课程实验概述............ 错误!未定义书签。
2 实验一基于顺序结构的线性表实现2.1 问题描述 ...................................................... 错误!未定义书签。
2.2 系统设计 ...................................................... 错误!未定义书签。
2.3 系统实现 ...................................................... 错误!未定义书签。
2.4 效率分析 ...................................................... 错误!未定义书签。
3 实验二基于链式结构的线性表实现3.1 问题描述 ...................................................... 错误!未定义书签。
3.2 系统设计 ...................................................... 错误!未定义书签。
3.3 系统实现 ...................................................... 错误!未定义书签。
3.4 效率分析 ...................................................... 错误!未定义书签。
4 实验三基于二叉链表的二叉树实现4.1 问题描述 ...................................................... 错误!未定义书签。
4.2 系统设计 ...................................................... 错误!未定义书签。
4.3 系统实现 ...................................................... 错误!未定义书签。
4.4 效率分析 ...................................................... 错误!未定义书签。
5 实验总结与评价 ........... 错误!未定义书签。
1 课程实验概述这门课是为了让学生了解和熟练应用C语言进行编程和对数据结构进一步深入了解的延续。
首先,课程实验是培养为了我们学生的动手能力而开设的,我们都知道的是实验是最能检验一个学会还是没有学会知识的一种最为有效地方式。
关于本次实验的所需要的知识,就是所学的C语言的知识,特别是C语言的实际操作的能力。
本次实验以数据链表的各种操作为基础,考察我们的综合应用的能力,是对我们以前学习的一次很好的检测。
还有就是根据数据结构这门课程的性质和它的教学的人物要求,让学生学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当的逻辑结构储存结构及其相应的算法,并初步掌握算法的时间分析和空间分析。
而与数据结构相配套的这三次的实验恰恰是为了让我们学生用实际的操作来验证树上所学到的数据结构的相应的方法。
2 实验一基于顺序结构的线性表实现2.1 问题描述基于顺序存储结构,实现线性表的基本的、常见的运算,用线性和链性的方式对数据进行各种必要的操作。
2.2 系统设计,分别是:printf(" Menu for Linear Table On Sequence Structure \n");printf("------------------------------------------------------\n");printf(" 1. IntiaList 7. LocateElem\n");printf(" 2. DestroyList 8. PriorElem\n");printf(" 3. ClearList 9. NextElem \n");printf(" 4. ListEmpty 10. ListInsert\n");printf(" 5. ListLength 11. ListDelete\n");printf(" 6. GetElem 12. ListTrabverse\n");printf(" 0. Exit\n");printf("------------------------------------------------------\n");printf(" 请选择你的操作[0~12]:");,数据元素为包含一个整型变量的结构体:typedef struct{int item;}Elemtype;,用于存储该表的基本信息和首结点地址:typedef struct{Elemtype * elem;int length,status,Increment;int listsize;}SqList;int main(){SqList L;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASTABLE -1#define OVERFLOW -2#define LIST_INIT_SIZE 100#define LISTINCREMENT 102.3 系统实现1.3.1 IntiaList 功能初始化线性表,传入的是头结点地址。
申请一个大小为LIST_INT_SIZE 、类型为Elemtype 的线性存储空间,并用头结点中的首结点指针指向该空间首地址1.3.2 DestroyList 功能销毁头结点中首结点址针指向的线性存储空间,传入的是头结点地址。
1.3.3 ClearList 功能与Destroy 类似但是又有不同,ClearList 并不销毁物理空间,而是修改逻辑关系值:1.3.4 ListEmpty 功能判空功能,判断表是否为空表。
传入的是头结点值,而非地址,因为不需要对头结点进行修改。
1.3.5 ListLength 功能求表长的长度的功能,由于创建过程中已经把表长信息包含在头结点中,所以直接调用并显示即可:1.3.6 GetElem 功能获取第i 号元素,传入的是头结点值、元素编号i 、以及出口表结点地址。
1.3.7 LocatElem 功能获取指定元素编号,传入头结点值、存储了所需元素信息的一个临时表结点值compare 函数地址。
采用顺序比较法从表头遍历并比较,一旦找到,返回编号i 。
时间复杂度为n /2/)1(n n ,O(n)。
1.3.8 PriorElem 功能求指定元素的前一个元素的内容,传入头结点值、包含指定元素信息的一个临时表结点值、存储前一个元素的表结点地址。
主要思路是先调用LocatElem 确定指定元素的位置,如果不是首结点则可直接取到PriorElem 的地址。
时间复杂度为O(n)。
1.3.9 NextElem 功能与PriorElem 功能类似,求指定元素的后一个元素的内容,传入头结点值、包含指定元素信息的一个临时表结点值、存储前一个元素的表结点地址。
主要思路是先调用LocatElem 确定指定元素的位置,如果不是尾接点则可直接取到NextElem 的地址。
时间复杂度为O(n)。
ListInsertt 功能插入一个数据元素,传入头结点地址、插入位置i 、临时表结点值。
在调用插入函数前构造一个临时表结点,用于存储数据元素信息。
进入插入子函数,插入前先判断插入位置是否合理,再判断是否“满载”。
如果满载则重新申请更大的存储空间。
接下来正式插入数据元素,“先空位置再插入”。
平均时间复杂度为n/2/)1(nn,O(n),n即listlength。
ListDelete功能删除指定编号的数据元素,传入头结点地址、编号i、表结点类型结构体地址来返回被删除元素内容。
执行前先判断传入的编号是否在可寻找范围内。
执行删除操作之后,进行“移位”运算。
时间复杂度仍为O(n)。
ListTraverse功能顺序遍历顺序表元素,传入头结点值、visit函数地址。
时间复杂度为O(n) compare与visit函数status compare(Elemtype c1,Elemtype c2) /* c1等于c2 */{if(c1.item==c2.item)return TRUE;elsereturn FALSE;}status visit(Elemtype e){printf(" %d", e);return TRUE;}1.4效率分析在上面介绍各功能时已经提到时间复杂度的计算了,这里再简单分析一下。
具有同数量级复杂度的功能在实现方法上一般近似。
而LocatElem、PriorElem、NextElem是基于LocatElem,平均效率为O(n);由于在头结点结构体中已经包含了ListEmpty、ListLength所需信息,所以效率为O(1);ListInsert、ListDelete都要对顺序表进行“移位”运算,平均效率为O(n)。
3 实验二基于链式结构的线性表实现2.1问题描述基于链式存储结构,实现线性表的基本的、常见的运算。
2.2系统设计,数据元素包含一个整型变量以及自身类型的指针typedef struct LNode{ElemType data;struct LNode *next;}LNode,* LinkList;#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0#define INFEASTABLE -1#define OVERFLOW -22.3系统实现2.3.1 IntiaList由于链表的创建是动态的,因此初始化不需要创建一个巨大的存储空间,这样可以节约很多内存空间。
2.3.2 DestroyList需要遍历链表,同时释放掉每个元素。
2.3.3 ClearList由于链表不同于数序表,这里不仅要在逻辑上清空,还要在物理结构上清空,实现上与Destroy类似,即在改变相应的对应的关系后还要销毁相应的元素。
2.3.4 ListEmpty判空操作,L.elem不为NULL即不空。