用c语言写出图的表示和深度优先搜索
时间: 2023-09-28 10:03:50 浏览: 185
图的表示:
在C语言中,可以使用邻接矩阵或邻接表来表示图。
邻接矩阵表示法:
```c
#define MAXVEX 100 // 最大顶点数
typedef int EdgeType; // 边的权值类型
typedef struct {
int vexs[MAXVEX]; // 存放顶点信息
EdgeType arc[MAXVEX][MAXVEX]; // 存放边的权值
int numVertexes, numEdges; // 图的顶点数和边数
} MGraph;
```
邻接表表示法:
```c
#define MAXVEX 100 // 最大顶点数
typedef int EdgeType; // 边的权值类型
typedef struct EdgeNode { // 边表结点
int adjvex; // 邻接点域,存储该顶点对应的下标
EdgeType weight; // 边的权值
struct EdgeNode *next; // 链域,指向下一个邻接点
} EdgeNode;
typedef struct VertexNode { // 顶点表结点
int data; // 顶点域,存储顶点信息
EdgeNode *first; // 边表头指针
} VertexNode, AdjList[MAXVEX];
typedef struct {
AdjList adjList; // 邻接表
int numVertexes, numEdges; // 图的顶点数和边数
} GraphAdjList;
```
深度优先搜索:
深度优先搜索(DFS)是一种用于遍历或搜索树或图的算法。从一个根节点开始,它首先遍历根节点的所有子节点,然后遍历每个子节点的所有子节点,依此类推,直到遍历完整棵树或图。
深度优先搜索可以用递归或栈来实现。
以邻接表为例,递归实现深度优先搜索:
```c
#define MAXVEX 100 // 最大顶点数
typedef int EdgeType; // 边的权值类型
typedef struct EdgeNode { // 边表结点
int adjvex; // 邻接点域,存储该顶点对应的下标
EdgeType weight; // 边的权值
struct EdgeNode *next; // 链域,指向下一个邻接点
} EdgeNode;
typedef struct VertexNode { // 顶点表结点
int data; // 顶点域,存储顶点信息
EdgeNode *first; // 边表头指针
} VertexNode, AdjList[MAXVEX];
typedef struct {
AdjList adjList; // 邻接表
int numVertexes, numEdges; // 图的顶点数和边数
} GraphAdjList;
int visited[MAXVEX]; // 访问标记数组
void DFS(GraphAdjList G, int i) {
visited[i] = 1; // 标记该顶点已访问
printf("%d ", G.adjList[i].data); // 打印顶点值
EdgeNode *p = G.adjList[i].first; // 指向第一个邻接点
while (p != NULL) {
if (!visited[p->adjvex]) { // 如果邻接点未被访问,则递归访问它
DFS(G, p->adjvex);
}
p = p->next; // 访问下一个邻接点
}
}
void DFSTraverse(GraphAdjList G) {
int i;
for (i = 0; i < G.numVertexes; i++) {
visited[i] = 0; // 初始化标记数组
}
for (i = 0; i < G.numVertexes; i++) {
if (!visited[i]) { // 如果该顶点未被访问,则对它进行深度优先搜索
DFS(G, i);
}
}
}
```
阅读全文