#include<stdio.h> #include<stdlib.h> #include<string.h> #include<limits.h> typedef int VRType; // 顶点关系类型 typedef char VertexType[20]; // 顶点类型 // 图的数组(邻接矩阵)存储表示 #define INFINITY INT_MAX // 用整型最大值代替∞ #define MAX_VERTEX_NUM 20 // 最大顶点个数 typedef enum{DG,DN,UDG,UDN}GraphKind; // {有向图,有向网,无向图,无向网} typedef struct { VRType adj; // 顶点关系类型。对无权图,用1(是)或0(否)表示相邻否;对带权图,则为权值 }ArcCell,AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 二维数组 typedef struct // 图的数组(邻接矩阵)存储 { VertexType vexs[MAX_VERTEX_NUM]; // 顶点向量 AdjMatrix arcs; // 邻接矩阵 int vexnum,arcnum; // 图的当前顶点数和弧数 GraphKind kind; // 图的种类标志 }MGraph; void visit(VertexType i); void CreateGraphF(MGraph &G);// 采用数组(邻接矩阵)表示法,由文件构造无向网G void Display(MGraph G); // 输出邻接矩阵存储表示的图G int LocateVex(MGraph G,VertexType u);//若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 VertexType& GetVex(MGraph G,int v); // v是G中某个顶点的序号,返回v的值 int FirstAdjVex(MGraph G,VertexType v);//v是图G中某个顶点,返回v的第一个邻接顶点的序号。若顶点在G中没有邻接顶点,则返回-1 int NextAdjVex(MGraph G,VertexType v,VertexType w);//v是G中某个顶点,w是v的邻接顶点,返回v的(相对于w的)下一个邻接顶点的序号,若w是v的最后一个邻接顶点,则返回-1 void DestroyGraph(MGraph &G); // 销毁图G int main() { MGraph g; VertexType v1,v2; CreateGraphF(g); // 利用数据文件创建邻接矩阵表示的图 Display(g); // 输出图 int i,j,k,n; //printf("请输入顶点的值: "); scanf("%s",v1); //printf("输出图G中顶点%s的所有邻接顶点: ",v1); k=FirstAdjVex(g,v1); while(k!=-1) { strcpy(v2, g.vexs[k] ); visit(v2); k=NextAdjVex(g,v1,v2); } printf("\n"); return 0; } void visit(VertexType i) { printf("%s ",i); } void CreateGraphF(MGraph &G) { // 采用数组(邻接矩阵)表示法,由文件构造无向网G /********** Begin **********/ /********** End **********/ } void Display(MGraph G) { // 输出邻接矩阵存储表示的图G /********** Begin **********/ /********** End **********/ } int LocateVex(MGraph G,VertexType u) { //初始条件:图G存在,u和G中顶点有相同特征 // 操作结果:若G中存在顶点u,则返回该顶点在图中位置;否则返回-1 /********** Begin **********/ /********** Begin **********/ } VertexType& GetVex(MGraph G,int v) { // 初始条件:图G存在,v是G中某个顶点的序号。操作结果:返回v的值 /********** Begin **********/ /********** End **********/ } int FirstAdjVex(MGraph G,VertexType v) { // 初始条件:图G存在,v是G中某个顶点 // 操作结果:返回v的第一个邻接顶点的序号。若顶点在G中没有邻接顶点,则返回-1 /********** Begin **********/ /********** End **********/ } int NextAdjVex(MGraph G,VertexType v,VertexType w) { // 初始条件:图G存在,v是G中某个顶点,w是v的邻接顶点 // 操作结果:返回v的(相对于w的)下一个邻接顶点的序号,若w是v的最后一个邻接顶点,则返回-1 /********** Begin **********/ /********** End **********/ } void DestroyGraph(MGraph &G) { // 初始条件:图G存在。操作结果:销毁图G /********** Begin **********/ /********** End **********/ }
时间: 2025-05-27 15:27:29 浏览: 22
### 邻接矩阵表示的图的数组存储实现
以下是基于邻接矩阵表示法的图的C语言实现代码,涵盖了图的基本操作,包括初始化、创建以及打印邻接矩阵。
#### 存储结构定义
首先定义一个`MGraph`结构体用于存储图的数据。其中,`arcs[][]`是一个二维数组,用来保存顶点之间的连接关系;`vexs[]`是一维数组,用来保存顶点信息;`vexnum`和`arcnum`分别记录当前图中的顶点数和边数[^4]。
```c
#define MaxNum 100 // 定义最大顶点数量
typedef char VertexType;
typedef struct {
int arcs[MaxNum][MaxNum]; // 邻接矩阵
VertexType vexs[MaxNum]; // 顶点表
int vexnum, arcnum; // 当前图的顶点数和边数
} MGraph;
```
#### 初始化函数
初始化函数用于设置默认值,确保新创建的图处于初始状态。
```c
void InitGraph(MGraph *g) {
g->vexnum = 0; // 初始顶点数为0
g->arcnum = 0; // 初始边数为0
for (int i = 0; i < MaxNum; i++) {
for (int j = 0; j < MaxNum; j++) {
g->arcs[i][j] = 0; // 将所有边权重初始化为0
}
}
}
```
#### 创建图函数
此函数允许用户输入顶点和边的信息,并将其填充到邻接矩阵中。对于无向图,每条边都需要双向赋值[^5]。
```c
#include <stdio.h>
// 查找顶点位置
int LocateVertex(const MGraph *g, VertexType v) {
for (int i = 0; i < g->vexnum; i++) {
if (g->vexs[i] == v) return i;
}
return -1; // 如果未找到返回-1
}
// 创建图
void CreateGraph(MGraph *g) {
VertexType vi, vj;
int weight;
printf("请输入顶点个数和边的数量:");
scanf("%d%d", &g->vexnum, &g->arcnum);
printf("请输入顶点信息:\n");
for (int i = 0; i < g->vexnum; i++) {
scanf(" %c", &g->vexs[i]);
}
printf("请输入边的信息(起点 终点 权重):\n");
for (int k = 0; k < g->arcnum; k++) {
scanf(" %c %c %d", &vi, &vj, &weight);
int i = LocateVertex(g, vi);
int j = LocateVertex(g, vj);
if (i != -1 && j != -1) {
g->arcs[i][j] = weight; // 设置边(i,j)的权值
g->arcs[j][i] = weight; // 对于无向图也需要设置(j,i)
} else {
printf("错误:无法找到指定顶点。\n");
}
}
}
```
#### 打印邻接矩阵
为了验证图是否正确建立,可以提供一个打印功能显示整个邻接矩阵的内容。
```c
void PrintMatrix(const MGraph *g) {
printf("\n邻接矩阵如下所示:\n");
// 输出顶点列表作为列头
printf(" ");
for (int i = 0; i < g->vexnum; i++) {
printf("%c ", g->vexs[i]);
}
printf("\n");
// 输出每一行的具体内容
for (int i = 0; i < g->vexnum; i++) {
printf("%c:", g->vexs[i]); // 行首标记对应顶点字符
for (int j = 0; j < g->vexnum; j++) {
printf("%2d ", g->arcs[i][j]);
}
printf("\n");
}
}
```
以上即为完整的邻接矩阵表示下的图的操作实现过程[^4]。
---
###
阅读全文
相关推荐















