数据结构实践项目——图的基本运算及遍历操作

简介: 本文是针对[数据结构基础系列(7):图]中第1-9课时的实践项目。 0701 图结构导学 0702 图的定义 0703 图的基本术语 0704 图的邻接矩阵存储结构及算法 0705 图的邻接表存储结构及算法 0706 图的遍历 0707 非连通图的遍历 0708 DFS的应用 0709 BFS的应用【项目1 - 图基本算法库】定义图的邻接矩阵和邻

本文是针对[数据结构基础系列(7):图]中第1-9课时的实践项目。
0701 图结构导学
0702 图的定义
0703 图的基本术语
0704 图的邻接矩阵存储结构及算法
0705 图的邻接表存储结构及算法
0706 图的遍历
0707 非连通图的遍历
0708 DFS的应用
0709 BFS的应用

【项目1 - 图基本算法库】

定义图的邻接矩阵和邻接表存储结构,实现其基本运算,并完成测试。
要求:
1、头文件graph.h中定义相关的数据结构并声明用于完成基本运算的函数。对应基本运算的函数包括:

void ArrayToMat(int *Arr, int n, MGraph &g); //用普通数组构造图的邻接矩阵
void ArrayToList(int *Arr, int n, ALGraph *&); //用普通数组构造图的邻接表
void MatToList(MGraph g,ALGraph *&G);//将邻接矩阵g转换成邻接表G
void ListToMat(ALGraph *G,MGraph &g);//将邻接表G转换成邻接矩阵g
void DispMat(MGraph g);//输出邻接矩阵g
void DispAdj(ALGraph *G);//输出邻接表G

2、在graph.cpp中实现这些函数
3、用main.cpp中的main函数中完成测试。
[参考解答]

【项目2 - 操作用邻接表存储的图】

  假设图G采用邻接表存储,分别设计实现以下要求的算法:
  (1)输出出图G中每个顶点的出度;
  (2)求出图G中出度最大的一个顶点,输出该顶点编号;
  (3)计算图G中出度为0的顶点数;
  (4)判断图G中是否存在边 <i,j>
  利用下图作为测试用图,输出结果。

  这里写图片描述
  提示:(1)分别设计函数实现算法;(2)不要全部实现完再测试,而是实现一个,测试一个;(3)请利用图算法库;(4)若将本项目中图G的存储结构改为邻接矩阵,相关操作又如何实现?
参考解答

【项目3 - 图遍历算法实现】

  实现图遍历算法,分别输出如下图结构的深度优先(DFS)遍历序列和广度优先遍历(BFS)序列。
这里写图片描述
  请利用图算法库
  [参考解答]

【项目4 - 利用遍历思想求解图问题】

  假设图G采用邻接表存储,分别设计实现以下要求的算法,要求用区别于示例中的图进行多次测试,通过观察输出值,掌握相关问题的处理方法。
  (1)设计一个算法,判断顶点u到v是否有简单路径
  (2)设计一个算法输出图G中从顶点u到v的一条简单路径(设计测试图时,保证图G中从顶点u到v至少有一条简单路径)。
  (3)输出从顶点u到v的所有简单路径。
  (4)输出图G中从顶点u到v的长度为s的所有简单路径。
  (5)求图中通过某顶点k的所有简单回路(若存在)
  [1-5参考解答]
  (6)求不带权连通图G中从顶点u到顶点v的一条最短路径。
  (7)求不带权连通图G中,距离顶点v最远的顶点k
  [6-7参考解答]

【项目5 - 迷宫问题之图深度优先遍历解法】

  设计一个程序,采用深度优先遍历算法的思路,解决迷宫问题。
  (1)建立迷宫对应的图数据结构,并建立其邻接表表示。
  (2)采用深度优先遍历的思路设计算法,输出从入口(1,1)点到出口(M,N)的所有迷宫路径。
  [参考解答]

纸上谈兵:“知原理”检验题目

