图的邻接表的深度优先搜索

#include <bits/stdc++.h>
#define VSIZE 100
typedef int VType;
typedef bool EType;
int visited[VSIZE];//对这个结点是否访问先进判断,为0则的没被访问,为1则是被访问过 
 
typedef struct ENode{ //边链表结点 
	int v;//顶点下标 
	struct ENode *next;//下一个顶点的指针 
}ENode;

typedef struct VNode{ //顶点表结点 
	VType data; //顶点中的数据 
	ENode *first;//第一个边链表结点的指针 
}VNode;

typedef struct AdjLGraph{
	VNode vexs[VSIZE]; //顶点数组 
	int VNum;//顶点数 
	int ENum;//边数 
}AdjLGraph;
void createAdjLGraph(AdjLGraph *g)//创建邻接表 
{
	printf("输入顶点数\n");
	scanf("%d",&g->VNum);
	printf("输入边的数\n");
	scanf("%d",&g->ENum);
	for(int i = 0;i < g->VNum;i++){
		printf("输入第%d个顶点的值\n",i+1);
		scanf("%d",&g->vexs[i].data);
		g->vexs[i].first = NULL;
	}
	for(int k = 0;k < g->ENum;k++){
		int i,j;
		printf("输入哪两个点相连\n");
		scanf("%d %d",&i,&j);
		
		ENode *p = (ENode *)malloc(sizeof(ENode));
		p->v = j-1;
		p->next = g->vexs[i-1].first;
		g->vexs[i-1].first = p;
		
		p = (ENode *)malloc(sizeof(ENode));
		p->v = i-1;
		p->next = g->vexs[j-1].first;
		g->vexs[j-1].first = p;
	}
}
void DFS(AdjLGraph g,int i)
{
	visited[i] = 1;              //为了表示这个顶点被访问过,所有赋值为1 
	printf("%d\n",g.vexs[i].data);
	ENode *p = g.vexs[i].first;   
	while(p){ //把和这顶点相连的所有顶点都访问一遍 
		if(visited[p->v] == 0){
			DFS(g,p->v);
		}
		p = p->next;
	}
}
void DFSTraverse(AdjLGraph g)//遍历邻接表
{
	for(int i = 0;i < g.VNum;i++){
		if(visited[i] == 0){ //如果为0则表示没有被访问过,那么就调动 
			DFS(g,i);        //DFS
		}
	}
}
int main()
{
	AdjLGraph g;//定义一个图 
	createAdjLGraph(&g);//创建邻接表 
	DFSTraverse(g);//遍历邻接表 
	return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_42868863/article/details/88936919