数据结构 图
数据结构图的实验报告

数据结构图的实验报告数据结构图的实验报告引言:数据结构图是计算机科学中重要的概念之一。
它是一种用图形表示数据元素之间关系的数据结构,广泛应用于算法设计、程序开发和系统优化等领域。
本实验报告旨在介绍数据结构图的基本原理、实验过程和结果分析。
一、实验目的本次实验的主要目的是掌握数据结构图的基本概念和操作方法,以及通过实验验证其在解决实际问题中的有效性。
具体而言,我们将通过构建一个社交网络关系图,实现对用户关系的管理和分析。
二、实验方法1. 确定数据结构在本次实验中,我们选择了无向图作为数据结构图的基础。
无向图由顶点集和边集组成,每条边连接两个顶点,且没有方向性。
2. 数据输入为了模拟真实的社交网络,我们首先需要输入一组用户的基本信息,如姓名、年龄、性别等。
然后,根据用户之间的关系建立边,表示用户之间的交流和联系。
3. 数据操作基于构建好的数据结构图,我们可以进行多种操作,如添加用户、删除用户、查询用户关系等。
这些操作将通过图的遍历、搜索和排序等算法实现。
三、实验过程1. 数据输入我们首先创建一个空的无向图,并通过用户输入的方式逐步添加用户和用户关系。
例如,我们可以输入用户A和用户B的姓名、年龄和性别,并建立一条边连接这两个用户。
2. 数据操作在构建好数据结构图后,我们可以进行多种操作。
例如,我们可以通过深度优先搜索算法遍历整个图,查找与某个用户具有特定关系的用户。
我们也可以通过广度优先搜索算法计算某个用户的社交网络影响力,即与该用户直接或间接相连的其他用户数量。
3. 结果分析通过实验,我们可以观察到数据结构图在管理和分析用户关系方面的优势。
它能够快速地找到用户之间的关系,帮助我们了解用户的社交网络结构和影响力。
同时,数据结构图也为我们提供了一种可视化的方式来展示用户之间的关系,使得分析更加直观和易于理解。
四、实验结果通过实验,我们成功构建了一个社交网络关系图,并实现了多种数据操作。
我们可以根据用户的姓名、年龄和性别等信息进行查询,也可以根据用户之间的关系进行遍历和排序。
数据结构 图 练习题

数据结构图练习题数据结构图练习题在计算机科学领域中,数据结构是一种用来组织和存储数据的方式。
而图是一种常见的数据结构,它由一组节点和连接这些节点的边组成。
图可以用来表示各种各样的关系,比如社交网络中的用户关系、城市之间的道路网络等等。
在本文中,我们将探讨一些与图相关的练习题,帮助读者更好地理解和应用图的概念。
1. 最短路径问题最短路径问题是图论中的经典问题之一。
给定一个带权重的有向图,我们需要找到从一个起始节点到目标节点的最短路径。
这里的权重可以表示为距离、时间或者其他度量。
解决这个问题的算法有很多,其中最著名的是Dijkstra算法和Bellman-Ford算法。
读者可以尝试使用这些算法来解决一些具体的实例,比如计算两个城市之间的最短路径。
2. 拓扑排序拓扑排序是对有向无环图(Directed Acyclic Graph,简称DAG)进行排序的一种算法。
在一个DAG中,节点之间存在一种偏序关系,即某些节点必须在其他节点之前进行处理。
拓扑排序可以帮助我们确定这种偏序关系,从而找到一种合理的处理顺序。
比如,在编译器中,拓扑排序可以用来确定源代码中各个函数的调用顺序。
读者可以尝试编写一个拓扑排序算法,并应用到一些具体的场景中。
3. 最小生成树最小生成树是一个无向连通图中一棵权值最小的生成树。
在一个连通图中,最小生成树可以帮助我们找到一种最优的连接方式,以满足一些约束条件。
最常用的算法是Prim算法和Kruskal算法。
读者可以尝试使用这些算法来解决一些具体的实例,比如在一个城市之间建设光纤网络,以最小的成本实现全覆盖。
4. 图的遍历图的遍历是指按照某种方式访问图中的所有节点。
常见的遍历算法有深度优先搜索(DFS)和广度优先搜索(BFS)。
DFS通过递归地访问每个节点的邻居节点,直到所有节点都被访问完。
BFS则通过队列来实现,先访问起始节点的邻居节点,然后依次访问它们的邻居节点,直到所有节点都被访问完。
北京理工大学数据结构图课件

