数据结构实验十三 图的遍历

简介: 数据结构实验十三 图的遍历

一、实验目的

熟悉图的存储结构,掌握用单链表存储数据元素信息和数据元素之间的关系的信息的方法,并能运用图的深度优先搜索遍历一个图,对其输出。

二、实验原理

深度优先搜索遍历是树的先根遍历的推广。假设初始状态时图中所有顶点未曾访问,则深度优先搜索可从图中某个顶点v出发,访问此顶点,然后依次从v的未被访问的邻接点出发深度优先遍历图,直至图中所有与v有路径相通的顶点都被访问到;若此时图中尚有顶点未被访问,则另选图中一个未曾访问的顶点作起始点,重复上述过程,直至图中所有顶点都被访问到为止。

1. //算法6.3 深度优先搜索遍历连通图的递归算法
2. 
3. #include <iostream>
4. using namespace std;
5. 
6. #define MVNum 100                  //最大顶点数
7. typedef char VerTexType;             //假设顶点的数据类型为字符型 
8. typedef int ArcType;                         //假设边的权值类型为整型 
9. 
10. typedef struct{ 
11.   VerTexType vexs[MVNum];                 //顶点表 
12.   ArcType arcs[MVNum][MVNum];             //邻接矩阵 
13.   int vexnum,arcnum;                  //图的当前点数和边数 
14. }Graph;
15. 
16. bool visited[MVNum];                    //访问标志数组,其初值为"false"
17. int FirstAdjVex(Graph G , int v);       //返回v的第一个邻接点
18. int NextAdjVex(Graph G , int v , int w);    //返回v相对于w的下一个邻接点
19. 
20. int LocateVex(Graph G , VerTexType v){
21.   //确定点v在G中的位置
22.   for(int i = 0; i < G.vexnum; ++i)
23.     if(G.vexs[i] == v)
24.       return i;
25.     return -1;
26. }//LocateVex
27. 
28. void CreateUDN(Graph &G){ 
29. //采用邻接矩阵表示法,创建无向网G 
30.   int i , j , k;
31.   cout <<"请输入总顶点数,总边数 , 以空格隔开:";
32.     cin >> G.vexnum >> G.arcnum;             //输入总顶点数,总边数
33.   cout << endl;
34. 
35.   cout << "输入点的名称,如 a:" << endl;
36. 
37. for(i = 0; i < G.vexnum; ++i){   
38.     cout << "请输入第" << (i+1) << "个点的名称:";
39.     cin >> G.vexs[i];                            //依次输入点的信息 
40.   }
41.   cout << endl;
42. 
43. for(i = 0; i < G.vexnum; ++i)                    //初始化邻接矩阵,边的权值均置为极大值MaxInt 
44.     for(j = 0; j < G.vexnum; ++j)   
45.       G.arcs[i][j] = 0;  
46.   cout << "输入边依附的顶点,如:a b" << endl;
47.   for(k = 0; k < G.arcnum;++k){            //构造邻接矩阵 
48.     VerTexType v1 , v2;
49.     cout << "请输入第" << (k + 1) << "条边依附的顶点:";
50.     cin >> v1 >> v2;                 //输入一条边依附的顶点及权值
51.     i = LocateVex(G, v1);  j = LocateVex(G, v2);   //确定v1和v2在G中的位置,即顶点数组的下标 
52.     G.arcs[j][i] = G.arcs[i][j] = 1;                 //置<v1, v2>的对称边<v2, v1>的权值为w 
53.   }//for
54. }//CreateUDN 
55. 
56. void DFS(Graph G, int v){             //从第v个顶点出发递归地深度优先遍历图G 
57.   cout << G.vexs[v] << "    ";  visited[v] = true;    //访问第v个顶点,并置访问标志数组相应分量值为true
58.   int w;
59.   for(w = FirstAdjVex(G, v);  w >= 0;  w = NextAdjVex(G, v, w))        
60.     //依次检查v的所有邻接点w ,FirstAdjVex(G, v)表示v的第一个邻接点 
61.     //NextAdjVex(G, v, w)表示v相对于w的下一个邻接点,w≥0表示存在邻接点 
62.   if(!visited[w]) DFS(G, w);    //补充代码
63.         //对v的尚未访问的邻接顶点w递归调用DFS 
64. }//DFS
65. 
66. int FirstAdjVex(Graph G , int v){
67.   int i;
68.   for(i = 0 ; i < G.vexnum ; ++i){
69.     if(G.arcs[v][i] == 1 && visited[i] == false)
70.       return i;
71.   }
72.   return -1;
73. }//FirstAdjVex
74. 
75. int NextAdjVex(Graph G , int v , int w){
76.   int i;
77.   for(i = w ; i < G.vexnum ; ++i){
78.     if(G.arcs[v][i] == 1 && visited[i] == false)
79.       return i;
80.   }
81.   return -1;
82. }//NextAdjVex
83. 
84. int main(){
85.   cout << "************算法6.3 深度优先搜索遍历连通图的递归算法**************" << endl << endl;
86.   Graph G;
87.   CreateUDN(G);
88.   cout << endl;
89.   cout << "无向连通图G创建完成!" << endl << endl;
90. 
91.   cout << "请输入遍历连通图的起始点:";
92.   VerTexType c;
93.   cin >> c;
94. 
95.   int i;
96.   for(i = 0 ; i < G.vexnum ; ++i){
97.     if(c == G.vexs[i])
98.       break;
99.   }
100.  cout << endl;
101.  while(i >= G.vexnum){
102.    cout << "该点不存在,请重新输入!" << endl;
103.    cout << "请输入遍历连通图的起始点:";
104.    cin >> c;
105.    for(i = 0 ; i < G.vexnum ; ++i){
106.      if(c == G.vexs[i])
107.        break;
108.    }
109.  }
110.  cout << "深度优先搜索遍历连通图结果:" << endl;
111.  DFS(G , i);
112. 
113.  cout <<endl;
114.  return 0;
115. }//main
目录
相关文章
|
29天前
|
存储 算法 编译器
数据结构实验之矩阵的运算器(二维数组)
本实验旨在通过团队合作,掌握数组和矩阵相关运算的代码实现,包括矩阵的加减、数乘、转置、乘法、n次方及行列式的计算。实验过程中,成员们需分工协作,解决编程难题,最终实现一个功能完备的矩阵计算器。通过本实验,不仅锻炼了编程能力,还加深了对数学概念的理解,同时培养了团队合作精神。
56 4
|
29天前
数据结构实验之串模式匹配问题
本实验旨在掌握串模式匹配技术,通过创建文本文件、实现单词计数与定位功能,最终构建一个包含文件建立、单词统计与定位、程序退出等选项的主菜单,以增强对字符串处理的理解与应用能力。
44 4
|
29天前
|
算法
数据结构实验之最长公共子序列
本实验旨在通过编程实践帮助学生理解串的基本概念及求解最长公共子序列的算法。实验内容包括使用动态规划方法设计并实现算法,以找出给定两序列的最大公共子序列。示例代码展示了如何通过构建状态矩阵和回溯路径来找到解决方案。实验总结指出,`memset()`函数用于内存初始化,且对于特定输入,程序能正确输出最长公共子序列之一。
51 4
|
29天前
|
算法
数据结构实验之操作系统打印机管理器问题
本实验旨在通过实现操作系统中的打印机管理器问题,掌握队列的基本操作如入队、出队等,利用队列的先进先出特性解决先申请先打印的问题。实验包括队列的初始化、入队、出队、打印队列内容等功能,并通过菜单式界面进行交互。实验结果显示基本功能可正常执行,但在连续操作时存在执行失败的情况,需进一步优化。
40 4
|
29天前
|
存储 算法 Perl
数据结构实验之链表
本实验旨在掌握线性表中元素的前驱、后续概念及链表的建立、插入、删除等算法,并分析时间复杂度,理解链表特点。实验内容包括循环链表应用(约瑟夫回环问题)、删除单链表中重复节点及双向循环链表的设计与实现。通过编程实践,加深对链表数据结构的理解和应用能力。
53 4
|
29天前
|
机器学习/深度学习 存储 算法
数据结构实验之二叉树实验基础
本实验旨在掌握二叉树的基本特性和遍历算法,包括先序、中序、后序的递归与非递归遍历方法。通过编程实践,加深对二叉树结构的理解,学习如何计算二叉树的深度、叶子节点数等属性。实验内容涉及创建二叉树、实现各种遍历算法及求解特定节点数量。
80 4
|
29天前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
51 4
|
6月前
|
存储 算法 数据安全/隐私保护
【Python学习篇】Python实验小练习——高级数据结构(五)
【Python学习篇】Python实验小练习——高级数据结构(五)
70 1
|
2月前
|
存储 编译器 C++
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
【初阶数据结构】掌握二叉树遍历技巧与信息求解:深入解析四种遍历方法及树的结构与统计分析
|
6月前
|
存储 算法 数据挖掘
数据结构实验||约瑟夫环
数据结构实验||约瑟夫环