C语言编写代码,构建图的邻接矩阵、邻接表存储结构,实现图的深度优先搜索遍历、广度优先搜索遍历。
时间: 2024-02-15 10:03:33 浏览: 75
好的,以下是C语言实现图的邻接矩阵、邻接表存储结构,以及深度优先搜索遍历和广度优先搜索遍历的代码示例:
1. 图的邻接矩阵存储结构
```c
#define MAXVEX 100 // 图的最大节点数
#define INFINITY 65535 // 用65535表示无穷大
typedef struct {
int vexs[MAXVEX]; // 存储节点的数组
int arcs[MAXVEX][MAXVEX]; // 邻接矩阵
int numVertexes, numEdges; // 节点数、边数
} MGraph;
```
2. 图的邻接表存储结构
```c
#define MAXVEX 100 // 图的最大节点数
#define INFINITY 65535 // 用65535表示无穷大
typedef struct EdgeNode {
int adjvex; // 邻接点的下标
int weight; // 边的权重
struct EdgeNode *next; // 指向下一个邻接点
} EdgeNode;
typedef struct VertexNode {
int data; // 节点数据
EdgeNode *firstedge; // 指向第一个邻接点
} VertexNode;
typedef struct {
VertexNode adjList[MAXVEX]; // 存储节点的数组
int numVertexes, numEdges; // 节点数、边数
} GraphAdjList;
```
3. 图的深度优先搜索遍历
```c
void DFS(MGraph G, int i, int visited[]) {
visited[i] = 1; // 标记当前节点已访问
printf("%d ", G.vexs[i]); // 输出当前节点
for (int j = 0; j < G.numVertexes; j++) {
if (G.arcs[i][j] == 1 && visited[j] == 0) {
DFS(G, j, visited); // 递归访问邻居节点
}
}
}
void DFSTraverse(MGraph G) {
int visited[MAXVEX]; // 记录节点是否被访问过
for (int i = 0; i < G.numVertexes; i++) {
visited[i] = 0; // 初始化为未访问
}
for (int i = 0; i < G.numVertexes; i++) {
if (visited[i] == 0) {
DFS(G, i, visited); // 从未访问的节点开始遍历
}
}
}
```
4. 图的广度优先搜索遍历
```c
void BFSTraverse(GraphAdjList G) {
int visited[MAXVEX]; // 记录节点是否被访问过
for (int i = 0; i < G.numVertexes; i++) {
visited[i] = 0; // 初始化为未访问
}
queue<int> q; // 创建队列
for (int i = 0; i < G.numVertexes; i++) {
if (visited[i] == 0) {
visited[i] = 1; // 标记当前节点已访问
printf("%d ", G.adjList[i].data); // 输出当前节点
q.push(i); // 将当前节点入队
while (!q.empty()) {
int j = q.front(); // 取出队首节点
q.pop();
EdgeNode *p = G.adjList[j].firstedge;
while (p != NULL) {
int k = p->adjvex;
if (visited[k] == 0) {
visited[k] = 1; // 标记邻居节点已访问
printf("%d ", G.adjList[k].data); // 输出邻居节点
q.push(k); // 将邻居节点入队
}
p = p->next;
}
}
}
}
}
```
以上代码示例仅供参考,具体实现还需要根据具体问题进行调整。希望能够帮助你解决问题。
阅读全文