#include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 20 #define INFINITY 65535 #define TRUE 1 #define FALSE 0 #define OK 1 #define FAIL 0 typedef int Status; typedef enum { DG, DN, UDG, UDN } GraphKind; typedef struct ArcCell { int adjvex; int weight; } ArcCell, AdjMatrix[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; typedef struct { int vertex[MAX_VERTEX_NUM]; int arc[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; int vexnum, arcnum; GraphKind kind; } MGraph; int LocateVex(MGraph G, int v) { int i; for (i = 0; i < G.vexnum; i++) if (G.vertex[i] == v) return i; return -1; } Status CreateDN(MGraph* G) { int i, j, k, w, v1, v2; ArcCell* p; printf("input the number of vertexes and arcs: "); scanf("%d,%d", &G->vexnum, &G->arcnum); for (i = 0; i < G->vexnum; i++) { printf("input the %dth vertex: ", i); scanf("%d", &G->vertex[i]); } for (i = 0; i < G->vexnum; i++) for (j = 0; j < G->vexnum; j++) G->arc[i][j] = INFINITY; for (k = 0; k < G->arcnum; k++) { printf("input the %dth arc: ", k); scanf("%d,%d,%d", &v1, &v2, &w); i = LocateVex(*G, v1); j = LocateVex(*G, v2); G->arc[i][j] = w; // G->arc[j][i] = w; } return OK; } void OutputDN(MGraph G) { int i, j; for (i = 0; i < G.vexnum; i++) { printf("%d:", G.vertex[i]); for (j = 0; j < G.vexnum; j++) printf("%5d ", G.arc[i][j]); printf("\n"); } } int main(void) { MGraph G; CreateDN(&G); OutputDN(G); printf("success\n"); return 0; }
时间: 2024-01-09 09:04:44 浏览: 103
这段代码是用 C 语言实现的一个有向图的建立和输出的程序,其中包含了邻接矩阵的定义和相关操作函数,可以用于创建一个带权有向图,并输出其邻接矩阵。具体实现包括创建有向图的函数 CreateDN,输出邻接矩阵的函数 OutputDN,以及定位某个顶点的函数 LocateVex 等。其中,CreateDN 函数会根据用户输入的顶点数、边数和每条边的起点、终点和权重信息来创建一个有向图,而 OutputDN 函数则会遍历整个邻接矩阵并输出其中的所有元素。
相关问题
2、实现图的深度优先遍历和广度优先遍历 /*用邻接矩阵法创建有向网的算法如下:*/ //#include "adjmatrix.h" #include<stdio.h> *最多顶点个数*/ #define MAX VERTEX NUM20 *表示极大值,即∞*/ #define INFINITY 32768 #defne True 1 #define False 0 #define Error -1 16896 #define Ok 1
深度优先遍历(DFS):
```c++
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
typedef char VertexType;
typedef int EdgeType;
typedef struct {
VertexType vexs[MAX_VERTEX_NUM];
EdgeType arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum, arcnum;
} MGraph;
bool visited[MAX_VERTEX_NUM];
void CreateGraph(MGraph* G) {
printf("请输入顶点数和边数:");
scanf("%d %d", &(G->vexnum), &(G->arcnum));
printf("请输入顶点:");
for (int i = 0; i < G->vexnum; i++) {
scanf(" %c", &(G->vexs[i]));
}
for (int i = 0; i < G->vexnum; i++) {
for (int j = 0; j < G->vexnum; j++) {
if (i == j) {
G->arcs[i][j] = 0;
} else {
G->arcs[i][j] = INFINITY;
}
}
}
printf("请输入每条边的起点、终点、权值:\n");
for (int k = 0; k < G->arcnum; k++) {
int i, j, w;
scanf("%d %d %d", &i, &j, &w);
G->arcs[i][j] = w;
}
}
void DFS(MGraph* G, int v) {
visited[v] = true;
printf("%c ", G->vexs[v]);
for (int j = 0; j < G->vexnum; j++) {
if (G->arcs[v][j] != INFINITY && !visited[j]) {
DFS(G, j);
}
}
}
void DFSTraverse(MGraph* G) {
for (int i = 0; i < G->vexnum; i++) {
visited[i] = false;
}
for (int i = 0; i < G->vexnum; i++) {
if (!visited[i]) {
DFS(G, i);
}
}
}
int main() {
MGraph G;
CreateGraph(&G);
printf("深度优先遍历结果:");
DFSTraverse(&G);
return 0;
}
```
广度优先遍历(BFS):
```c++
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 20
typedef char VertexType;
typedef int EdgeType;
typedef struct {
VertexType vexs[MAX_VERTEX_NUM];
EdgeType arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
int vexnum, arcnum;
} MGraph;
bool visited[MAX_VERTEX_NUM];
void CreateGraph(MGraph* G) {
printf("请输入顶点数和边数:");
scanf("%d %d", &(G->vexnum), &(G->arcnum));
printf("请输入顶点:");
for (int i = 0; i < G->vexnum; i++) {
scanf(" %c", &(G->vexs[i]));
}
for (int i = 0; i < G->vexnum; i++) {
for (int j = 0; j < G->vexnum; j++) {
if (i == j) {
G->arcs[i][j] = 0;
} else {
G->arcs[i][j] = INFINITY;
}
}
}
printf("请输入每条边的起点、终点、权值:\n");
for (int k = 0; k < G->arcnum; k++) {
int i, j, w;
scanf("%d %d %d", &i, &j, &w);
G->arcs[i][j] = w;
}
}
void BFS(MGraph* G, int v) {
int queue[MAX_VERTEX_NUM], front = 0, rear = 0;
printf("%c ", G->vexs[v]);
visited[v] = true;
queue[rear++] = v;
while (front != rear) {
int i = queue[front++];
for (int j = 0; j < G->vexnum; j++) {
if (G->arcs[i][j] != INFINITY && !visited[j]) {
printf("%c ", G->vexs[j]);
visited[j] = true;
queue[rear++] = j;
}
}
}
}
void BFSTraverse(MGraph* G) {
for (int i = 0; i < G->vexnum; i++) {
visited[i] = false;
}
for (int i = 0; i < G->vexnum; i++) {
if (!visited[i]) {
BFS(G, i);
}
}
}
int main() {
MGraph G;
CreateGraph(&G);
printf("广度优先遍历结果:");
BFSTraverse(&G);
return 0;
}
```
#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
抱歉,代码片段似乎不完整,而且缺少一些关键的部分。但是,我可以为您提供一些有关图的基本知识和一些代码实现的建议。
在代码片段中,似乎定义了一个邻接矩阵的结构体,其中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开始,依次遍历与之相邻的未访问过的顶点,直到所有顶点都被访问过。
类似地,可以实现广度优先遍历、查找图中的最短路径等操作。以此类推,可以根据具体的需求来实现更多的图操作函数。
阅读全文