ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-01-22 03:31:07  阅读:177  来源: 互联网

标签:优先 遍历 AdjList int vex adjvex 无向 邻接 顶点


全局变量

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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有