数据结构 实验五 教学计划编制问题 最终实验报告

合集下载

《数据结构》实验报告

《数据结构》实验报告

苏州科技学院数据结构(C语言版)实验报告专业班级测绘1011学号10201151姓名XX实习地点C1 机房指导教师史守正目录封面 (1)目录 (2)实验一线性表 (3)一、程序设计的基本思想,原理和算法描述 (3)二、源程序及注释(打包上传) (3)三、运行输出结果 (4)四、调试和运行程序过程中产生的问题及采取的措施 (6)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (6)实验二栈和队列 (7)一、程序设计的基本思想,原理和算法描述 (8)二、源程序及注释(打包上传) (8)三、运行输出结果 (8)四、调试和运行程序过程中产生的问题及采取的措施 (10)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (10)实验三树和二叉树 (11)一、程序设计的基本思想,原理和算法描述 (11)二、源程序及注释(打包上传) (12)三、运行输出结果 (12)四、调试和运行程序过程中产生的问题及采取的措施 (12)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (12)实验四图 (13)一、程序设计的基本思想,原理和算法描述 (13)二、源程序及注释(打包上传) (14)三、运行输出结果 (14)四、调试和运行程序过程中产生的问题及采取的措施 (15)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (16)实验五查找 (17)一、程序设计的基本思想,原理和算法描述 (17)二、源程序及注释(打包上传) (18)三、运行输出结果 (18)四、调试和运行程序过程中产生的问题及采取的措施 (19)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (19)实验六排序 (20)一、程序设计的基本思想,原理和算法描述 (20)二、源程序及注释(打包上传) (21)三、运行输出结果 (21)四、调试和运行程序过程中产生的问题及采取的措施 (24)五、对算法的程序的讨论、分析,改进设想,其它经验教训 (24)实验一线性表一、程序设计的基本思想,原理和算法描述:程序的主要分为自定义函数、主函数。

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

数据结构实验报告实验5

数据结构实验报告实验5

数据结构实验报告实验5一、实验目的本次实验的主要目的是深入理解和掌握常见的数据结构,如链表、栈、队列、树和图等,并通过实际编程实现,提高对数据结构的操作和应用能力。

同时,培养解决实际问题的思维和编程能力,提高代码的可读性、可维护性和效率。

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

三、实验内容1、链表的基本操作创建链表插入节点删除节点遍历链表2、栈的实现与应用用数组实现栈用链表实现栈栈的应用:括号匹配3、队列的实现与应用用数组实现队列用链表实现队列队列的应用:排队模拟4、二叉树的遍历前序遍历中序遍历后序遍历5、图的表示与遍历邻接矩阵表示法邻接表表示法深度优先遍历广度优先遍历四、实验步骤1、链表的基本操作创建链表:首先定义一个链表节点结构体,包含数据域和指向下一个节点的指针域。

然后通过动态内存分配创建链表节点,并将节点逐个连接起来,形成链表。

插入节点:根据插入位置的不同,分为在表头插入、在表尾插入和在指定位置插入。

在指定位置插入时,需要先找到插入位置的前一个节点,然后进行节点的连接操作。

删除节点:同样需要根据删除位置的不同进行处理。

删除表头节点时,直接将头指针指向下一个节点;删除表尾节点时,找到倒数第二个节点,将其指针置为空;删除指定位置节点时,找到要删除节点的前一个节点,然后调整指针。

遍历链表:通过从链表头开始,依次访问每个节点,输出节点的数据。

2、栈的实现与应用用数组实现栈:定义一个固定大小的数组作为栈的存储空间,同时用一个变量记录栈顶位置。

入栈操作时,先判断栈是否已满,如果未满则将元素放入栈顶位置,并更新栈顶位置;出栈操作时,先判断栈是否为空,如果不空则取出栈顶元素,并更新栈顶位置。

用链表实现栈:与链表的操作类似,将新元素添加在链表头部作为栈顶。

括号匹配:输入一个包含括号的字符串,使用栈来判断括号是否匹配。

遇到左括号入栈,遇到右括号时与栈顶的左括号进行匹配,如果匹配成功则出栈,否则括号不匹配。

数据结构实验报告-教学计划编制

数据结构实验报告-教学计划编制

