DFS(c语言)

c语言小白,写文章方便自己记忆复习
无论是DFS还是BFS,使用邻接表时间复杂度为O(v+e),使用邻接矩阵时间复杂度为O(v^2)

#include<stdio.h>
#include<stdlib.h>
//边的定义
struct Enode
{
	int v1, v2;
	int weight;
};
typedef struct Enode* Edge;
//图的定义
struct Gnode
{
	int Nv, Ne;
	int** GL;
};
typedef struct Gnode* Graph;
int visit[100];
//图的初始化
Graph createGraph(int Nv)
{
	Graph G;
	G = (Graph)malloc(sizeof(struct Gnode));
	G->Nv = Nv;
	G->Ne = 0;
	G->GL = (int **)malloc(sizeof(int*)*Nv);
	int i, j, k;
	for (i = 0; i < Nv; i++)
	{
		G->GL[i] = (int *)malloc(sizeof(int)*Nv);
	}
	for (j = 0; j < Nv; j++)
	{
		for ( k = 0; k < Nv; k++)
		{
			G->GL[j][k] = 0;
		}
	}
	return G;
}
//插入边
void insertGraph(Graph G,Edge E)
{
	G->GL[E->v1][E->v2] = E->weight;
	G->GL[E->v2][E->v1] = E->weight;
	printf("插入成功");
}
//构建一个图
Graph buildGraph(int Nv,int Ne)
{
	int i;
	Graph G;
	G = createGraph(Nv);
	if(Ne != 0)
	{
		printf("请依次输入边的两个顶点和权值");
		for (i = 0; i < Ne; i++)
		{
			Edge E = (Edge)malloc(sizeof(struct Enode));
			scanf("%d %d %d", &(E->v1), &(E->v2), &(E->weight));
			printf("赋值成功");
			insertGraph(G, E);
			free(E);
		}
	}
	printf("构建成功");
	return G;
}
bool isEmpty(Graph G, int a, int b)
{
	return G->GL[a][b]>0 ? true : false;
}
//寻找第一个的邻接点
int FirstAdjVex(Graph G, int i)
{
    int v;
    if (i<0 || i >= G->Nv)return -1;
    for (v = 0; v<G->Nv; v++)
        if (G->GL[i][v] == 1)return v;
    return -1;
}
//寻找下一个邻接点
int NextAdjVex(Graph G, int i, int j)
{
    if (i<0 || i >= G->Nv)return -1;
    if (j<0 || j >= G->Nv)return -1;
    for (int v = j + 1; v<G->Nv; v++)
        if (G->GL[i][v] == 1)return v;
    return -1;
}
void DFS(Graph G,int s)
{
	printf("%d",s);
	visit[s]=1;
	int w = FirstAdjVex(G,s);
	while(w!=-1)
	{
		if(visit[w]==0)
			DFS(G,w);
		w=NextAdjVex(G,s,w);
	}
}
void main()
{
	int v, e;
	printf("先输入图的节点数和变数");
	scanf("%d %d",&v,&e);
	Graph G;
	G = buildGraph(v,e);
	DFS(G,0);
	printf("完结撒花");
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值