B C D
第 5 页
E
7.1 图的定义与术语
3、无向图——无向图G是由两个集合V(G)和 E(G)组成的。 其中:V(G)是顶点的非空有限集。 E(G)是边的有限集合,边是顶点的 无序对,记为 (v,w) 或 (w,v),并且 (v,w)=(w,v)。
第 6 页
7.1 图的定义与术语
例如:
G2 = <V2,E2> V2 = { v0 ,v1,v2,v3,v4 } E2 = { (v0,v1), (v0,v3), (v1,v2), (v1,v4), (v2,v3), (v2,v4) }
V5
第 15 页
7.1 图的定义与术语
非 连 通 图
V0
V1
V2
V3
V0
V1 V3
V2
强连通分量
第 16 页
7.1 图的定义与术语
7、生成树
包含无向图 G 所有顶点的极小连通子图称为G生 成树。 极小连通子图意思是:该子图是G的连通子图, 在该子图中删除任何一条边,子图不再连通。
V0 V2 V3 V4 V3 连通图G1 V1 V0 V1 连通 所有顶点 V4 无回路
第 22 页
7.2 图的存储结构 3、有向图的逆邻接表 顶点:用一维数组存储(按编号顺序) 以同一顶点为终点的弧:用线性链表存储。
vexdata V0 V1 0 1 v0 v1 v2
v3
firstarc 3 0 0 ^ ^
V2
V3
2 3
^
^
2
章 类似于有向图的邻接表,所不同的是: 以同一顶点为终点弧:用线性链表存储
Boolean visited[MAX]; // 访问标志数组
数据结构-图

出发点,访问D,标注数字序号④;
(a)无向图 G9
(b)深度优先遍历
图的遍历
3.1图的深度优先遍历
接着到G,访问G, 标注数字序号⑤;G 相邻顶点都访问过了,顺着虚线箭头方向
回退到 D,D 相邻顶点都访问过了,顺着虚线箭头方向回退到C,C 相邻顶点也都访问过
图的基本概念
1.2图的操作定义
02
PART
图的存储结构
2.1邻接矩阵
首先介绍的是数组表示法,即用两个数组分别存储顶点的信息和顶点之间的关系。
用来存放图中 n 个顶点的数组称为顶点数组。我们可将图中顶点按任意顺序保存到顶点数组中,
这样按存放次序每个顶点就对应一个位置序号(简称位序),依次为0~n-1;接着用一个 n×n 的二维
称为有向图。例如,当V={v1,v2,v3,v4,v5},VR={<v1,v2>,
<v1,v4>,<v2,v4>,<v3,v1>,<v3,v5>,<v4,v3>,<v5,v4>},则顶点集合
V、关系集合VR 构成有向图G1=(V,VR),如图(a)所示。
图的基本概念
1.1图的定义与基本术语
无向图(Undirected Graph)。如果顶点间的关系是无
序号作为表结点的值,所以一条弧对应一个表结点。右图为有向图 G1
和无向图 G2的邻接表表示法存储示意图。
图的存储结构
2.2邻接表
对于有向网和无向网,由于表结点表示边或弧,因此需要对表结点扩充一个属性域,表
结点至少包含顶点序号、权值和下一表结点指针 3 个属性,由此构成网的邻接表。
数据结构图