数据结构与程序设计实验实验报告哈尔滨工程大学实验报告五实验课名称:数据结构与程序设计实验实验名称:教学计划编制班级:学号:姓名:时间:2016.05.03一、问题描述学历进修需要学生在一定的时间内完成一定的课程学习,每一门课有一定的学分,修满学分,可获取相应的学历。

因为有些课程内容是另一些课程的学习基础,所以课程学习之间存有一定的先后次序。

如:某学历的计算机专业需要学习的课程及课程之间的关系如表1 所示。

表 1 计算机专业进修课程课程进修关系图课程编号课程名称学分C1 程序设计基础 2C2 离散数学 3C3 数据结构 4C4 汇编语言 3C5 程序设计与分析 2C6 计算机原理 3C7 编译原理 4C8 操作系统 4C9 高等数学7C10 线性代数 5C11 普通物理 2C12 数值分析 3C13 软件工程 3C14 数据库原理 3本设计的主要任务是根据需要完成的课程的先修关系、每学期开设的课程总数及总的学习时间,制定出教学计划。

需事先的基本功能如下。

a. 课程进修目录的读入。

b. 课程进修目录的编辑,如课程增加、删除、信息修改等。

c. 满足一定条件的教学计划的输出。

二、数据结构设计1. 以邻接表存储课程名和学分#define MAX_VERTEX_NUM 100typedef struct ArcNode{ //弧结构int adjvex; //该弧所指向的顶点的位置;struct ArcNode *nextarc; //指向下一条弧的指针InfoType *info; //弧的权值指针}ArcNode; //表结点typedef struct{ //头节点VertexType data; //顶点信息ArcNode *firstarc; //第一个表结点的地址,指向第一条依附该顶点的弧的指针}VNode, AdjList[MAX_VERTEX_NUM];typedef struct{int i;ArcNode *p;for(i=0;i<G.vexnum;i++)indegree[i]=0;for(i=0;i<G.vexnum;i++){p=G.vertices[i].firstarc;while(p){indegree[p->adjvex]++;p=p->nextarc;}}}Status sum(ALGraph G){ //求大学所有课程总学分;int z=0;for(int i=0; i < G.vexnum; i++){z += atoi(G.vertices2[i].data);}return z;}四、界面设计输入参数包括:学期总数,一学期的学分上限,课程数,弧的数目,每门课的课程号、学分和直接先修课的关系。

数据结构图的实验报告

数据结构图的实验报告

数据结构图的实验报告数据结构图的实验报告引言:数据结构图是计算机科学中重要的概念之一。

它是一种用图形表示数据元素之间关系的数据结构,广泛应用于算法设计、程序开发和系统优化等领域。

本实验报告旨在介绍数据结构图的基本原理、实验过程和结果分析。

一、实验目的本次实验的主要目的是掌握数据结构图的基本概念和操作方法,以及通过实验验证其在解决实际问题中的有效性。

具体而言,我们将通过构建一个社交网络关系图,实现对用户关系的管理和分析。

二、实验方法1. 确定数据结构在本次实验中,我们选择了无向图作为数据结构图的基础。

无向图由顶点集和边集组成,每条边连接两个顶点,且没有方向性。

2. 数据输入为了模拟真实的社交网络,我们首先需要输入一组用户的基本信息,如姓名、年龄、性别等。

然后,根据用户之间的关系建立边,表示用户之间的交流和联系。

3. 数据操作基于构建好的数据结构图,我们可以进行多种操作,如添加用户、删除用户、查询用户关系等。

这些操作将通过图的遍历、搜索和排序等算法实现。

三、实验过程1. 数据输入我们首先创建一个空的无向图,并通过用户输入的方式逐步添加用户和用户关系。

例如,我们可以输入用户A和用户B的姓名、年龄和性别,并建立一条边连接这两个用户。

2. 数据操作在构建好数据结构图后,我们可以进行多种操作。

例如,我们可以通过深度优先搜索算法遍历整个图,查找与某个用户具有特定关系的用户。

我们也可以通过广度优先搜索算法计算某个用户的社交网络影响力,即与该用户直接或间接相连的其他用户数量。

3. 结果分析通过实验,我们可以观察到数据结构图在管理和分析用户关系方面的优势。

它能够快速地找到用户之间的关系,帮助我们了解用户的社交网络结构和影响力。

同时,数据结构图也为我们提供了一种可视化的方式来展示用户之间的关系,使得分析更加直观和易于理解。

