图邻接矩阵 邻接表的建立c _数据结构课程设计

合集下载

数据结构的课程设计

数据结构的课程设计

数据结构的课程设计一、课程目标知识目标:1. 理解数据结构的基本概念,掌握线性表、树、图等常见数据结构的特点与应用场景。

2. 学会分析不同数据结构的存储方式和操作方法,并能运用到实际问题的解决中。

3. 掌握排序和查找算法的基本原理,了解其时间复杂度和空间复杂度。

技能目标:1. 能够运用所学数据结构知识,解决实际问题,提高编程能力。

2. 能够运用排序和查找算法,优化程序性能,提高解决问题的效率。

3. 能够运用数据结构知识,分析并解决复杂问题,培养逻辑思维能力和创新意识。

情感态度价值观目标:1. 培养学生对数据结构学科的兴趣,激发学习热情,形成主动探索和积极进取的学习态度。

2. 增强学生的团队协作意识,培养合作解决问题的能力,提高沟通表达能力。

3. 培养学生的抽象思维能力,使其认识到数据结构在计算机科学中的重要性,激发对计算机科学的热爱。

本课程针对高中年级学生,结合学科特点和教学要求,注重理论与实践相结合,培养学生的编程能力和逻辑思维能力。

通过本课程的学习,使学生能够掌握数据结构的基本知识,提高解决实际问题的能力,同时培养良好的学习态度和价值观。

在教学过程中,将目标分解为具体的学习成果,以便进行后续的教学设计和评估。

二、教学内容1. 数据结构基本概念:介绍数据结构的概念、作用和分类,重点讲解线性结构(线性表、栈、队列)和非线性结构(树、图)的特点。

2. 线性表:讲解线性表的顺序存储和链式存储结构,以及相关操作(插入、删除、查找等)。

3. 栈和队列:介绍栈和队列的应用场景、存储结构及相关操作。

4. 树和二叉树:讲解树的定义、性质、存储结构,二叉树的遍历算法及线索二叉树。

5. 图:介绍图的定义、存储结构(邻接矩阵和邻接表)、图的遍历算法(深度优先搜索和广度优先搜索)。

6. 排序算法:讲解常见排序算法(冒泡排序、选择排序、插入排序、快速排序等)的原理、实现及性能分析。

7. 查找算法:介绍线性查找、二分查找等查找算法的原理及实现。

《数据结构》实验指导书