所以:对于点多边少的稀疏图来说,采用邻接表 结构使得算法在时间效 率上大大提高。
16
3/12
广度优先搜索(Breadth First Search,简称BFS ) BFS类似于树的层序遍历; 用一个数组用于标志已访问与否,还需要一个工作队列。
【例】一个无向图的BFS
8
6
CD
4
7
HG
BA
邻接多重表(Adjacency Multilist)
9
边表
• 在某些应用中,有时主要考察图中边的权值以及所依附的 两个顶点,即图的结构主要由边来表示,称为边表存储结 构。
• 边表结构采用顺序存储,用2个一维数组构成,一个存储 顶点信息,一个存储边的信息。边数组的每个元素由三部 分组成:
– 边的起点下标 – 边的终点下标 – 边的权值
1
A [i][
j]
0
如果 (vi , v j ) 或 vi , v j G的边 其它
无权图的邻接矩阵表示示例
V1
V2
V0
3
V3
4 12/15
带权图的邻接矩阵的定义
A [i][ j] wij
如果 (vi , vj ) 或 vi , v j G的边 其它
带图权的图邻的接邻矩接阵矩表阵示表示示例示[例例6.9]
1
第一部分 图的定义和术语
2
图的定义
“图” G可以表示为两个集合:G =(V, E)。每条 边是一个顶点对(v, w) E ,并且 v, w V。
通常:用 |V| 表示顶点的数量(|V| ≥ 1), 用 |E| 表示边的数量(|E| ≥ 0)。
(1) 无向图(完全有向图边数与顶点数之间的 关系) (2) 有向图(完全有向图弧数与顶点数之间的 关系) (3) 简单图:没有重边和自回路的图 (4) 邻接 (5) 路径,路径长度 (6) 无环(有向)图:没有任何回路的(有向)图 (7) 度,入度,出度 (8) 无向图的顶点连通、连通图、连通分量 (9) 有向图的顶点强连通,强连通图、连通分量
数据结构图结构(动态PPT)课件

结合实际问题
将数据结构图与实际问题相结合,通过分析问题的本质和 规律,选择合适的数据结构和算法进行求解。
创新应用方式
在传统的数据结构图应用基础上,探索新的应用方式和方 法,如基于数据结构图的机器学习模型、数据结构图在社 交网络分析中的应用等。
跨学科融合
将数据结构图与其他学科领域进行融合,如物理学、化学 、生物学等,通过借鉴其他学科的理论和方法,创新数据 结构图的应用场景和解决方案。
包括无向图、有向图、权 重图、邻接矩阵、邻接表 等。
图的遍历方法
深度优先搜索(DFS)和 广度优先搜索(BFS)的 原理和实现。
非线性数据结构图应用案例
树的应用案例
包括二叉搜索树、堆、哈夫曼树等在实际问题中的应用,如排序、优先队列、 编码等。
图的应用案例
包括最短路径问题(Dijkstra算法、Floyd算法)、最小生成树问题(Prim算法 、Kruskal算法)以及网络流问题等在实际问题中的应用,如交通网络规划、电 路设计等。
根据实际需求,选择适合的最小生 成树算法,如Prim算法、Kruskal算
法等。
B
C
D
可视化呈现结果
将算法的运行过程和结果以图形化的方式 呈现出来,方便用户直观地理解和掌握最 小生成树算法的原理和实现过程。
实现算法逻辑
编写代码实现最小生成树算法的逻辑,包 括节点的选择、边的添加和权重的计算等 。
拓展思考:如何创新应用数据结构图解决问题
作用
帮助理解复杂数据结构的组成和 关系,提高数据处理的效率。
常见类型及特点
01
02
03
04
线性数据结构图
元素之间一对一关系,如数组 、链表等。
树形数据结构图
数据结构图结构-(动态PPT)

3
1
*
图的术语
完全图 边达到最大的图
无向完全图:具有n(n-1)/2条边的简单图称为无向完全图 有向完全图:具有n(n-1)条边的有向图。 稀疏图: 边或弧很少的图。 稠密图: 边或弧很多的图。 权:与图的边或弧相关的数。 网:边或弧上带有权值的图。
*
图的术语
路径长度:路径上边或弧的数目
路径 非空有限点、弧交替序列,
1.无向图邻接表
2
5
3
4
1
1 2 3 4 5
G2
1
2
3
4
5
adjvex nextarc
vexdata firstarc
*
2.有向图邻接表
2
3
4
1
4
3
1
2
1 2 3 4
如图G1的邻接表为:
G1
1
2
3
4
*
在邻接表的边链表中,各个边结点的链入顺序任意,视边结点输入次序而定。
设图中有 n 个顶点,e 条边,则用邻接表表示无向图时,需要 n 个顶点结点,2e 个边结点;用邻接表表示有向图时,若不考虑逆邻接表,只需 n 个顶点结点,e 个边结点。
04
03
G2
*
图的术语
证明:对有向图,每个顶点至多有n-1条边与其它的n-1个顶点相连,则n个顶点至多有n(n-1)条边。但对无向图,每条边连接2个顶点,故最多为n(n-1)/2
02
设n为顶点数,e为边或弧的条数 对无向图有:0 ≤ e ≤ n(n-1)/2 有向图有:0≤ e ≤ n(n-1)
回路:无重复边的闭路径。
回路但不是环
*
图的术语
01
《数据结构图》课件