[参考解答]
1、设图的邻接矩阵为这里写图片描述,则该图为__
A. 有向图
B. 无向图
C. 强连通图
D. 完全图
2、已知一个图,如图1所示,则从顶点a出发按深度优先遍历则可以得到的一种顶点序列为__
A. a,b,e,c,d,f
B. a,c,f,e,b,d
C. a,e,b,c,f,d
D. a,e,d,f,c,b
这里写图片描述(图1)
3、画出图1的邻接矩阵和邻接表存储的示意图。

4、已知图的邻接矩阵如图2所示,则从顶点0出发,按深度优先遍历的顶点序列是_
这里写图片描述(图2)
A. 0 2 4 3 1 5 6
B. 0 1 3 5 6 4 2
C. 0 4 2 3 1 6 5
D. 0 1 3 4 2 5 6

5、已知图的邻接矩阵如图2,根据算法,则从顶点0出发,按广度优先遍历的结点序列是_
A 0 2 4 3 1 6 5
B. 0 1 3 5 6 4 2
C. 0 1 2 3 4 6 5
D. 0 1 2 3 4 5 6

6、已知图的邻接表如图3所示,根据算法,则从顶点0出发按深度优先遍历的结点序列是_
这里写图片描述(图3)
A. 0 1 3 2
B. 0 2 3 1
C. 0 3 2 1
D. 0 1 2 3

7、已知图的邻接表如图3所示,根据算法,则从顶点0出发按广度优先遍历的结点序列是_
A. 0 3 2 1
B. 0 1 2 3
C. 0 1 3 2
D. 0 3 1 2

