#include <stdio.h> #include <stdlib.h> #define MAX_VERTEX_NUM 100 // 定义顶点的结构体 typedef struct { int data; } VertexType; // 定义边的结构体 typedef struct { int i, j; // 边的两个顶点下标 } EdgeType; // 定义邻接矩阵 typedef struct { int edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵 int n, e; // n 为顶点数,e 为边数 VertexType vertex[MAX_VERTEX_NUM]; // 顶点数组 } MGraph; // 初始化邻接矩阵 void CreateMGraph(MGraph *G) { int i, j, k, w; printf("请输入顶点数和边数:\n"); scanf("%d %d", &G->n, &G->e); printf("请输入顶点信息:\n"); for (i = 0; i < G->n; i++) { scanf("%d", &G->vertex[i].data); } for (i = 0; i < G->n; i++) { for (j = 0; j < G->n; j++) { G->edges[i][j] = 0; } } printf("请输入边信息:\n"); for (k = 0; k < G->e; k++) { printf("请输入第 %d 条边的下标 i, j 和权重 w:", k+1); scanf("%d %d %d", &i, &j, &w); G->edges[i][j] = w; G->edges[j][i] = w; } } // 深度优先搜索 void DFS(MGraph *G, int v, int *visited) { int i; visited[v] = 1; printf("%d ", G->vertex[v].data); for (i = 0; i < G->n; i++) { if (G->edges[v][i] && !visited[i]) { DFS(G, i, visited); } } } int main() { MGraph G; int visited[MAX_VERTEX_NUM] = {0}; CreateMGraph(&G); printf("深度优先搜索结果为:\n"); DFS(&G, 0, visited); printf("\n"); return 0; }
时间: 2024-03-30 09:40:41 浏览: 168
这是一段使用邻接矩阵表示图,并进行深度优先搜索的 C 语言程序。程序先定义了顶点的构体、边的构体和邻接矩的结构体,后实现了初始化邻矩阵的函数 CreateGraph() 和深度优先搜索的函数 DFS()。
在主函数中,程序首先创建了一个邻接矩阵图 G,然后定义了一个 visited 数组表示是否访问过该顶点,并将其初始化为 0。接下来程序调用 DFS() 函数对图进行深度优先搜索,并输出搜索结果。
注意,这段程序的正确性前提是用户输入的图是连通图,否则可能无法搜索到所有的顶点。
相关问题
优化这段代码#include<stdio.h> #include<stdlib.h> #include<malloc.h> #include<conio.h> #define OK 1 #define error 0 #define MVNum 100 #define MAXSIZE 10 typedef int OtherInfo,QElemtype; typedef char VerTexType; //结构体定义 typedef struct ArcNode{ int adjvex;
首先,该段代码中包含了一些不必要的头文件,例如:conio.h,malloc.h等。建议只保留stdio.h和stdlib.h。
其次,可以将#define OK 1和#define error 0替换为枚举类型,使代码更加清晰易读。
最后,在结构体定义中,可以将OtherInfo和QElemtype合并为一个类型,避免定义过多类型。同时,也可以将结构体中的变量类型进行优化,例如将int类型的adjvex改为short或者char类型。
重构后的代码如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
#define MAX_VERTEX_NUM 100
#define MAX_ARC_NUM 10
typedef enum {
ERROR = 0,
OK = 1
} Status;
typedef char VertexType;
typedef int ArcType;
typedef struct ArcNode {
int adjvex;
struct ArcNode* nextarc;
ArcType* info;
} ArcNode;
typedef struct VNode {
VertexType data;
ArcNode* firstarc;
} VNode, AdjList[MAX_VERTEX_NUM];
typedef struct {
AdjList vertices;
int vexnum, arcnum;
} ALGraph;
```
希望可以帮到你。
解释代码(#include<stdio.h> #include<string.h> #include<malloc.h> #include <stdlib.h> #include<iostream> using namespace std; #define TRUE 1 #define FALSE 0 #define OK 1 #define ERROR 0 #define OVERFLOW -2 typedef int Status; typedef int Boolean; typedef char TElemType; #define MaxInt 32767 #define MVNum 100 typedef char VerTexType; typedef int ArcType; typedef struct { VerTexType vex[MVNum];//顶点表 ArcType arcs[MVNum][MVNum];//邻接矩阵 int vexnum,arcnum;//图的当前点数和边数 }AMGraph; struct { VerTexType Head;//边的始点 VerTexType Tail;//边的终点 ArcType lowcost;//边上的权值 }Edge[MVNum]; int LocateVex(AMGraph &G,VerTexType u) {//存在则返回u在顶点表中的下标;否则返回-1 int i; for(i=0;i<G.vexnum;++i) if(u==G.vex[i]) return i; //return -1; } Status CreatUDN(AMGraph &G)//创建图 { printf("请输入顶点和边数:\n"); cin>>G.vexnum>>G.arcnum; cout<<"请输入顶点:\n"; for(int i=0;i<G.vexnum;i++) cin>>G.vex[i]; for(int i=0;i<G.vexnum;i++) { for(int j=0;j<G.vexnum;j++) G.arcs[i][j]=MaxInt; })
这段代码是关于图的邻接矩阵存储结构的实现。包含了一些头文件和宏定义。其中,typedef用于定义新的数据类型,Status和Boolean都是int类型的,TElemType是char类型的,分别用于表示状态、布尔值和图中节点的数据类型。宏定义中,TRUE和FALSE分别表示1和0,OK和ERROR分别表示操作成功和失败,OVERFLOW表示溢出。AMGraph结构体包含了图的顶点表和邻接矩阵,以及当前点数和边数。Edge数组存储了边的始点、终点和权值。LocateVex函数用于查找节点在顶点表中的下标,如果不存在则返回-1。CreatUDN函数用于创建无向图,首先输入顶点和边数,然后输入每个节点的数据,初始化邻接矩阵的值为MaxInt表示没有边相连。
阅读全文