欢迎来到《数据结构图》PPT课件!本课程将带您深入了解数据结构的定义、 常见类型以及应用领域。让我们一起开始探索这个精彩的主题吧!
概述
通过本节课,您将了解到数据结构的基本概念和作用。我们将探讨如何存储 和组织数据以及优化数据访问和操作的方法。
数据结构的定义
在这一节中,我们将介绍数据结构的定义,并探讨数据的抽象和表示方法。 了解数据结构的定义将有助于您理解数据在计算机中的常重要,因为不同的数据结构适用于不同的场景和数据操作需求。本节将深入 研究线性结构、树形结构和图形结构。
线性结构
线性结构是最简单且最常见的数据结构类型之一。我们将研究数组、链表和 栈等线性结构的特点、优点和缺点,并了解它们在实际应用中的使用情况。
树形结构
树形结构是一种层次化的数据结构,常用于表示层级关系。本节我们将探讨 二叉树、堆和AVL树等树形结构,并讨论它们在数据处理和搜索中的应用。
图形结构
图形结构是一种包含节点和边的数据结构,用于表示复杂的关联关系。本节我们将深入研究图的定义、遍历算 法和最短路径算法,并讨论图形结构在社交网络和地图导航中的应用。
数据结构的应用
数据结构是计算机科学领域中的核心概念,几乎应用于所有的软件开发领域。 本节我们将探讨数据结构在数据库、图形处理和算法设计中的实际应用。
数据结构图的设计原则
了解数据结构图的设计原则有助于我们创建清晰、易于理解的数据结构图。 本节我们将讨论数据结构图的设计原则,例如模块化、抽象和简洁性。
数据结构图

规则项
7 工 8 高 9 技 10 助 11 工 >20年 12 高
10~20年
工 资
600
800
1000
1400
700
900
1100
1400
800
1000
1200
1500
注:技术员简称“技”;助理工程师简称“助”;工程师简称“工”;高级工程师简称“高”。
三.判定树(又称决策树) 以图形方式描述基本加工逻辑功能的有效工具。比较直观, 结构清晰,容易 理解,但当条件太多时,不易清楚表达整个判断的过程。它比判定表更加直观, 但不如判定表简洁。
6
结构化英语
判断 语句 循环 语句
表达在某种条件下重复执行 FOR 条件描述 相同的动作,直到这个条件不 DO 成立为止。 重复处理部分
3.2.4 处理逻辑表达方式(3)
基本语句举例 1.祈使语句 计算工资 发补考通知 2.判断语句 IF 库存极限量 THEN IF 已订货 THEN 取消订货 ELSE 什么也不做 ELSE 订货延期… 3.循环语句 “生成学生成绩单”(要计算每一个学生的平均成绩)。 FOR 每一个学生 DO 计算平均成绩
条件段 动作段
条件组合 动作执行
9
3.2.4 处理逻辑表达方式(6)
库存控制过程的判定表
决策规则号 条 库存极限量
库存订货点 1 是 2 是 3 否 是 是 否 是 4 否 是 否 否 是 是 是 否 是 是 否 否 是 否 否 是 否 否 5 6 7 8 9
件 库存最低贮备量 段
已订货吗? 订货是否迟到?
3.2.4 处理逻辑表达方式(5)
二.判定表(又称决策表) 它是以图表方式描述多条件下决策问题的有效工具。 在描述的问题比较复杂的情况下,采用结构化语言不易表达 清楚,且需要较大的文字篇幅时,采用决策表比较合适。它可以 直观地表达出具体条件、决策规则和应当采取的行动之间的逻 辑关系。判定表由条件段、判定项、动作段和动作项组成。 判定表的一般形式
数据结构图实验报告

