#include "stdlib.h" #include "stdio.h" #include "malloc.h" #define INFINITY 32767 #define MAX_VERTEX_NUM 20 typedef enum{FALSE,TRUE}visited_hc; typedef enum{DG,DN,UDG,UDN}graphkind_hc; typedef struct arccell_hc {int adj; int *info; }arccell_hc,adjmatrix
时间: 2024-03-03 20:51:20 浏览: 124
msm_mdp.rar_V2
抱歉,代码片段似乎不完整,而且缺少一些关键的部分。但是,我可以为您提供一些有关图的基本知识和一些代码实现的建议。
在代码片段中,似乎定义了一个邻接矩阵的结构体,其中adj表示边的权重,info表示边的其他信息。此外,还定义了一个枚举类型graphkind_hc,表示图的类型(有向图、有向网、无向图、无向网)。
在这个基础上,可以定义一个图的结构体,包含顶点数组、边数组(邻接矩阵或邻接表)、顶点数、边数、图的类型等信息。
例如,可以定义一个邻接矩阵表示的有向图的结构体如下:
```
typedef struct {
int vex[MAX_VERTEX_NUM];
arccell_hc arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum,arcnum;
graphkind_hc kind;
}MGraph;
```
其中,vex是顶点数组,arcs是邻接矩阵,vexnum表示顶点数,arcnum表示边数,kind表示图的类型。
接下来,可以实现一些基本的图操作函数,如创建图、遍历图、查找图中的路径等。
例如,下面是一个创建有向图的函数:
```
void CreateDG(MGraph *G) {
int i,j,k,w;
printf("请输入顶点数和边数:");
scanf("%d%d",&G->vexnum,&G->arcnum);
printf("请输入顶点信息:");
for(i=0;i<G->vexnum;i++) {
scanf("%d",&G->vex[i]);
}
for(i=0;i<G->vexnum;i++) {
for(j=0;j<G->vexnum;j++) {
G->arcs[i][j].adj=INFINITY;
G->arcs[i][j].info=NULL;
}
}
printf("请输入边信息:");
for(k=0;k<G->arcnum;k++) {
printf("请输入第%d条边的起点、终点和权重:",k+1);
scanf("%d%d%d",&i,&j,&w);
G->arcs[i][j].adj=w;
}
G->kind=DG;
}
```
该函数首先从用户输入中获取顶点数和边数,然后依次输入顶点信息和边信息,并构建邻接矩阵表示的有向图。
接下来是一个深度优先遍历的函数:
```
void DFS(MGraph G,int v,visited_hc *visited) {
int i;
visited[v]=TRUE;
printf("%d ",G.vex[v]);
for(i=0;i<G.vexnum;i++) {
if(G.arcs[v][i].adj!=INFINITY && !visited[i]) {
DFS(G,i,visited);
}
}
}
```
该函数从指定顶点v开始,依次遍历与之相邻的未访问过的顶点,直到所有顶点都被访问过。
类似地,可以实现广度优先遍历、查找图中的最短路径等操作。以此类推,可以根据具体的需求来实现更多的图操作函数。
阅读全文