四、实验结果通过实验,我们成功构建了一个社交网络关系图,并实现了多种数据操作。

我们可以根据用户的姓名、年龄和性别等信息进行查询,也可以根据用户之间的关系进行遍历和排序。

数据结构实训实验报告

数据结构实训实验报告

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

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

二、实验目的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)二叉树和图的存储结构实现复杂,但能够有效地表示和处理数据。

数据结构 实验报告

数据结构 实验报告

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

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

HUNAN UNIVERSITY 课程实习报告题目教学计划编制问题学生姓名学生学号专业班级指导老师李晓鸿完成日期2014年12月16日一、需求分析1.问题描述:用有向网表示教学计划,其中顶点表示某门课程,有向边表示课程之间的先修关系(如果A课程是B课程的先修课程,那么A到B之间有一条有向边从A指向B)。

设计一个教学计划编制程序,获取一个不冲突的线性的课程教学流程。

(课程线性排列,每门课上课时其先修课程已经被安排)。

2.程序功能:本程序要求根据所输入的课程及课程间的先修关系,得到一个不冲突的线性的课程表。

3.输入的形式和输入值的范围用户通过键盘输入课程总数、每门课的课程编号(固定占3位的字母数字串)和直接先修的课程号等的参数。

本程序不对非法输入做处理,即假设输入都是合法的。

4.输出的形式如果排序成功,输出排序后的教学计划表;否则输出错误提示信息,表示所输入的课程不能构成一个完全满足教学要求的课程表。

5.测试数据:输入:请输入课程的个数和课程关系的个数:4 3请输入点,即课程编号1:A1请输入点,即课程编号2:A2请输入点,即课程编号3:A3请输入点,即课程编号4:A4请输入有向边,即课程的先后关系1:A2 A4请输入有向边,即课程的先后关系2:A4 A3请输入有向边,即课程的先后关系3:A3 A1请输入课程的个数和课程关系的个数:3 3请输入点,即课程编号1:A1请输入点,即课程编号2:A2请输入点,即课程编号3:A3请输入有向边,即课程的先后关系1:A2 A1请输入有向边,即课程的先后关系2:A1 A3请输入有向边,即课程的先后关系3:A3 A2输出:课程的选修的先后顺序为:A2 A4 A3 A1课程的选修的先后顺序为:课程网络存在回路二、概要设计1.抽象数据类型的定义:题设要求使用一个有向图表示教学计划,顶点表示某门课程,有向边表示课程之间的先修关系,数据的对象是图中的每一个顶点和有向边。

由此为本问题确定一个图的数据关系。

同时课程存储在顶点位置,所以创建节点类来存储课程信息。

在对图中所存储的课程进行排序时,使用拓扑排序可以完美得到所需顺序,而拓扑排序可以用顶点入度为0的方法实现,所以为实现拓扑排序的顶点的存放,创建一个线性表来存放。

(1)图的ADT数据对象:V :代表表示课程的定点组成的定点集;R :代表表示课程先修关系的有向弧边组成的一个弧集;数据关系:VR={<v,w>| v,w∈V 且 P(v,w)}<v,w>表示从 v 到 w 的一条弧,并称 v 为弧头,w 为弧尾。

基本操作:int n(); //返回图中的顶点数int first(int); //返回该点的第一条邻边int next(int); //返回该点的下一条邻边void setEdge(int,int,int); //为有向边设置权值int getMark(int); //获得顶点的标志值void setMark(int); //为顶点设置标志值(2)队列ADT数据对象:D={ai | ai∈ElemSet, i=1,2,...,n, n≥0}数据关系:R1={ <a i-1,ai > | ai-1, ai ∈D, i=2,...,n}其中a1 端为队列头,an 端为队列尾基本操作:virtual void clear() = 0; //Reinitialize the queuevirtual bool enqueue(const Elem&) = 0; // insert an element at the back of thequeue.virtual bool dequeue(Elem&) = 0; // Remove the element from the front of thequeue.virtual bool frontValue(Elem&) const = 0; // Get a copy of the front element in thequeuevirtual int length() const = 0; // Return the number of elements in the queue.2.算法的基本思想:建立一个节点类,存储课程信息。

建立一个线性表类,将每次输入的课程信息存储到线性表内,完成线性表的构建。

建立一个图类,从线性表内读取顶点信息。