数据结构图实验报告一、实验目的本次实验的主要目的是深入理解和掌握数据结构图的基本概念、原理和操作方法,通过实际编程和操作,提高对数据结构的应用能力和解决问题的能力。
二、实验环境本次实验使用的编程语言为C++,开发环境为Visual Studio 2019。
三、实验内容(一)线性表1、顺序表实现顺序表的创建、插入、删除、查找等基本操作。
分析顺序表在不同操作下的时间复杂度。
2、链表实现单链表、双向链表的创建、插入、删除、查找等基本操作。
比较单链表和双向链表在操作上的优缺点。
(二)栈和队列1、栈实现顺序栈和链式栈。
用栈解决表达式求值问题。
2、队列实现顺序队列和链式队列。
用队列模拟银行排队问题。
(三)树1、二叉树实现二叉树的创建、遍历(前序、中序、后序)。
计算二叉树的深度和节点数。
2、二叉搜索树实现二叉搜索树的插入、删除、查找操作。
分析二叉搜索树的性能。
(四)图1、图的存储实现邻接矩阵和邻接表两种图的存储方式。
比较两种存储方式的优缺点。
2、图的遍历实现深度优先遍历和广度优先遍历算法。
用图的遍历解决最短路径问题。
四、实验步骤(一)线性表1、顺序表定义一个数组来存储顺序表的元素,并使用一个变量记录当前表的长度。
插入操作时,需要判断插入位置是否合法,如果合法则将插入位置后的元素依次向后移动一位,然后将新元素插入指定位置。
删除操作时,先判断删除位置是否合法,合法则将删除位置后的元素依次向前移动一位,并更新表的长度。
查找操作通过遍历数组来实现。
分析不同操作的时间复杂度,插入和删除操作在最坏情况下为O(n),查找操作在平均情况下为 O(n/2)。
2、链表对于单链表,定义一个节点结构体,包含数据域和指向下一个节点的指针域。
通过操作指针来实现插入、删除和查找操作。
双向链表则在节点结构体中增加指向前一个节点的指针,使得操作更加灵活,但也增加了空间复杂度。
比较单链表和双向链表在插入、删除操作中指针的调整过程,得出双向链表在某些情况下更方便,但空间开销较大的结论。
数据结构图的存储结构及基本操作

数据结构图的存储结构及基本操作一、数据结构图的存储结构数据结构图是一种表示数据元素之间关系的图形结构,常用于描述实体之间的关系、网络拓扑结构等。
数据结构图的存储结构可以使用邻接矩阵、邻接表等方式进行表示。
1.邻接矩阵存储结构邻接矩阵是使用二维数组表示数据结构图的存储结构。
数组的行和列分别代表数据结构图中的顶点,矩阵中的元素表示对应顶点之间的关系。
例如,如果顶点i和顶点j之间存在边,则邻接矩阵中(i,j)位置的元素为1;否则为0。
邻接矩阵的优点是可以快速判断两个顶点之间是否存在边,但缺点是当图中顶点较多时,矩阵中大部分元素为0,造成空间浪费。
2.邻接表存储结构邻接表是使用链表表示数据结构图的存储结构。
每个顶点对应一个链表,链表中的节点表示与该顶点直接相连的其他顶点。
顶点的链表可以使用数组或链表等数据结构来表示。
邻接表的优点是可以有效地利用存储空间,只存储存在边的关系,不存储无关边的信息。
但缺点是判断两个顶点之间是否存在边需要遍历链表,时间复杂度较高。
二、数据结构图的基本操作1.创建数据结构图创建数据结构图的操作是初始化一个空的图结构,可以选择使用邻接矩阵或邻接表存储结构。
根据实际需求,可以根据顶点和边的信息逐个添加到图结构中。
2.添加顶点添加顶点是向数据结构图中增加一个新的顶点,可以根据实际需求给顶点赋予相应的值或标识。
添加顶点的操作需要更新邻接矩阵或邻接表的相应位置。
3.添加边添加边是在两个已存在的顶点之间建立连接关系。
根据实际需求,可以指定边的权重或其他属性。
添加边的操作需要更新邻接矩阵或邻接表的相应位置。
4.删除顶点删除顶点是将一个存在的顶点从图结构中移除,同时将与该顶点相关的边也一并删除。
删除顶点的操作需要更新邻接矩阵或邻接表的相应位置。
5.删除边删除边是在两个已存在的顶点之间断开连接关系。
删除边的操作需要更新邻接矩阵或邻接表的相应位置。
6.查找顶点查找顶点是根据给定的值或标识在图结构中查找相应的顶点。
2024版《数据结构图》ppt课件