目录
相关文章
|
1月前
|
存储 C语言 C++
【C++数据结构——栈与队列】顺序栈的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现顺序栈的基本运算。开始你的任务吧,祝你成功!​ 相关知识 初始化栈 销毁栈 判断栈是否为空 进栈 出栈 取栈顶元素 1.初始化栈 概念:初始化栈是为栈的使用做准备,包括分配内存空间(如果是动态分配)和设置栈的初始状态。栈有顺序栈和链式栈两种常见形式。对于顺序栈,通常需要定义一个数组来存储栈元素,并设置一个变量来记录栈顶位置;对于链式栈,需要定义节点结构,包含数据域和指针域,同时初始化栈顶指针。 示例(顺序栈): 以下是一个简单的顺序栈初始化示例,假设用C语言实现,栈中存储
142 77
|
1月前
|
存储 C++
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
【数据结构——树】哈夫曼树(头歌实践教学平台习题)【合集】目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:任务描述 本关任务:编写一个程序构建哈夫曼树和生成哈夫曼编码。 相关知识 为了完成本关任务,你需要掌握: 1.如何构建哈夫曼树, 2.如何生成哈夫曼编码。 测试说明 平台会对你编写的代码进行测试: 测试输入: 1192677541518462450242195190181174157138124123 (用户分别输入所列单词的频度) 预
59 14
【C++数据结构——树】哈夫曼树(头歌实践教学平台习题) 【合集】
|
1月前
|
存储 C++ 索引
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
【数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】初始化队列、销毁队列、判断队列是否为空、进队列、出队列等。本关任务:编写一个程序实现环形队列的基本运算。(6)出队列序列:yzopq2*(5)依次进队列元素:opq2*(6)出队列序列:bcdef。(2)依次进队列元素:abc。(5)依次进队列元素:def。(2)依次进队列元素:xyz。开始你的任务吧,祝你成功!(4)出队一个元素a。(4)出队一个元素x。
43 13
【C++数据结构——栈与队列】环形队列的基本运算(头歌实践教学平台习题)【合集】
|
1月前
|
算法 C++
【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
【数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】 目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果: 任务描述 本关任务:实现二叉排序树的基本算法。 相关知识 为了完成本关任务,你需要掌握:二叉树的创建、查找和删除算法。具体如下: (1)由关键字序列(4,9,0,1,8,6,3,5,2,7)创建一棵二叉排序树bt并以括号表示法输出。 (2)判断bt是否为一棵二叉排序树。 (3)采用递归方法查找关键字为6的结点,并输出其查找路径。 (4)分别删除bt中关键
53 11
【C++数据结构——查找】二叉排序树(头歌实践教学平台习题)【合集】
|
1月前
|
Java C++
【C++数据结构——树】二叉树的基本运算(头歌实践教学平台习题)【合集】
本关任务:编写一个程序实现二叉树的基本运算。​ 相关知识 创建二叉树 销毁二叉树 查找结点 求二叉树的高度 输出二叉树 //二叉树节点结构体定义 structTreeNode{ intval; TreeNode*left; TreeNode*right; TreeNode(intx):val(x),left(NULL),right(NULL){} }; 创建二叉树 //创建二叉树函数(简单示例,手动构建) TreeNode*create
48 12
|
1月前
|
C++
【C++数据结构——树】二叉树的性质(头歌实践教学平台习题)【合集】
本文档介绍了如何根据二叉树的括号表示串创建二叉树,并计算其结点个数、叶子结点个数、某结点的层次和二叉树的宽度。主要内容包括: 1. **定义二叉树节点结构体**:定义了包含节点值、左子节点指针和右子节点指针的结构体。 2. **实现构建二叉树的函数**:通过解析括号表示串,递归地构建二叉树的各个节点及其子树。 3. **使用示例**:展示了如何调用 `buildTree` 函数构建二叉树并进行简单验证。 4. **计算二叉树属性**: - 计算二叉树节点个数。 - 计算二叉树叶子节点个数。 - 计算某节点的层次。 - 计算二叉树的宽度。 最后,提供了测试说明及通关代
46 10
|
1月前
|
算法 C++
【C++数据结构——图】最小生成树(头歌实践教学平台习题) 【合集】
【数据结构——图】最小生成树(头歌实践教学平台习题)目录 任务描述 相关知识 测试说明 我的通关代码: 测试结果:【合集】任务描述 本关任务:编写一个程序求图的最小生成树。相关知识 为了完成本关任务,你需要掌握:1.建立邻接矩阵,2.Prim算法。建立邻接矩阵 上述带权无向图对应的二维数组,根据它建立邻接矩阵,如图1建立下列邻接矩阵。注意:INF表示无穷大,表示整数:32767 intA[MAXV][MAXV];Prim算法 普里姆(Prim)算法是一种构造性算法,从候选边中挑
43 10
|
1月前
|
存储 算法 C++
【C++数据结构——图】图的邻接矩阵和邻接表的存储(头歌实践教学平台习题)【合集】
本任务要求编写程序实现图的邻接矩阵和邻接表的存储。需掌握带权有向图、图的邻接矩阵及邻接表的概念。邻接矩阵用于表示顶点间的连接关系,邻接表则通过链表结构存储图信息。测试输入为图的顶点数、边数及邻接矩阵,预期输出为Prim算法求解结果。通关代码提供了完整的C++实现,包括输入、构建和打印邻接矩阵与邻接表的功能。
49 10
|
1月前
|
C++
【C++数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】
【数据结构——栈和队列】括号配对(头歌实践教学平台习题)【合集】(1)遇到左括号:进栈Push()(2)遇到右括号:若栈顶元素为左括号,则出栈Pop();否则返回false。(3)当遍历表达式结束,且栈为空时,则返回true,否则返回false。本关任务:编写一个程序利用栈判断左、右圆括号是否配对。为了完成本关任务,你需要掌握:栈对括号的处理。(1)遇到左括号:进栈Push()开始你的任务吧,祝你成功!测试输入:(()))
38 7
|
3月前
|
C语言
【数据结构】栈和队列(c语言实现)(附源码)
本文介绍了栈和队列两种数据结构。栈是一种只能在一端进行插入和删除操作的线性表,遵循“先进后出”原则;队列则在一端插入、另一端删除,遵循“先进先出”原则。文章详细讲解了栈和队列的结构定义、方法声明及实现,并提供了完整的代码示例。栈和队列在实际应用中非常广泛,如二叉树的层序遍历和快速排序的非递归实现等。
328 9

热门文章

最新文章