每次输入先修关系,则对节点创建对应指针,完成图的构建。

完成图的构建之后,使用拓扑排序得到有序课程表。

每当节点入度为0,输出该节点存储的课程信息,并删除该节点,同时与该节点相连的各个顶点的入度均减1。

重复以上操作直到图为空。

排序成功,输出排序后的顶点序列;否则,若入度为0的节点数小于节点总数,则不存在满足条件的课程表,输出提示信息,结束程序。

3.程序的流程输入模块:读入图的信息(顶点和边,用线性表进行存储)。

处理模块:topsort算法得出课程顺序。

输出模块:若排序成功,输出所排列的课表,否则,输出排序失败提示信息。

函数调用关系图:详细设计Graph G(n,m);G.pushVertex(); G.pushEdge(); G.topsort();三、1. 物理数据类型由于课程的编号为字符串,使用char 类型或string 类均可存储。

由于用户输入的课程个数不定且有序,所以用链式队列来存储排序后的顶点。

2. 伪代码(1) 创建类 //节点类 class Node {public: string node; int position; //位置 Node* next; bool visit; //用来标记节点是否被访问 Node() //初始化节点 { visit = false; next = NULL; position = 0; node = ' '; }void Graph::pushV ertex()主函数void Graph::pushEdge() void Graph::topsort()void line::insert(pos2,ch2)};//线性表类class Line{public:int num; //线性表中元素的个数Node* head;Node* rear;Node* fence;Line(){num = 0;head = fence = rear = new Node();}void insert(int v, string ch);//插入元素};//图类class Graph{private:int numVertex;//所输入的课程总数int numEdge; //先修关系的个数Line* line;public:Graph(int v, int e){numVertex = v;numEdge = e;line = new Line[v];}//读入点void pushVertex(); //读入顶点信息,表示课程信息void pushEdge(); // 读入有向边信息,有向边表示先修关系void topsort(); //拓扑排序;}(2)类的操作函数a.void Line: :insert(int v, string ch) //向线性表中插入元素{Node* current = new Node();current->node=ch;current->position=v;fence->next=current;fence = current;num++;}b.void pushVertex(){string ch;for(int i=0; i<numVertex; i++){cout<<"请输入点,即课程编号"<<i+1<<":";cin>>ch;line[i].head->node=ch;line[i].head->position=i;}}c.void Gragh:: pushEdge() // 读入有向边信息,有向边表示先修关系{string ch1, ch2;int pos1, pos2;for(int i=0; i<numEdge; i++){cout<<"请输入边,即先修关系"<<i+1<<":";cin>>ch1>>ch2;for(int j=0; j<numVertex;j++){if(line[j].head->node==ch1)pos1=j;if(line[j].head->node==ch2){pos2=line[j].head->position;break;}}line[pos1].insert(pos2,ch2);}}d.void Gragh::topsort() //拓扑排序{int i;int *d=new int[numVertex];for(i=0; i<numVertex; i++)d[i]=0; //数组初始化for(i=0; i<numVertex; i++){Node* p=line[i].head;while(p->next=NULL){d[p->next->position]++; //计算每个点的入度p=p->next;}}int top=-1, m=0, j, k;for(i=0; i<numVertex; i++) //寻找入度为0 的顶点,作为拓扑排序的起点{if(d[i]==0){d[i]=top; //找到第一个入度为0的点top=i;}while(top!=-1){j=top;top=d[top];cout<<line[j].head->node<<" ";m++;Node* p=line[j].head;while(p->next!=NULL) //每当访问一个顶点,输出该顶点存储的节点信息,同时删除从图中删除该顶点,直到图为空,结束排序。

{k=p->next->position;d[k]--; //当起点被删除时,后面的点入度-1if(d[k]==0){d[k]==top;top=k;}p=p->next;}}}cout<<endl;if(m<numVertex) //输出点的个数小于输入点的个数,不能完全遍历{cout<<"网络存在回路!"<<endl;delete[] d;}}};(3)主函数int _tmain(int argc, _TCHAR* argv[]){int n, m;cout<<"请输入节点的个数和边的个数:"<<endl;cin>>n>>m;Graph G(n,m);G.pushVertex();G.pushEdge();G.topsort();return 0;}3.算法的具体步骤a.输入信息:输入课程信息及先修关系;b.构建图:创建节点类存储课程信息。

相关文档
最新文档