良好的数据结构可以带来更高的运 行或存储效率,是算法设计的基础, 对程序设计的成败起到关键作用。
常见数据结构类型介绍
线性数据结构
如数组、链表、栈、队 列等,数据元素之间存
在一对一的关系。
树形数据结构
如二叉树、多叉树、森 林等,数据元素之间存
在一对多的关系。
图形数据结构
由顶点和边组成,数据 元素之间存在多对多的
队列定义、特点及应用场景
队列的特点 只能在队尾进行插入操作,队头进行删除操作。
队列是一种双端开口的线性结构。
队列定义、特点及应用场景
应用场景 操作系统的任务调度。 缓冲区的实现,如打印机缓冲区。
队列定义、特点及应用场景
广度优先搜索(BFS)。
消息队列和事件驱动模型。
串定义、基本操作及实现方法
最短路径问题 求解图中两个顶点之间的最短路径,即路径上边 的权值之和最小。
3
算法介绍 Prim算法、Kruskal算法、Dijkstra算法、Floyd 算法等。
拓扑排序和关键路径问题探讨
拓扑排序
对有向无环图(DAG)进行排序, 使得对每一条有向边(u,v),均有
u在v之前。
关键路径问题
求解有向无环图中从源点到汇点 的最长路径,即关键路径,它决
遍历二叉树和线索二叉树
遍历二叉树
先序遍历、中序遍历和后序遍历。遍历算 法可以采用递归或非递归方式实现。
VS
线索二叉树
利用二叉链表中的空指针来存放其前驱结 点和后继结点的信息,使得在遍历二叉树 时可以利用这些线索得到前驱和后继结点, 从而方便地遍历二叉树。
树、森林与二叉树转换技巧
树转换为二叉树
加线、去线、层次调整。将树中的每个结点的所有孩子结点用线连接起来,再去掉与原结点相连的线,最后 将整棵树的层次进行调整,使得每个结点的左子树为其第一个孩子,右子树为其兄弟结点。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
常熟理工学院《数据结构与算法》实验指导与报告书_2017-2018_____学年第__1__ 学期专业:物联网工程实验名称:实验七图实验地点: N6-210 指导教师:聂盼红计算机科学与工程学院2017实验七 图【实验目的】1、掌握图的邻接矩阵和邻接表表示。
2、掌握图的深度优先和广度优先搜索方法。
3、掌握图的最小生成树Prim 算法。
4、掌握图的拓扑排序算法。
5、掌握图的单源最短路径dijkstra 算法。
【实验学时】4-6学时【实验预习】回答以下问题:1、写出图7-1无向图的邻接矩阵表示。
2、写出图7-2有向图的邻接表表示。
3、写出图7-1的深度优先搜索序列和广度优先搜索序列。
深度优先搜索序列:A,C,B,D,E,F,G ,H EFBACDABCGFDEH广度优先搜索序列:A,B,C,D,E,F,G ,H,4、写出图7-2的拓扑序列,说明该有向图是否有环? 拓扑序列:EABCD 该有向图没有环5、根据图7-3,写出其最小生成树。
图7-3 无向带权图G36、根据图7-4,求从顶点A 到其他顶点的单源最短路径。
ABCDE F10060301050105X`图7-4有向带权图G4单源最短路径:<A,C>=10:AC <A,D>=50:AED <A,E>=30:AE<A,F>=60:AEDF【实验内容和要求】1、 编写程序exp7_1.c ,实现图的邻接矩阵存储及图的深度优先搜索和广度优先搜索。
以图7-1的无向图为例,补充完整程序,调试运行并写出运行结果。
运行结果:(包括输入数据) CFDBAE6215566345exp7_1.c参考程序如下:#include<stdio.h>#define N 20#define TRUE 1#define FALSE 0#define MAX 100int visited[N]; /*访问标志数组*/typedef struct { /*辅助队列的定义*/int data[N];int front,rear;}queue;typedef struct { /*图的邻接矩阵表示*/int vexnum,arcnum;char vexs[N];int arcs[N][N];}MGraph;void createGraph(MGraph *g); /*建立一个无向图的邻接矩阵*/void dfs(int i, MGraph *g); /*从第i个顶点出发深度优先搜索*/ void tdfs(MGraph *g); /*深度优先搜索整个图*/void bfs(int k, MGraph *g); /*从第k个顶点广度优先搜索*/void tbfs(MGraph *g); /*广度优先搜索整个图*/void init_visit(); /*初始化访问标识数组*/void createGraph(MGraph *g) { /*建立一个无向图的邻接矩阵*/ int i=0,j,e=0;char v;g->vexnum=0;g->arcnum=0;printf("\n输入顶点序列(以#结束):\n");while ((v=getchar())!='#') {g->vexs[i]=v; /*读入顶点信息*/i++;}g->vexnum=i; /*顶点数目*/for (i=0;i<g->vexnum;i++) /*邻接矩阵初始化*/for (j=0;j<g->vexnum;j++)g->arcs[i][j]=0;/*(1)-邻接矩阵元素初始化为0*/ printf("\n输入边的信息(顶点序号,顶点序号),以(-1,-1)结束:\n");scanf("%d,%d",&i,&j); /*读入边(i,j)*/while (i!=-1) { /*读入i为-1时结束*/g->arcs[i][j]=1;/*(2)-i,j对应边等于1*/e++;scanf("%d,%d",&i,&j);}g->arcnum=e; /*边数目*/}/* createGraph *//*(3)---从第i个顶点出发深度优先搜索,补充完整算法*/void dfs(int i, MGraph *g){int j;printf("%c",g->vexs[i]);visited[i]=1;for(j=0;j<g->vexnum;j++)if((g->arcs[i][j]==1)&&(!visited[j]))dfs(j,g);}/* dfs */void tdfs(MGraph *g) { /*深度优先搜索整个图*/int i;printf("\n从顶点%C开始深度优先搜索序列:",g->vexs[0]);for (i=0;i<g->vexnum;i++)if (visited[i]!=1) /*(4)---对尚未访问过的顶点进行深度优先搜索*/ dfs(i,g);printf("\n");}/*tdfs*/void bfs(int k, MGraph *g) { /*从第k个顶点广度优先搜索*/int i,j;queue qlist,*q;q=&qlist;q->rear=0;q->front=0;printf("%c",g->vexs[k]);visited[k]=TRUE;q->data[q->rear]=k;q->rear=(q->rear+1)%N;while (q->rear!=q->front) { /*当队列不为空,进行搜索*/i=q->data[q->front];q->front=(q->front+1)%N;for (j=0;j<g->vexnum;j++)if ((g->arcs[i][j]==1)&&(!visited[j])) {printf("%c",g->vexs[j]);visited[j]=TRUE;q->data[q->rear]=j; /*(5)---刚访问过的结点入队*/q->rear=(q->rear+1)%MAX; /*(6)---修改队尾指针*/ }}}/*bfs*/void tbfs(MGraph *g) { /*广度优先搜索整个图*/int i;printf("\n从顶点%C开始广度优先搜索序列:",g->vexs[0]);for (i=0;i<g->vexnum;i++)if (visited[i]!=TRUE)bfs(i,g); /*从顶点i开始广度优先搜索*/ printf("\n");}/*tbfs*/void init_visit(){ /*初始化访问标识数组*/int i;for (i=0;i<N;i++)visited[i]=FALSE;}int main(){MGraph ga;int i,j;printf("***********图邻接矩阵存储和图的遍历***********\n");printf("\n1-输入图的基本信息:\n");createGraph(&ga);printf("\n2-无向图的邻接矩阵:\n");for (i=0;i<ga.vexnum;i++) {for (j=0;j<ga.vexnum;j++)printf("%3d",ga.arcs[i][j]);printf("\n");}printf("\n3-图的遍历:\n");init_visit(); /*初始化访问数组*/tdfs(&ga); /*深度优先搜索图*/init_visit();tbfs(&ga); /*广度优先搜索图*/return 0;}2、编写程序exp7_2.c,实现图的邻接表存储和拓扑排序算法。
以图7-2的有向图为例,补充完整程序,调试运行并写出运行结果。
运行结果:(包括输入数据)exp7_2.c程序代码参考如下:#include<stdio.h>#include<malloc.h>#define N 20/*图的邻接表:邻接链表结点*/typedef struct EdgeNode{int adjvex; /*顶点序号*/struct EdgeNode *next; /*下一个结点的指针*/} EdgeNode;/*图的邻接表:邻接表*/typedef struct VNode{char data; /*顶点信息*/int ind; /*顶点入度*/struct EdgeNode *link; /*指向邻接链表指针*/} VNode;typedef struct ALgraph{ /*图的邻接表*/int vexnum,arcnum; /*顶点数、弧数*/VNode adjlist[N];}ALGraph;void createGraph_list(ALGraph *g); /*建立有向图的邻接表*/ void topSort(ALGraph *g); /*拓扑排序*//*建立有向图的邻接表*/void createGraph_list(ALGraph *g){int i,j,e;char v;EdgeNode *s;i=0;e=0;printf("\n输入顶点序列(以#结束):\n");while((v=getchar())!='#') {g->adjlist[i].data=v; /*读入顶点信息*/g->adjlist[i].link=NULL;g->adjlist[i].ind=0;i++;}g->vexnum=i; /*建立邻接链表*/printf("\n请输入弧的信息(顶点序号,顶点序号),以(-1,-1)结束:\n");scanf("%d,%d",&i,&j);while(i!=-1) {s=(struct EdgeNode*)malloc(sizeof(EdgeNode));s->adjvex=j;s->next=g->adjlist[i].link; ; /*(1)s插入链表*/g->adjlist[i].link=s;g->adjlist[j].ind++; /*(2)顶点j的入度加1*/e++;scanf("%d,%d",&i,&j);}g->arcnum=e;}/*createGraph_list*/void topSort(ALGraph *g) { /*拓扑排序*/int i,j,k,top=0,m=0,s[N]; /*m为拓扑排序输出的结点数*/EdgeNode *p;for(i=0; i<g->vexnum; i++)if(!g->adjlist[i].ind){/*(3)入度为0的顶点入栈*/s[top++]=i;}printf("\n输出拓扑序列:");while(top>0) {j=s[--top];printf("%c",g->adjlist[j].data);m++;p=g->adjlist[j].link;while(p!=NULL) {k=p->adjvex;g->adjlist[k].ind--; /*顶点k入度减1*/if(g->adjlist[k].ind==0) /*顶点k入度为0,进栈*/s[top++]=k;p=p->next;}}printf("\n共输出%d个顶点\n",m);if(m<g->vexnum) /*(4)当输出顶点数小于图的顶点数,表示有环*/ printf("图中有环!");elseprintf("图中无环!");}/*topSort*/int main(){ALGraph g;int i;EdgeNode *s;printf("***********图的邻接表存储结构和拓扑排序***********\n");printf("\n1-输入图的基本信息:\n");createGraph_list(&g); /*创建图的邻接表存储结构*/printf("\n2-图的邻接表:");for(i=0; i<g.vexnum; i++) { /*输出图的邻接表存储结构*/printf("\n%c,%d:",g.adjlist[i].data,g.adjlist[i].ind);s=g.adjlist[i].link;while(s!=NULL) {printf("->%d",s->adjvex);s=s->next;}}printf("\n");printf("\n3-根据图的邻接表实现拓扑排序:\n");topSort(&g); /*进行拓扑排序*/return 0;}(3)调试下面给出的图的信息,写出运行结果,画出该有向图。