每一个点开我的文章的小伙伴大家好!
在发这篇文章的时候,我是一名大一的学生,我将在博客记载我的学习之路!
这是我的第三篇博客文章,是关于C语言数据结构的无向网(带权无向图)的操作。
这篇文章先介绍怎么建立邻接矩阵和邻接表,在后续我会继续介绍无向网的DFS和BFS算法以及Prime算法(因为我觉得图这一章的难度较大)
接下来我会把各个操作给分解 文章末尾附上源码(Visual Studio2022完美运行)!
首先我先画出这么一个简单的图(大家也可以画的复杂一点)
下面我们进入正题:
首先是以邻接矩阵的方式的建立无向图:
这是结构体和要用到的元素的定义:
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define VexType char //顶点向量类型为char
#define ArcInfoType int //邻接矩阵内元素的类型为int
#define ElemType int
#define INFINITY 32766 /* 最大值∞ */
/* 根据图的权值类型,分别定义为最大整数或实数 */
#define MAX_VEX 30 /* 最大顶点数目 */
typedef int InfoType; // 邻接链表
typedef int ArcValType;
typedef struct //邻接矩阵存储结构
{
int vexnum, arcnum; /* 图的当前顶点数和弧数 */
VexType vexs[MAX_VEX]; /* 顶点向量 */
ArcValType adj[MAX_VEX][MAX_VEX]; //邻接矩阵
}MGraph; /* 图的结构定义 邻接矩阵 */
接下来是建立矩阵:
这是以邻接矩阵的方式建立无向图:
这里我的方法是,先一次性把所有的顶点输入进去,然后再给顶点之间建立带权值的弧
MGraph* Create_WAG() //设置带权无向图(无向网)的顶点
{
MGraph* G;
char ch;
G = (MGraph*)malloc(sizeof(MGraph));
G->vexnum = 1; /* 初始化顶点数 */
printf("请输入带权无向图的顶点(当输入#时停止创建):\n");
while (1)
{
printf("输入第%d个顶点:\n", G->vexnum);
scanf("%c", &ch);
getchar();
if (ch != '#') {
G->vexs[G->vexnum] = ch;
G->vexnum++;
}
else break;
}
G->vexnum--;