C语言非连通图的深度优先遍历

        由于非连通图的深度优先遍历比起连通图的深度优先遍历思路完全一样,只是非连通图多了一个检测是否所有元素都已经遍历的函数,故不再写连通图的深度优先遍历算法,需要的直接把下面代码的DFSTraverse()函数删除就行(其实不删除也可以遍历连通图啊)。

        先是预定义和类型定义:

#define OK 1
#define ERROR 0
#define MAXSIZE 100

typedef int Status;
typedef int OtherInfo;
typedef char VerTexType;

typedef struct ArcNode{
	int adjvex;
	ArcNode *nextarc;
	OtherInfo info;
}ArcNode;

typedef struct VNode{
	VerTexType data;
	ArcNode *firstarc;
}VNode,AdjList[MAXSIZE];

typedef struct{
	AdjList vertices;
	int vexnum, arcnum;
}ALGraph;

        声明一个bool类型的数组,记录节点是否已经被访问:

bool visited[MAXSIZE];
        创建图:
int Locate(ALGraph *G, VerTexType v)
{
	int i;
	for (i = 0; i < G->vexnum; i++)
	{
		if (G->vertices[i].data == v)
			return i;
	}
}

Status CreateUDG(ALGraph *G)
{
	int i, j, k;
	ArcNode *p1, *p2;
	VerTexType v1, v2;
	printf("输入总节点数和总边数:");
	scanf("%d %d", &G->vexnum, &G->arcnum);
	printf("输入各个节点的值:");
	fflush(stdin);
	for (i = 0; i < G->vexnum; i++)
	{
		scanf("%c", &G->vertices[i].data);
		G->vertices[i].firstarc = NULL;
		visited[i] = false;
	}
	for (k = 0; k < G->arcnum; k++)
	{
		printf("输入一条边的两个顶点的值:");
		fflush(stdin);
		scanf("%c %c", &v1, &v2);
		i = Locate(G, v1);
		j = Locate(G, v2);
		p1 = (ArcNode *)malloc(sizeof(ArcNode));
		p1->adjvex = j;
		p1->nextarc = G->vertices[i].firstarc;
		G->vertices[i].firstarc = p1;
		p2 = (ArcNode *)malloc(sizeof(ArcNode));
		p2->adjvex = i;
		p2->nextarc = G->vertices[j].firstarc;
		G->vertices[j].firstarc = p2;
	}
	return OK;
}

        这和之前创建图的算法一样,只不过在初始化的时候加入了对数组visited[]的初始化。

        深度优先算法:

void DFS(ALGraph G,int v)
{
	ArcNode *p;
	printf("%c ", G.vertices[v].data);
	visited[v] = true;
	for (p = G.vertices[v].firstarc; p; p = p->nextarc)
	{
		if (!visited[p->adjvex])
			DFS(G, p->adjvex);
	}
}

        先输出遍历到的元素,并在visited[]数组中标记为已经遍历。之后的for循环用于对与其有联系节点的遍历:让指针p指向刚刚遍历过节点的第一条边,如果p不为空指针,则判断该边的另一个节点是否遍历,如果尚未遍历,则引用DFS()函数进行遍历。结束后让p指向下一条边。

        非连通图的深度优先算法:


void DFSTraverse(ALGraph G)
{
	int i;
	for (i = 0; i < G.vexnum; i++)
	{
		if (!visited[i])
			DFS(G, i);
	}
}

        依次检测第i个元素是否已经遍历,如果没有遍历过,则对其遍历。

        加入main():

int main(void)
{
	ALGraph G;
	CreateUDG(&G);
	DFSTraverse(G);
	printf("\n");
	return 0;
}



  • 8
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用C语言实现的深度优先遍历的代码: ```c #include <stdio.h> #include <stdbool.h> #define MAX_SIZE 100 // 定义的结构体 typedef struct { int edges[MAX_SIZE][MAX_SIZE]; // 存储边的矩阵 int vertexNum; // 顶点数 int edgeNum; // 边数 } Graph; // 初始化 void initGraph(Graph* graph, int vertexNum) { graph->vertexNum = vertexNum; graph->edgeNum = 0; // 初始化边的矩阵 for (int i = 0; i < vertexNum; i++) { for (int j = 0; j < vertexNum; j++) { graph->edges[i][j] = 0; } } } // 添加边 void addEdge(Graph* graph, int start, int end) { graph->edges[start][end] = 1; graph->edges[end][start] = 1; graph->edgeNum++; } // 深度优先遍历 void dfs(Graph* graph, bool visited[], int vertex) { visited[vertex] = true; printf("%d ", vertex); for (int i = 0; i < graph->vertexNum; i++) { if (graph->edges[vertex][i] == 1 && visited[i] == false) { dfs(graph, visited, i); } } } // 对进行深度优先遍历 void traverse(Graph* graph) { bool visited[MAX_SIZE]; for (int i = 0; i < graph->vertexNum; i++) { visited[i] = false; } for (int i = 0; i < graph->vertexNum; i++) { if (visited[i] == false) { dfs(graph, visited, i); } } } // 测试 int main() { Graph graph; initGraph(&graph, 6); addEdge(&graph, 0, 1); addEdge(&graph, 0, 2); addEdge(&graph, 1, 2); addEdge(&graph, 1, 3); addEdge(&graph, 2, 4); addEdge(&graph, 3, 4); addEdge(&graph, 3, 5); traverse(&graph); return 0; } ``` 在上面的代码中,我们首先定义了一个`Graph`结构体来存储的信息,包括边的矩阵、顶点数和边数。然后我们实现了`initGraph`函数来初始化,`addEdge`函数来添加边。 在进行深度优先遍历时,我们使用了一个`visited`数组来记录每个顶点是否被访问过。我们首先将起始顶点标记为已访问,并将其输出。然后递归地遍历其未被访问的邻居,直到所有与起始顶点连通的顶点都被访问到为止。最后,我们在`traverse`函数中遍历所有顶点,并对未被访问的顶点进行深度优先遍历

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值