深度优先遍历(无向图 C语言 邻接矩阵实现)

#include<stdio.h>
#include<queue.h>
//数组表示法
#define MAXN  20

typedef struct{
	char vertec[MAXN];
	char arcs[MAXN][MAXN];
}ArrayGraph;

void Init_G(ArrayGraph *G, int nums)
{
	int i,j;
	
	for(i=0; i<nums; i++){
		for(j=0; j<nums; j++){
			G->arcs[i][j] = 0;
		}
	}
	
	return ;
}

void Creat_G(ArrayGraph *G, int nums)
{
	int i=0,j;
	int k=0;
	
	printf("please enter graph node\n");
	while(k!=nums){
		scanf("%c", &G->vertec[k]);
		k++;
	}
	
	for(i=0; i<nums; i++){
		for(j=i+1; j<nums; j++){
			scanf("%d%d", &G->arcs[i][j]);
			G->arcs[j][i] = G->arcs[i][j];
		}
	}
	
	return ;
}

void ArrayGraph_DFS(ArrayGraph *G, int nums, int start, int *visit)
{
	if(G==NULL || nums<1 || start<0 || visit==NULL){
		return ;
	}
	int i;
	
	printf("this node is %d\n", G->vertec[start]);
	visit[start] = 1;
	
	for(i
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
邻接矩阵是一种图的表示方法,用一个二维数组来表示节点之间的连接情况。对于无向图邻接矩阵是对称的;对于有向图,邻接矩阵不一定对称。 以下是用邻接矩阵实现存储深度优先遍历C语言代码: ```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 edges[MAX_VERTEX_NUM][MAX_VERTEX_NUM]; // 邻接矩阵数组 int vexnum, edgenum; // 顶点数和边数 } MGraph; int visited[MAX_VERTEX_NUM]; // 标记数组,记录每个顶点是否被访问过 // 初始化邻接矩阵图 void InitMGraph(MGraph *G) { int i, j; printf("请输入顶点数和边数:\n"); scanf("%d%d", &G->vexnum, &G->edgenum); printf("请输入%d个顶点:\n", G->vexnum); for (i = 0; i < G->vexnum; i++) { scanf(" %c", &G->vexs[i]); } for (i = 0; i < G->vexnum; i++) { for (j = 0; j < G->vexnum; j++) { G->edges[i][j] = 0; // 初始化邻接矩阵 } } printf("请输入%d条边(格式:vi vj)和它们的权值:\n", G->edgenum); for (i = 0; i < G->edgenum; i++) { int vi, vj, w; scanf("%d%d%d", &vi, &vj, &w); G->edges[vi][vj] = w; // 如果是无向图,还需要设置G->edges[vj][vi] = w; } } // 深度优先遍历邻接矩阵图 void DFS(MGraph *G, int v) { int i; visited[v] = 1; printf("%c ", G->vexs[v]); // 打印顶点数据 for (i = 0; i < G->vexnum; i++) { if (G->edges[v][i] != 0 && visited[i] == 0) { // 如果有边且未被访问过 DFS(G, i); // 递归访问相邻顶点 } } } int main() { MGraph G; InitMGraph(&G); printf("深度优先遍历结果:"); int i; for (i = 0; i < G.vexnum; i++) { visited[i] = 0; // 初始化标记数组 } for (i = 0; i < G.vexnum; i++) { if (visited[i] == 0) { // 如果未被访问过 DFS(&G, i); // 从该顶点开始深度优先遍历 } } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值