C语言实现采用邻接矩阵创建无向网
时间: 2023-08-11 07:06:42 浏览: 100
C++数据结构以邻接矩阵方式确定有向网.docx
实现邻接矩阵创建无向网需要以下步骤:
1. 定义一个结构体来表示一个无向网的顶点,包括顶点的标识和其它相关信息,如权值等;
2. 定义一个二维数组来存储无向网的邻接矩阵,数组的行数和列数都等于无向网的顶点数,数组元素的值代表相邻两个顶点之间的边的权值,如果两个顶点之间没有边,则该数组元素的值为0;
3. 定义一个函数来创建无向网,函数的参数包括无向网的顶点数和一个指向顶点结构体数组的指针,函数内部实现从用户输入顶点信息并构造邻接矩阵的过程;
4. 在创建无向网时,需要调用一个函数来获取两个顶点之间的权值,该函数的参数包括两个顶点的标识和一个指向邻接矩阵的指针,函数内部实现从邻接矩阵中获取对应的权值的过程。
下面是示例代码:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
#define INFINITY 65535
// 顶点结构体
typedef struct Vertex {
char id; // 顶点标识
// 其它相关信息,如权值等
} Vertex;
// 邻接矩阵无向网
typedef struct {
Vertex vexs[MAX_VERTEX_NUM]; // 顶点数组
int arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵
int vexnum; // 顶点数
int arcnum; // 边数
} MGraph;
// 获取两个顶点之间的权值
int get_weight(char src, char dest, MGraph *G) {
int i, j;
for (i = 0; i < G->vexnum; i++) {
if (G->vexs[i].id == src) {
break;
}
}
for (j = 0; j < G->vexnum; j++) {
if (G->vexs[j].id == dest) {
break;
}
}
return G->arcs[i][j];
}
// 创建无向网
void create_mgraph(MGraph *G) {
int i, j, k, w;
char ch1, ch2;
printf("请输入无向网的顶点数和边数:");
scanf("%d%d", &G->vexnum, &G->arcnum);
printf("请输入无向网的各个顶点:\n");
for (i = 0; i < G->vexnum; i++) {
getchar(); // 吃掉前一个 scanf 的换行符
printf("第%d个顶点:", i + 1);
scanf("%c", &G->vexs[i].id);
// 其它相关信息,如权值等
}
for (i = 0; i < G->vexnum; i++) {
for (j = 0; j < G->vexnum; j++) {
G->arcs[i][j] = INFINITY; // 初始化邻接矩阵
}
}
printf("请输入无向网的各条边及其对应的权值:\n");
for (k = 0; k < G->arcnum; k++) {
printf("第%d条边:", k + 1);
scanf(" %c%c%d", &ch1, &ch2, &w);
i = j = -1;
for (int m = 0; m < G->vexnum; m++) {
if (G->vexs[m].id == ch1) {
i = m;
}
if (G->vexs[m].id == ch2) {
j = m;
}
}
if (i == -1 || j == -1) {
printf("顶点不存在,重新输入!\n");
k--;
continue;
}
G->arcs[i][j] = w;
G->arcs[j][i] = w; // 无向网,所以需要对称赋值
}
}
int main() {
MGraph G;
create_mgraph(&G);
printf("邻接矩阵为:\n");
for (int i = 0; i < G.vexnum; i++) {
for (int j = 0; j < G.vexnum; j++) {
printf("%5d", G.arcs[i][j]);
}
printf("\n");
}
return 0;
}
```
注意:该示例代码中为了方便输入,使用了 getchar() 函数吃掉前一个 scanf 的换行符。
阅读全文