C语言实现1.图的邻接矩阵存储表示; 2.采用邻接矩阵创建无向网;
时间: 2023-11-28 07:51:02 浏览: 53
1.图的邻接矩阵存储表示
邻接矩阵是一种表示图的方式,它是一个二维数组,用于表示顶点之间的关系。如果两个顶点之间有边相连,则在对应矩阵位置上标记为1,否则为0。
下面是C语言实现图的邻接矩阵存储表示的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 100 // 最大顶点数
typedef struct {
int vexs[MAXVEX]; // 存储顶点的数组
int edges[MAXVEX][MAXVEX]; // 存储邻接矩阵的二维数组
int num_vexs, num_edges; // 存储顶点数和边数
} MGraph;
// 初始化图
void InitGraph(MGraph *G) {
int i, j;
G->num_vexs = 0;
G->num_edges = 0;
for (i = 0; i < MAXVEX; i++) {
G->vexs[i] = 0;
for (j = 0; j < MAXVEX; j++) {
G->edges[i][j] = 0;
}
}
}
// 添加顶点
int AddVex(MGraph *G, int v) {
if (G->num_vexs >= MAXVEX) {
return -1; // 达到最大顶点数
}
G->vexs[G->num_vexs] = v;
G->num_vexs++;
return 0;
}
// 添加边
int AddEdge(MGraph *G, int v1, int v2, int w) {
int i, j;
for (i = 0; i < G->num_vexs; i++) {
if (G->vexs[i] == v1) {
break;
}
}
for (j = 0; j < G->num_vexs; j++) {
if (G->vexs[j] == v2) {
break;
}
}
if (i == G->num_vexs || j == G->num_vexs) {
return -1; // 未找到对应顶点
}
G->edges[i][j] = w;
G->edges[j][i] = w; // 无向图,对称矩阵
G->num_edges++;
return 0;
}
// 打印邻接矩阵
void PrintGraph(MGraph *G) {
int i, j;
printf(" ");
for (i = 0; i < G->num_vexs; i++) {
printf("%2d ", G->vexs[i]);
}
printf("\n");
for (i = 0; i < G->num_vexs; i++) {
printf("%2d: ", G->vexs[i]);
for (j = 0; j < G->num_vexs; j++) {
printf("%2d ", G->edges[i][j]);
}
printf("\n");
}
}
int main() {
MGraph G;
InitGraph(&G);
AddVex(&G, 1);
AddVex(&G, 2);
AddVex(&G, 3);
AddVex(&G, 4);
AddEdge(&G, 1, 2, 1);
AddEdge(&G, 1, 3, 2);
AddEdge(&G, 2, 4, 3);
PrintGraph(&G);
return 0;
}
```
2.采用邻接矩阵创建无向网
无向网是有边权的无向图,可以用邻接矩阵表示。邻接矩阵的每个元素存储的是边的权值。
下面是C语言实现采用邻接矩阵创建无向网的代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAXVEX 100 // 最大顶点数
#define INFINITY 65535 // 定义无穷大
typedef struct {
int vexs[MAXVEX]; // 存储顶点的数组
int edges[MAXVEX][MAXVEX]; // 存储邻接矩阵的二维数组
int num_vexs, num_edges; // 存储顶点数和边数
} MGraph;
// 初始化图
void InitGraph(MGraph *G) {
int i, j;
G->num_vexs = 0;
G->num_edges = 0;
for (i = 0; i < MAXVEX; i++) {
G->vexs[i] = 0;
for (j = 0; j < MAXVEX; j++) {
G->edges[i][j] = INFINITY;
}
}
}
// 添加顶点
int AddVex(MGraph *G, int v) {
if (G->num_vexs >= MAXVEX) {
return -1; // 达到最大顶点数
}
G->vexs[G->num_vexs] = v;
G->num_vexs++;
return 0;
}
// 添加边
int AddEdge(MGraph *G, int v1, int v2, int w) {
int i, j;
for (i = 0; i < G->num_vexs; i++) {
if (G->vexs[i] == v1) {
break;
}
}
for (j = 0; j < G->num_vexs; j++) {
if (G->vexs[j] == v2) {
break;
}
}
if (i == G->num_vexs || j == G->num_vexs) {
return -1; // 未找到对应顶点
}
G->edges[i][j] = w;
G->edges[j][i] = w; // 无向图,对称矩阵
G->num_edges++;
return 0;
}
// 打印邻接矩阵
void PrintGraph(MGraph *G) {
int i, j;
printf(" ");
for (i = 0; i < G->num_vexs; i++) {
printf("%2d ", G->vexs[i]);
}
printf("\n");
for (i = 0; i < G->num_vexs; i++) {
printf("%2d: ", G->vexs[i]);
for (j = 0; j < G->num_vexs; j++) {
if (G->edges[i][j] == INFINITY) {
printf(" ∞ ");
} else {
printf("%2d ", G->edges[i][j]);
}
}
printf("\n");
}
}
int main() {
MGraph G;
InitGraph(&G);
AddVex(&G, 1);
AddVex(&G, 2);
AddVex(&G, 3);
AddVex(&G, 4);
AddEdge(&G, 1, 2, 1);
AddEdge(&G, 1, 3, 2);
AddEdge(&G, 2, 4, 3);
PrintGraph(&G);
return 0;
}
```