码迷,mamicode.com
首页 > 其他好文 > 详细

(编程训练)再回首,数据结构——无向图的邻接矩阵表示、DFS、BFS

时间:2015-05-13 10:42:21      阅读:141      评论:0      收藏:0      [点我收藏+]

标签:数据结构   bfs   dfs   

       最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会。


       希望这些能提供给初学者一些参考。


       在VC++6.0下可运行,当初还写了不少注释。


【问题描述】
建立图的邻接矩阵存储结构,实现图的遍历
【基本要求】
·功能:建立图的邻接矩阵存储结构,实现图的BFS、DFS
·输入:输入连通图的顶点数、顶点信息、边数、顶点对序列及遍历的起始顶点序号
·输出:图的广度优先搜索序列、深度优先搜索
【模块划分】
1. 建立有向图的邻接表 CreateAdjMatrix()
2. 以邻接表作为存储结构实现深度优先搜索DFS()
3. 循环队列的初始化 InitQueue()
4. 判断循环队列是否为空 QueueEmpty()
5. 入队 EnQueue()
6. 出对 DeleteQueue()
7. 以邻接表作为存储结构实现广度优先搜索BFS()
8. main()函数调用 CreateAdjMatrix()形成有向图的邻接矩阵,调用函数DFS() 求得深度优先搜索序列,调用函数 BFS()求得广度优先搜索序列


#include <stdio.h>
#include <string.h>
#define MaxSize 10

/*邻接矩阵的数据结构*/
typedef struct
{
	char vexs[MaxSize];	//顶点数组
	int arcs[MaxSize][MaxSize];	//邻接矩阵
	int vexnum,arcnum;	//顶点数、边弧数
}AdjMatrix;

/*队列的数据结构*/
typedef struct
{
	int elem[MaxSize];
	int front,rear;
}CirQueue;

int visited[MaxSize];	//标志_是否访问过

/*建立无向图的邻接矩阵 Create AdjMatrix()*/
void CreateAdjMatrix(AdjMatrix *g)
{
	int i,j,k;
	printf("输入顶点数、边弧数\n");
	scanf("%d%d",&g->vexnum,&g->arcnum);
	getchar();

	printf("输入顶点值\n");
	for(i=0;i<g->vexnum;i++)
		scanf("%c",&g->vexs[i]);
	getchar();

	//初始化无向图
	for(i=0;i<g->vexnum;i++)
		for(j=0;j<g->vexnum;j++)
			g->arcs[i][j]=0;

	printf("输入边弧值\n");
	for(i=0;i<g->arcnum;i++)
	{
		scanf("%d%d",&j,&k);
		getchar();
		g->arcs[j][k]=1;
		g->arcs[k][j]=1;
	}
}

/*邻接矩阵实现 DFS()*/
void DFS(AdjMatrix *g, int i)
{
	visited[i]=1;
	printf("%3c ",g->vexs[i]);

	for(int j=0;j<g->vexnum;j++)
		if(g->arcs[i][j] && (!visited[j]))
			DFS(g,j);
}


/*入队列 EnQueue()*/
void EnQueue(CirQueue *q, int e)
{
	if(q->front==(q->rear+1)%MaxSize)
		printf("Full!");
	else
	{
		q->rear=(q->rear+1)%MaxSize;
		q->elem[q->rear]=e;
	}
}

/*出队列 DeleteQueue()*/
void DeleteQueue(CirQueue *q, int *e)
{
	if(q->front==q->rear)
		return;
	*e=q->elem[(q->front+1)%MaxSize];
	q->front=(q->front+1)%MaxSize;
}

/*邻接矩阵实现 BFS()*/
void BFS(AdjMatrix *g, int i)
{
	int j,k;
	CirQueue Q;
	memset(visited,0,sizeof(visited));

	printf("%3c ",g->vexs[i]);
	visited[i]=1; 
	Q.front=0;
	Q.rear=0;
	EnQueue(&Q,i);

	while(!(Q.front==Q.rear))
	{
		DeleteQueue(&Q,&j);
		for(k=0;k<g->vexnum;k++)
			if(g->arcs[j][k]&&(!visited[k]))
			{
				printf("%3c ",g->vexs[k]);
				visited[k]=1;
				EnQueue(&Q,k);
			}
	}
}

/*主函数 main*/
int main()
{
	AdjMatrix *g, a;
	char ch,c;
	int i,j;
	g=&a;

	printf("建立无向图的邻接矩阵\n");
	CreateAdjMatrix(g);

	printf("无向图的邻接矩阵为\n");
	for(i=0;i<g->vexnum;i++)
	{
		for(j=0;j<g->vexnum;j++)
			printf("%4d",g->arcs[i][j]);
		printf("\n");
	}

	printf("深度优先搜索\n");
	memset(visited,0,sizeof(visited));
	DFS(g,0);
	printf("\n");

	printf("广度优先搜索\n");
	BFS(g,0);
	printf("\n");
}


技术分享


(编程训练)再回首,数据结构——无向图的邻接矩阵表示、DFS、BFS

标签:数据结构   bfs   dfs   

原文地址:http://blog.csdn.net/u011694809/article/details/45675009

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!