《数据结构》实验指导书
四、实验说明
1.单链表的类型定义
#include <stdio.h>
typedef int ElemType;//单链表结点类型
typedef struct LNode
{ElemType data;
struct LNode *next;
2.明确栈、队列均是特殊的线性表。
3.栈、队列的算法是后续实验的基础(广义表、树、图、查找、排序等)。
六、实验报告
根据实验情况和结果撰写并递交实验报告。
实验四 串
一、预备知识
1.字符串的基本概念
2.字符串的模式匹配算法
二、实验目的
1.理解字符串的模式匹配算法(包括KMP算法)
typedef struct
{ElemType *base;
int front,rear;
} SqQueue;
4.单链队列的类型定义
typedef struct QNode
{QElemType data;
typedef struct list
{ElemType elem[MAXSIZE];//静态线性表
int length; //顺序表的实际长度
} SqList;//顺序表的类型名
五、注意问题
1.插入、删除时元素的移动原因、方向及先后顺序。
4.三元组表是线性表的一种应用,通过它可以更好地理解线性表的存储结构。同时矩阵又是图的重要的存储方式,所以这个实验对更好地掌握线性表对将来对图的理解都有极大的帮助。
六、实验报告
根据实验情况和结果撰写并递交实验报告。
实验六 树和二叉树
一、预备知识
1.二叉树的二叉链表存储结构

算法与数据结构课设(有向图,无向图,有向网,无向网)

算法与数据结构课设(有向图,无向图,有向网,无向网)

算法与数据结构课程设计报告系(院):计算机科学学院专业班级:教技1001姓名:李##学号: ******### 指导教师:***设计时间:2012.6.16 - 2012.6.24设计地点:4号楼2号机房目录一、设计方案 (1)二、实现过程以及代码 (2)三、测试 (20)四、结论和分析 (23)五、难点和收获 (23)一、 设计方案1.程序设计基本过程:拿到课程设计任务书,按照要求,需要设计有向图、有向网、无向图 、无向网四种图,以及邻接矩阵、邻接表两种数据存储结构,三层以上的显示菜单。

图的操作中又包含了有关线性表、栈和队列的基本操作。

由于显示菜单已给出,剩下的任务就是把函数写入其中。

2.程序流程图:预定义 定义结构体 定义变量 各种函数3.程序设计的原理:图的操作都是以两种存储结构为基础的:邻接矩阵存储结构和邻接表存储结构,如有向图,有向网,无向图,无向网的创建,其他的操作都是在四种图创建后才开始进行的。

所以,首先必须理解两种存储结构的定义。

图的邻接矩阵存储结构即图的数组表示法。

用两个数组分别存储数据元素(如顶点)的信息和数据元素之间的关系(如边或弧)的信息。

用邻接矩阵存储结构的图具有以下几点特征:(一):顶点数:vexnum ,边(弧)数:arcnum ,图的种类:kind ;(二):邻接矩阵:arcs(1顶点关系类型:adj 2相关信息:*info);(三):顶点向量(顶点名):vexs[];其优点是以二维数组表示有n 个顶点的图时,需存放n 个顶点的信息和n*n 条弧的信息存储量。

借助邻接矩阵容易判定任意两个顶点之间是否有边或弧相连,并容易求出各个顶点的度。

缺点是时间复杂度是O (n*n ),例如,构造一个具有n 个顶点和e 条边的无向网的时间复杂度为O (n*n+e*n )。

图的邻接表存储结构是图的一种链式存储结构。

对图中的每个顶点建立一个单链表,每个结点由三个域组成,邻接点域adjvex (弧尾在邻接表链表中的位序),链域nextarc (下一条弧),数据域info(权值)。

c与数据结构课程设计

c与数据结构课程设计

c与数据结构课程设计一、教学目标本课程的教学目标是使学生掌握C语言编程基础及其在数据结构中的应用。

具体目标如下:1.知识目标:–理解C语言的基本语法、数据类型、运算符、控制结构。

–掌握函数的定义、调用和参数传递。

–了解数据结构的基本概念,包括线性表、栈、队列、树、图等。

–理解算法的基本概念,能够分析算法的时间和空间复杂度。

2.技能目标:–能够使用C语言编写简单的程序,对数据进行处理和分析。

–能够运用数据结构解决实际问题,提高程序的效率和可维护性。

–掌握算法的设计和分析方法,能够编写高效的程序。

3.情感态度价值观目标:–培养学生的编程兴趣,提高学生解决实际问题的能力。

–培养学生团队合作的精神,提高学生的沟通和协作能力。

–培养学生勇于探索、不断创新的精神,提高学生的自主学习能力。

二、教学内容本课程的教学内容主要包括C语言基础、数据结构及其在C语言中的应用。

具体安排如下:1.C语言基础:–基本语法、数据类型、运算符、控制结构。

–函数的定义、调用和参数传递。

–指针的概念和应用。

2.数据结构:–线性表的顺序存储和链式存储。

–栈和队列的定义、实现及其应用。

–树的基本概念、二叉树的遍历和应用。

–图的定义、遍历算法和应用。

3.数据结构在C语言中的应用:–排序算法及其实现。

–查找算法及其实现。

–动态规划算法及其应用。

三、教学方法本课程采用讲授法、案例分析法和实验法相结合的教学方法。

具体安排如下:1.讲授法:用于讲解C语言基础知识和数据结构的基本概念。

2.案例分析法:通过分析实际案例,使学生掌握数据结构在C语言中的应用。

3.实验法:让学生动手编写程序,巩固所学知识,提高实际编程能力。

四、教学资源本课程的教学资源包括教材、参考书、多媒体资料和实验设备。

具体安排如下:1.教材:选用《C程序设计语言》作为主教材,辅助以《数据结构与算法分析》等参考书。

2.多媒体资料:提供PPT、视频教程等资料,帮助学生更好地理解课程内容。

图的操作C语言课程设计

图的操作C语言课程设计

图的操作C语言课程设计一、教学目标本课程的教学目标是使学生掌握图的操作的基本概念、原理和方法,能够运用C语言实现图的基本操作,如建立图、查找顶点、边的相关操作等。

通过本课程的学习,使学生具备以下知识目标:1.理解图的基本概念,如顶点、边、度、相邻顶点等。

2.掌握图的存储结构,如邻接矩阵、邻接表等。

3.熟悉图的基本操作,如添加和删除顶点、边,查找顶点、边的相关操作等。

4.能够使用C语言实现图的基本操作。

5.能够运用图的操作解决实际问题,如最短路径问题、最小生成树问题等。

情感态度价值观目标:1.培养学生的团队合作意识,通过实验和项目使学生学会与他人合作解决问题。

2.培养学生的创新思维,鼓励学生尝试新的方法解决问题。

3.培养学生对计算机科学的兴趣,激发学生继续学习计算机科学的热情。

二、教学内容本课程的教学内容主要包括图的基本概念、图的存储结构、图的基本操作以及图的应用。

具体安排如下:1.图的基本概念:介绍图的定义、顶点、边、度等基本概念。

2.图的存储结构:介绍邻接矩阵、邻接表等图的存储方式。

3.图的基本操作:介绍添加和删除顶点、边,查找顶点、边的相关操作等。

4.图的应用:介绍图的应用场景,如最短路径问题、最小生成树问题等。

三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法,如讲授法、讨论法、案例分析法、实验法等。

1.讲授法:通过讲解图的基本概念、原理和方法,使学生掌握图的基础知识。

2.讨论法:通过分组讨论,使学生深入理解图的操作和应用。

3.案例分析法:通过分析实际案例,使学生学会运用图的操作解决实际问题。

4.实验法:通过上机实验,使学生动手实现图的操作,巩固所学知识。

四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将选择和准备以下教学资源:1.教材:《C语言程序设计》2.参考书:《数据结构与算法》3.多媒体资料:PPT课件、教学视频等4.实验设备:计算机、网络等以上教学资源将帮助学生更好地学习图的操作,提高学生的编程能力和解决问题的能力。

数据结构与算法课程设计报告---图的算法实现

数据结构与算法课程设计报告---图的算法实现

数据结构与算法课程设计报告课程设计题目:图的算法实现专业班级:信息与计算科学1002班目录摘要 (1)1、引言 (1)2、需求分析 (1)3、概要设计 (2)4、详细设计 (4)5、程序设计 (10)6、运行结果 (18)7、总结体会 (19)摘要(题目): 图的算法实现实验内容图的算法实现问题描述:(1)将图的信息建立文件;(2)从文件读入图的信息,建立邻接矩阵和邻接表;(3)实现Prim、Kruskal、Dijkstra和拓扑排序算法。

关键字:邻接矩阵、Dijkstra和拓扑排序算法1.引言本次数据结构课程设计共完成图的存储结构的建立、Prim、Kruskal、Dijkstra 和拓扑排序算法等问题。

通过本次课程设计,可以巩固和加深对数据结构的理解,通过上机和程序调试,加深对课本知识的理解和熟练实践操作。

(1)通过本课程的学习,能够熟练掌握数据结构中图的几种基本操作;(2)能针对给定题目,选择相应的数据结构,分析并设计算法,进而给出问题的正确求解过程并编写代码实现。

使用语言:CPrim算法思想:从连通网N={V,E}中的某一顶点v0出发,选择与它关联的具有最小权值的边(v0,v),将其顶点加入到生成树的顶点集合V中。

以后每一步从一个顶点在V中,而另一个顶点不在V中的各条边中选择权值最小的边(u,v),把它的顶点加入到集合V中。

如此继续下去,直到网中的所有顶点都加入到生成树顶点集合V中为止。

拓扑排序算法思想:1、从有向图中选取一个没有前驱的顶点,并输出之;2、从有向图中删去此顶点以及所有以它为尾的弧;重复上述两步,直至图空,或者图不空但找不到无前驱的顶点为止。

没有前驱-- 入度为零,删除顶点及以它为尾的弧-- 弧头顶点的入度减1。

2.需求分析1、通过键盘输入建立一个新的有向带权图,建立相应的文件;2、对建立的有向带权图进行处理,要求具有如下功能:(1)用邻接矩阵和邻接表的存储结构输出该有向带权图,并生成相应的输出结果;(2)用Prim、Kruskal算法实现对图的最小生成树的求解,并输出相应的输出结果;(3)用Dijkstra算法实现对图中从某个源点到其余各顶点的最短路径的求解,并输出相应的输出结果;(4)实现该图的拓扑排序算法。

邻接矩阵和邻接表

邻接矩阵和邻接表

邻接矩阵和邻接表邻接矩阵与邻接表都是建立在图结构中的逻辑关系,用于存储图中相邻节点之间的连接关系,是用来表示网络的重要的数据结构,大量应用于无权图或带权图的表示、存储和操作。

一、邻接矩阵1.概念:邻接矩阵(Adjacency Matrix)是一种用来存储图G中顶点之间的关系的结构,它是由一个二维数组来表示的,数组中的每一行和每一列都代表一个顶点,而数组元素之间的值有一定含义,这些值代表了两个顶点之间是否存在连接,也就是说,只有存在边才能够表示值,否则以无穷大表示。

2.特点:(1)存储空间大:邻接矩阵是一个矩形数组,其中的每一行和每一列都代表一个顶点,那么它所占用的空间一定是与节点的度数有关的,因此在稀疏图结构中使用邻接矩阵对空间也会非常消耗;(2)查找方便:邻接矩阵存储的是节点两两之间的连接关系,只要矩阵中相应位置上的值不为无穷大,就能判断这两个节点之间是否存在连接,因此在查找图中某两节点之间连接关系的时候,邻接矩阵的效率会比较高。

二、邻接表1.概念:邻接表也是一种非常常用的表示图的数据结构,它采用的是链表的形式来存储顶点的相邻的结点的关系,也就是说,每个顶点都会有一个链表来存储它周围的结点。

它能够比较好的展示出图中各个顶点之间的关系,以及图中结点的孤立情况。

2.特点:(1)存储空间小:由于邻接表使用链表的方式存储节点,它可以精确的表示两个节点的距离,而非像邻接矩阵一样,数组中的每一行和每一列都代表一个节点,因此,它所占用的空间会比邻接矩阵小些,在内存空间中有比较大的空间优势;(2)查找速度略低:虽然邻接表能精确的表示两个节点之间的距离,而且只需要占用少量内存,但是查找两点之间连接关系所花费的时间会略大于邻接矩阵。

数据结构课程设计最短路径

数据结构课程设计最短路径

数据结构课程设计最短路径一、课程目标知识目标:1. 理解图的基本概念,掌握图的表示方法,如图的邻接矩阵和邻接表;2. 掌握最短路径问题的定义,了解其应用场景;3. 学会运用Dijkstra算法和Floyd算法解决最短路径问题;4. 了解最短路径算法的时间复杂度,并能够分析其优缺点。

技能目标:1. 能够运用所学知识,编写程序实现最短路径算法;2. 能够分析实际问题,选择合适的数据结构和算法解决最短路径问题;3. 学会使用调试工具,调试并优化最短路径算法程序。

情感态度价值观目标:1. 培养学生对数据结构课程的兴趣,激发学习热情;2. 培养学生的团队合作精神,学会在团队中分工合作,共同解决问题;3. 培养学生面对问题时的耐心和毅力,勇于克服困难,寻求解决方案;4. 通过解决实际问题,增强学生的应用意识和创新意识。

课程性质:本课程为计算机科学专业选修课程,旨在帮助学生掌握图论中的最短路径问题及其算法实现。

学生特点:学生已经具备一定的编程基础,熟悉C/C++等编程语言,了解基本的数据结构,如数组、链表、栈和队列等。

教学要求:结合学生特点和课程性质,注重理论与实践相结合,通过实例分析、算法实现和调试优化,使学生掌握最短路径问题的解决方法,并培养其分析问题和解决问题的能力。

在教学过程中,关注学生的情感态度价值观的培养,提高学生的综合素质。

二、教学内容1. 图的基本概念:图的定义、图的分类、图的表示方法(邻接矩阵、邻接表)。

2. 最短路径问题:最短路径的定义、应用场景、最短路径算法的分类。

3. Dijkstra算法:算法原理、算法步骤、实例分析、编程实现。

4. Floyd算法:算法原理、算法步骤、实例分析、编程实现。

5. 最短路径算法时间复杂度分析:比较Dijkstra算法和Floyd算法的时间复杂度,分析其适用场景。

6. 实践环节:设计实际案例,让学生动手编写程序实现最短路径算法,并进行调试优化。

7. 算法优化:探讨最短路径算法的优化方法,如优先队列、动态规划等。

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

一.需求分析1.运行环境硬件:计算机486/64M以上操作系统: WIN9x 以上/WIN2000/WIN XP/WIN ME相关软件:vistualC++2.程序所实现的功能:(1)建立并显示图的邻接表。

(2)深度优先遍历,显示遍历结果。

(3)对该图进行拓扑排序,显示排序结果。

(4)给出某一确定顶点到所有其它顶点的最短路径。

3.程序的输入,包含输入的数据格式和说明(1)输入顶点数,及各顶点信息(数据格式为整形)(2)输入边数,及权值(数据格式为整形)4.程序的输出,程序输出的形式(1)输出图的邻接表、深度优先遍历结果、拓扑排序结果。

(2)输入某一确定顶点到其它所有顶点的最短路径。

5.测试数据二、设计说明1、算法设计的思想建立图类,建立相关成员函数。

最后在主函数中实现。

具体成员函数的实现请参看源程序。

2、主要的数据结构设计说明图邻接矩阵、邻接表的建立。

图的深度优先遍历、拓扑排序、顶点之间的最短路径。

3、程序的主要模板template <class Type> class Graph4、程序的主要函数Graph、link()、DFTraverse()、TopologicalOrder()、TopologicalOrder()、GetVertexPos()、ShortestPath三、上机结果及体会1、实际完成的情况说明主要程序参考教材《数据结构——C++版》。

2、程序的性能分析可连续建图3、上机过程中出现的问题及其解决方案。

编译没有错误,但结果有问题。

解决方案:虽然程序的编译通过,只能说明语法上没有问题,结果只所以不正确是因为算法上原因。

4、程序中可以改进的地方说明程序中的深度优先遍历,浪费空间较大,可以考虑用循环来做。

但这样将付出代码长度度加长的代价。

5、程序中可以扩充的功能及设计实现假想实现假想:随用户的输入可以随时动态的显示图的生成。

6、收获及体会编写程序即是一件艰苦的工作,又是一件愉快的事情。

最大的收获:编程时如果遇到看似简单但又无法解决的问题,很容易灰心丧气。

此时切不可烦躁,一定要冷静的思考,认真的分析。

要勇敢的面对问题,勇敢的接受问题,勇敢的处理问题,最后最勇敢的解决问题。

四、参考文献数据结构(C++版)叶核亚主编机械工业出版社数据结构经典算法实现与习题解答汪杰编著人民邮电出版社数据结构课程设计苏仕华编著机械工业出版社数据结构程序设计题典李春葆编著清华大学出版社数据结构课程与题解(用C/C++描述)胡圣荣编著北京大学出版社[程序运行流程图]char op //程序控制变量If(op=='Y'||op=='y') if(op=='N'||op=='n')//本程序是邻接矩阵,邻接表的利用,共有4项功能,分别是://(1)建立并显示图的邻接表。

//(2)以非递归方式进行深度优先遍历,显示遍历结果。

//(3)对该图进行拓扑排序,显示排序结果。

//(4)给出某一确定顶点到所有其它顶点的最短路径。

#include<iostream>using namespace std;const int MaxVertexes=20; //最大的顶点数const int b=10000;template <class Type> class Graph ;struct ArcNode{//定义边结点friend class Graph <class Type>;int adjvex; //和边(或弧)相关联的另一个顶点序号int weight; //边(或弧)上的信息ArcNode *nextarc ; //指向下一条边结点的指针ArcNode(int v,int w ) : adjvex( v ),weight(w),nextarc( NULL ){ }};//构造函数template <class Type>struct VertexNode{// 定义顶点结点friend class Graph <class Type>;Type data; //顶点的信息ArcNode *firstarc ; //指向依附该顶点的边链表};template <class Type>class Graph{VertexNode<Type> * VTable; //顶点表int CurrentNumVertexes; //当前的顶点数int CurrentNumArcs; //当前的边(或弧)数public:int GetVertexPos( const Type &v );// 取顶点v在数组中的位置Graph(Type v[],int num=MaxVertexes); //构造函数Type GetValue(int v); //取图中顶点v的值,如果顶点v不存在则返回空 int Getweight(int v1,int v2); //取边(或弧)上的权值int GetFirstNeighbor(int v); //取图中顶点v的第一个邻接点的序号。

如果不存在返回-1int GetNextNeighbor(int v1, int v2); //取图中下一个邻接点int Arcs[MaxVertexes][MaxVertexes];//用数组记录每个边的信息int InVertex(Type &v); //在图中插入结点int InsertArc(int v1, int v2,int w);//在图中插入依附于v1和v2的边或弧,w是信息int NumberOfVertexes( ){return CurrentNumVertexes; } //返回当前的顶点数int NumberOfArcs(){ return CurrentNumArcs; } //返回当前的边(或弧)数int *dist; //最短路径长度数组int *InDegree; //入度数组,记录每个顶点的入度int *path; //最短路径的数组int *s; //最短路径终点数组void link(); //输出邻接链表void DFS(const int v,int visited[]);//深度优先搜索void DFTraverse (); //深度遍历void TopologicalOrder(); //拓扑排序void ShortestPath(int n,int v);//最短路径};//////////////////////////////////////////////////////////////////////////////// ///template<class Type>int Graph<Type>::GetVertexPos(const Type &v ){ //根据顶点v查找该顶点在邻接表中的位置for(int i=0;i<CurrentNumVertexes;i++)if(VTable[i].data==v) return i;return -1;}template<class Type>Graph<Type>::Graph( Type v[] , int num=MaxVertexes) : CurrentNumVertexes(0), CurrentNumArcs(0){Type tail, head;int i=0,e,h,t,w,p=0;while(p<MaxVertexes){for(int j=0;j<MaxVertexes;j++){Arcs[p][j]=b;if(p==j) {Arcs[p][j]=0;}}p++;}InDegree=new int[MaxVertexes];VTable=new VertexNode<Type>[MaxVertexes];//创建顶点表for(i=0;i<num;i++) //输入各顶点信息{ InVertex(v[i]); //在顶点表中插入顶点v[i]InDegree[i]=0;}cout<<"输入边的条数:"; cin >> e;//输入边的条数cout<<endl;for(i=0;i< e;i++){ //逐条输入边cout<<"输入第"<<i+1<<"条边:(弧头,弧尾,权值)";cin>>tail>>head>>w; //输入一条边int j=GetVertexPos(head);while((t=GetVertexPos(tail))==-1)cout<<"输入的顶点(tail)不存在";while((h = GetVertexPos(head ))==-1)cout<<"输入的顶点(head)不存在";InsertArc (t,h,w); //插入一条边InDegree[j]++; //顶点j的入度加1cout<<endl;}}template<class Type>Type Graph<Type>::GetValue(int v){ //取图中顶点v的值,如果顶点v不存在,则返回空 if(v>=0&&v<CurrentNumVertexes) return VTable[v].data;return NULL;}template<class Type>int Graph<Type>::Getweight(int v1,int v2){//取出以顶点v1和v2为两端点的边上的权值if(v1>=0&&v1<CurrentNumVertexes&&v2>=0&&v2<CurrentNumVertexes){ArcNode *p=VTable[v1].firstarc;while(p!=NULL){if(p->adjvex==v2) {return p->weight;}else {p=p->nextarc; }}} return NULL;}template<class Type>int Graph<Type>::GetFirstNeighbor(int v){//查找顶点v的第一个邻接顶点的位置if(v>=0&&v<CurrentNumVertexes){ArcNode *p=VTable[v].firstarc;if(p!=NULL) return p->adjvex;}return -1;}template<class Type>int Graph<Type>::GetNextNeighbor(int v1,int v2){//查找顶点v1的在v2之后的下一个邻接顶点,如果不存在返回-1if (v1!=-1){ArcNode *p=VTable[v1].firstarc;while(p!=NULL){if(p->adjvex==v2&&p->nextarc!=NULL)return p->nextarc->adjvex;//返回下一个邻接顶点在邻接表中的位置else p=p->nextarc;}}return -1;//没有查到下一个邻接顶点返回-1}template<class Type>int Graph<Type>::InsertArc(int v1,int v2,int w){//在图中插入弧<v1,v2>if(v1>=0&&v1<CurrentNumVertexes){Arcs[v1][v2]=w;ArcNode *newnode =new ArcNode(v2,w);ArcNode *h=VTable[v1].firstarc;if(h!=NULL){ArcNode *p=h;while(h!=NULL&&h->adjvex<v2){p=h; h=h->nextarc;}newnode->nextarc=p->nextarc;p->nextarc=newnode;return 1;}VTable[v1].firstarc=newnode;return 1;}return -1;}template<class Type>int Graph<Type>::InVertex(Type &v){//在图中插入顶点,插入成功则返回1,否则返回0if(CurrentNumVertexes<MaxVertexes-1){//若顶点表未满VTable[CurrentNumVertexes].data=v;VTable[CurrentNumVertexes].firstarc=NULL;CurrentNumVertexes++; return 1;}return -1;}/////////////////////////////////////////////////////////////////////// //以下是实验要求的函数//输出邻接表template<class Type>void Graph<Type>::link(){cout<<"输出邻接表:"<<endl;for(int i=0;i<CurrentNumVertexes;i++){cout<<GetValue(i);int a=GetFirstNeighbor(i);if(a!=-1) cout<<"->"<<GetValue(a)<<Getweight(i,a);for(int j=a;j!=-1;j=a){a=GetNextNeighbor(i,j);if(a!=-1) cout<<"->"<<GetValue(a)<<Getweight(i,a);}cout<<endl;}}//拓扑排序template<class type>void Graph<type>::TopologicalOrder(){int m=0;//m为输出的顶点数,初始值为0for(int i=0;i<CurrentNumVertexes;i++){for(int n=0;n<CurrentNumVertexes;n++){if(InDegree[n]==0){m++;//输出的顶点数加1cout<<VTable[n].data<<endl;InDegree[n]=-1;for(int t=0;t<CurrentNumVertexes;t++){if(n>=0&&n<CurrentNumVertexes){if(t>=0&&t<CurrentNumVertexes){if(Arcs[n][t]!=0&&Arcs[n][t]!=b)InDegree[t]--;}}}for(int h=0;h<CurrentNumVertexes;h++){cout<<InDegree[h]<<" ";} cout<<endl; break;}}}if(m<CurrentNumVertexes) cout<<"AOV网络中有回路(有向环)!"<<endl; }//深度遍历template<class Type>void Graph<Type>::DFS(const int v,int visited[ ]){cout<< VTable[v].data<<" "; //访问顶点 vvisited[v] =1; //顶点v 作访问标记int w = GetFirstNeighbor (v);while (w != -1) { //若顶点 w 存在if (!visited[w]) DFS (w,visited);w = GetNextNeighbor(v,w);} //重复检测 v 的所有邻接顶点}template<class Type>void Graph <Type> ::DFTraverse (){int i, n = NumberOfVertexes() ; //取图的顶点个数int * visited = new int [n]; //定义访问标记数组 visitedfor ( i = 0; i < n; i++ )visited [i] = 0; //访问标记数组 visited 初始化for ( i = 0; i < n; i++ ) //对图中的每一个顶点进行判断if (!visited [i]) DFS (i, visited );delete[ ]visited; //释放 visited}//求最短路径template<class Type>void Graph<Type>::ShortestPath(int n,int v){int min,u;dist=new int[n]; s=new int[n]; path=new int[n];for(int j=0;j<n;j++){dist[j]=Arcs[v][j]; s[j]=0;if(j!=v&&dist[j]<MaxVertexes) path[j]=v;else path[j]=-1; s[v]=1;}for(int i=0;i<=n-1;i++){min=MaxVertexes; u=v;for(int j=0;j<n;j++)if(!s[j]&&dist[j]<min){u=j; min=dist[j];}s[u]=1;for(int w=0;w<n;w++)if(!s[w]&&dist[u]+Arcs[u][w]<dist[w]){dist[w]=dist[u]+Arcs[u][w];path[w]=u;}if(v!=i&&dist[i]!=10000&&v!=path[i])cout<<GetValue(v)<<"到顶点"<<GetValue(i)<<"的最短路径是:"<<GetValue(v)<<GetValue(path[i])<<GetValue(i)<<endl;else if(v!=i&&dist[i]!=10000)cout<<GetValue(v)<<"到顶点"<<GetValue(i)<<"的最短路径是:"<<GetValue(path[i])<<GetValue(i)<<endl;}for(int m=0;m<n;m++)cout<<GetValue(v)<<"到顶点"<<GetValue(m)<<"的最短路径长度是:"<<dist[m]<<endl;}//主函数void main(){char op;do{int m,i=0,j=0,w;char a[20],c;cout<<"请你输入顶点的个数:"; cin>>m;for(i=0;i<m;i++){cout<<"请输入第"<<j<<"个结点:";cin>>a[i]; cout<<endl; j=j+1;}Graph<char>G(a,m);G.link();cout<<"深度遍历:"<<endl;G.DFTraverse();cout<<endl;cout<<"拓扑排序:"<<endl;G.TopologicalOrder();cout<<endl;cout<<"输入最小路径的源头结点:"<<endl;cin>>c;w=G.GetVertexPos(c);G.ShortestPath(m,w);loop:cout<<"是继续?(Y or N)"<<endl;cin>>op;if(op=='N'||op=='n')break;if(op!='Y'&&op!='y'&&op!='N'&&op!='n')goto loop; }while(op=='Y'||op=='y');}。

相关文档
最新文档