C语言,使用图的邻接矩阵的存储结构实现有向图、无向图和网的建立算法,并实现深度优先遍历及广度优先遍历
时间: 2024-02-17 19:02:21 浏览: 109
好的,我可以为您介绍一下 C 语言中使用邻接矩阵存储结构来实现有向图、无向图和网的建立算法,以及深度优先遍历和广度优先遍历的实现方法。
1. 邻接矩阵存储结构
邻接矩阵是一种用于表示图的数据结构,通过一个二维数组来表示图中的各个顶点之间的关系。如果图是有向图或无向图,则邻接矩阵是一个对称矩阵;如果图是网,则邻接矩阵中的元素表示相邻两个顶点之间的权值。
在 C 语言中,我们可以使用二维数组来表示邻接矩阵,其中每个元素表示两个顶点之间的关系或权值。例如,以下是一个有向图的邻接矩阵表示:
```c
#define MAX_VERTEX_NUM 100 // 最大顶点数
typedef int VertexType; // 顶点类型
typedef struct {
VertexType vexs[MAX_VERTEX_NUM]; // 存储顶点信息
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 存储边的信息
int vexnum, arcnum; // 顶点数和边数
} Graph;
```
2. 建立有向图、无向图和网的算法
建立图的算法主要包括两个步骤:输入顶点信息和边信息,构造邻接矩阵。其中,输入顶点信息可以通过键盘输入或从文件中读取,边信息包括边的起点、终点和权值(如果是网),也可以通过键盘输入或从文件中读取。
以下是一个建立有向图的算法实现:
```c
void CreateDG(Graph *G)
{
int i, j, k;
VertexType v1, v2;
printf("请输入顶点数和边数:");
scanf("%d%d", &G->vexnum, &G->arcnum);
printf("请输入顶点信息:");
for (i = 0; i < G->vexnum; i++) {
scanf("%d", &G->vexs[i]);
}
for (i = 0; i < G->vexnum; i++) {
for (j = 0; j < G->vexnum; j++) {
G->arcs[i][j] = 0;
}
}
printf("请输入每条边的起点和终点:");
for (k = 0; k < G->arcnum; k++) {
scanf("%d%d", &v1, &v2);
i = LocateVex(G, v1);
j = LocateVex(G, v2);
G->arcs[i][j] = 1;
}
}
```
其中,LocateVex() 函数是用来查找顶点在顶点数组中的位置。
类似地,我们可以编写建立无向图和网的算法,只需要将邻接矩阵中的元素类型改为权值即可。
3. 深度优先遍历和广度优先遍历的实现方法
深度优先遍历和广度优先遍历是图的两种重要遍历方式,它们都可以通过邻接矩阵实现。深度优先遍历使用栈来保存遍历路径,广度优先遍历使用队列来保存遍历路径。
以下是一个深度优先遍历的实现方法:
```c
void DFS(Graph G, int v, int visited[])
{
int i;
visited[v] = 1;
printf("%d ", G.vexs[v]);
for (i = 0; i < G.vexnum; i++) {
if (G.arcs[v][i] && !visited[i]) {
DFS(G, i, visited);
}
}
}
void DFSTraverse(Graph G)
{
int i;
int visited[MAX_VERTEX_NUM];
for (i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
for (i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
DFS(G, i, visited);
}
}
}
```
其中,visited[] 数组用来标记每个顶点是否被遍历过。
以下是一个广度优先遍历的实现方法:
```c
void BFSTraverse(Graph G)
{
int i, j, k;
int visited[MAX_VERTEX_NUM];
Queue Q;
for (i = 0; i < G.vexnum; i++) {
visited[i] = 0;
}
InitQueue(&Q);
for (i = 0; i < G.vexnum; i++) {
if (!visited[i]) {
visited[i] = 1;
printf("%d ", G.vexs[i]);
EnQueue(&Q, i);
while (!QueueEmpty(&Q)) {
DeQueue(&Q, &j);
for (k = 0; k < G.vexnum; k++) {
if (G.arcs[j][k] && !visited[k]) {
visited[k] = 1;
printf("%d ", G.vexs[k]);
EnQueue(&Q, k);
}
}
}
}
}
}
```
其中,Queue 是一个队列数据结构,EnQueue() 和 DeQueue() 函数用来实现队列的入队和出队操作。
以上就是 C 语言中使用邻接矩阵存储结构来实现有向图、无向图和网的建立算法,以及深度优先遍历和广度优先遍历的实现方法。
阅读全文