深度优先搜索遍历(无向图)
作者:互联网
全局变量
int visited[MAXVEX] = { 0 };/*访问标志数组*/
DFSTraverse函数
void DFSTraverse(AdjList* G) { int i = 1; for (i = 1; i <= G->vexnum; i++) { if (visited[i] == 0) { DFS(G, i); } } }
DFS函数
1 void DFS(AdjList* G, int vex) 2 { 3 int adjvex = 0; 4 ArcNode* P = NULL; 5 printf("%c", G->vex[vex].vexdata); 6 /*顶点标记为已遍历*/ 7 visited[vex] = 1; 8 adjvex = FristVex(G, vex); 9 while (adjvex) 10 { 11 if (visited[adjvex] == 0) 12 { 13 DFS(G, adjvex); 14 } 15 adjvex = NextVex(G, vex, adjvex); 16 } 17 }
FristVex函数
1 int FristVex(AdjList* G, int vex) 2 { 3 if (G->vex[vex].head) 4 { 5 return G->vex[vex].head->adjvex; 6 } 7 return 0; 8 }
NextVex函数
1 int NextVex(AdjList* G, int vex, int adjvex) 2 { 3 ArcNode* P = G->vex[vex].head; 4 /*定位到adjvex位置*/ 5 while (P->adjvex != adjvex) 6 { 7 P = P->next; 8 } 9 /*若下一邻接顶点存在则返回下一邻接顶点*/ 10 P = P->next; 11 if (P) 12 { 13 return P->adjvex; 14 } 15 return 0; 16 }
源代码
1 /***************************************************************** 2 * Name: 深度优先搜索遍历(无向图) 3 * Date: 2022.01.22 4 * Author: 吕辉 5 * Description: 深度优先遍历(Depth Frist Search)是树的先根遍历的推广, 6 * 代码采用邻接表来存储无向图;通过一个全局变量visited数组 7 * 来标记顶点是否已被遍历。 8 *****************************************************************/ 9 #define _CRT_SECURE_NO_WARNINGS 10 #include <stdio.h> 11 #include <stdlib.h> 12 13 #define MAXVEX 20 14 typedef struct ArcNode 15 { 16 int adjvex;/*邻接顶点*/ 17 struct ArcNode* next; 18 }ArcNode;/*边表*/ 19 20 typedef struct VexNode 21 { 22 char vexdata; 23 ArcNode* head; 24 }VexNode;/*顶点表*/ 25 26 typedef struct 27 { 28 int vexnum;/*顶点数*/ 29 int arcnum;/*边数*/ 30 VexNode vex[MAXVEX]; 31 }AdjList;/*邻接表*/ 32 33 int visited[MAXVEX] = { 0 };/*访问标志数组*/ 34 35 void Create(AdjList* G); 36 int LocateVex(AdjList* G, char vex); 37 void DFS(AdjList* G,int vex); 38 int FristVex(AdjList* G, int vex); 39 int NextVex(AdjList* G, int vex, int adjvex); 40 void DFSTraverse(AdjList* G); 41 42 int main(void) 43 { 44 AdjList G; 45 Create(&G); 46 DFSTraverse(&G); 47 system("pause"); 48 return 0; 49 } 50 /********************************************************* 51 * Name: Create 52 * Call: LocateVex 53 * Called By: main 54 * Parameter: G 邻接表 55 * Description: 创建无向图的邻接表 56 **********************************************************/ 57 void Create(AdjList* G) 58 { 59 int i = 1; 60 int j = 1; 61 int k = 1; 62 char vex1 = '\0'; 63 char vex2 = '\0'; 64 ArcNode* P = NULL; 65 ArcNode* Pre = NULL; 66 67 printf("请输入顶点数和边数(逗号分隔):"); 68 scanf("%d%*c%d", &G->vexnum, &G->arcnum); 69 for (i = 1; i <= G->vexnum; i++) 70 { 71 printf("请输入第%d个顶点:", i); 72 /*%c前有一空格用于吸收空白字符*/ 73 scanf(" %c", &G->vex[i].vexdata); 74 G->vex[i].head = NULL; 75 } 76 for (k = 1; k <= G->arcnum; k++) 77 { 78 printf("请输入第%d条边的两顶点(逗号分隔):", k); 79 scanf(" %c%*c%c", &vex1, &vex2); 80 i = LocateVex(G, vex1); 81 j = LocateVex(G, vex2); 82 /*把边表链接到1其中一端顶点表中*/ 83 P = (ArcNode*)calloc(1, sizeof(ArcNode)); 84 P->adjvex = j; 85 if (G->vex[i].head == NULL) 86 { 87 G->vex[i].head = P; 88 } 89 else 90 { 91 Pre = G->vex[i].head; 92 while (Pre->next) 93 { 94 Pre = Pre->next; 95 } 96 Pre->next = P; 97 } 98 /*把边表链接到另一端顶点表中*/ 99 P = (ArcNode*)calloc(1, sizeof(ArcNode)); 100 P->adjvex = i; 101 if (G->vex[j].head == NULL) 102 { 103 G->vex[j].head = P; 104 } 105 else 106 { 107 Pre = G->vex[j].head; 108 while (Pre->next) 109 { 110 Pre = Pre->next; 111 } 112 Pre->next = P; 113 } 114 }/*for循环*/ 115 } 116 /****************************************** 117 * Name: LocateVex 118 * Called By: Create 119 * Parameter: G 邻接表 120 * vex 顶点 121 * return: 若顶点表中存在该顶点则返回其在顶点 122 * 表中的位置下标;否则返回0 123 * Description: 查找并返回顶点在顶点表中的下标 124 *******************************************/ 125 int LocateVex(AdjList* G, char vex) 126 { 127 int i = 1; 128 for (i = 1; i <= G->vexnum; i++) 129 { 130 if (G->vex[i].vexdata == vex) 131 { 132 return i; 133 } 134 } 135 return 0; 136 } 137 /*************************************************** 138 * Name: DFS 139 * Call: FristVex NextVex 140 * Called By: DFSTraverse 141 * Parameter: G 邻接表 142 * vex 顶点 143 * Description: 打印从vex顶点下标开始的连通子图 144 ****************************************************/ 145 void DFS(AdjList* G, int vex) 146 { 147 int adjvex = 0; 148 ArcNode* P = NULL; 149 printf("%c", G->vex[vex].vexdata); 150 /*顶点标记为已遍历*/ 151 visited[vex] = 1; 152 adjvex = FristVex(G, vex); 153 while (adjvex) 154 { 155 if (visited[adjvex] == 0) 156 { 157 DFS(G, adjvex); 158 } 159 adjvex = NextVex(G, vex, adjvex); 160 } 161 } 162 /************************************************* 163 * Name: FristVex 164 * Called By: DFS 165 * Parameter: G 邻接表 166 * vex 顶点 167 * return: 若vex顶点的首个邻接顶点存在,则返 168 * 回这个邻接顶点在顶点表中的下标;否 169 * 则返回0 170 **************************************************/ 171 int FristVex(AdjList* G, int vex) 172 { 173 if (G->vex[vex].head) 174 { 175 return G->vex[vex].head->adjvex; 176 } 177 return 0; 178 } 179 /********************************************* 180 * Name: NextVex 181 * Called By: DFS 182 * Parameter: G 邻接表 183 * vex 顶点 184 * adjvex 邻接顶点 185 * return: 查找与顶点vex邻接的adjvex顶点的下一个 186 * 与顶点vex邻接的顶点,返回其在顶点表中 187 * 的位置下标,若下一邻接顶点不存在,则返 188 * 回0 189 **********************************************/ 190 int NextVex(AdjList* G, int vex, int adjvex) 191 { 192 ArcNode* P = G->vex[vex].head; 193 /*定位到adjvex位置*/ 194 while (P->adjvex != adjvex) 195 { 196 P = P->next; 197 } 198 /*若下一邻接顶点存在则返回下一邻接顶点*/ 199 P = P->next; 200 if (P) 201 { 202 return P->adjvex; 203 } 204 return 0; 205 } 206 /**************************************** 207 * Name: DFSTraverse 208 * Call: DFS 209 * Called By: main 210 * Parameter: G 邻接表 211 * Description: 遍历图G的所有连通子图 212 *****************************************/ 213 void DFSTraverse(AdjList* G) 214 { 215 int i = 1; 216 for (i = 1; i <= G->vexnum; i++) 217 { 218 if (visited[i] == 0) 219 { 220 DFS(G, i); 221 } 222 } 223 }View Code
标签:优先,遍历,AdjList,int,vex,adjvex,无向,邻接,顶点 来源: https://www.cnblogs.com/lvhui123/p/15832304.html