图的深度优先搜索遍历

1. 代码

//============================ 
//无向图的遍历
//深度优先 
//存储结构:邻接表 
//非递归算法 
//2017.9.26 
//========================= 
#include<stdio.h>
#include<stdlib.h>
#define MAX_VEX 100
typedef struct arcnode
{
	int adjvex;
	struct arcnode *next;
}ARCNODE;
typedef struct
{
	//int vertex;//可以用于记录是否访问;程序用visit[] 
	ARCNODE *firstarc;	
}VERNODE;
VERNODE adjlist[MAX_VEX];
int creat()
{
	int bv, ev, vexnum, edgnum, i;
	printf("input vexnum, edgnum:\n");
	scanf("%d,%d", &vexnum, &edgnum);
	//initialization 
	for(i=1; i<=vexnum; i++)
		adjlist[i].firstarc=NULL;
	printf("input bv,ev\n");
	for(i=1; i<=edgnum; i++)
	{
		ARCNODE *p=(ARCNODE*)malloc(sizeof(ARCNODE));
		scanf("%d,%d", &bv, &ev);
		p->adjvex=ev;
		p->next=adjlist[bv].firstarc;
		adjlist[bv].firstarc=p;	
		//无向图加上以下 
		p=(ARCNODE*)malloc(sizeof(ARCNODE));
		p->adjvex=bv;
		p->next=adjlist[ev].firstarc;
		adjlist[ev].firstarc=p;	
	}
	return vexnum;	
}
int visit[MAX_VEX];	//记录是否访问 
void dfs(int v)
{
	visit[v]=1;//vertex=1;//!!!把 = 写成 == 导致莫名其妙的错误23333 
	printf("%d  ", v);	
	ARCNODE *p=adjlist[v].firstarc;
	while(p)
	{
		if(visit[p->adjvex]==0)
			dfs(p->adjvex);	
		p=p->next;					
	}	
} 
int main()
{
	int vexnum=creat();
	int i, stvex;
	ARCNODE *p;
	for(i=1; i<MAX_VEX; i++)
		visit[i]=0;
	printf("output the adjacency list built:\n");
	for(i=1;i<=vexnum;i++)
	{
		printf("%d==>", i);
		p=adjlist[i].firstarc;
		while(p)
		{
			printf("--->%d", p->adjvex);
			p=p->next;
		}
		printf("\n");	
	}
	printf("input starting vertex:\n");
	scanf("%d", &stvex);
	printf("the DFS of graph:\n");
	dfs(stvex);	
 	return 0;
}

2. 结果

猜你喜欢

转载自blog.csdn.net/lituusliu/article/details/78107566