其他分享
首页 > 其他分享> > 深度优先搜索遍历(无向图)

深度优先搜索遍历(无向图)

作者:互联网

全局变量

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