数据结构 邻接矩阵深度/广度遍历 图

// 8.1 以邻接矩阵作为存储结构
/*****************************/
/*       图和函数定义        */
/*****************************/
#include"stdio.h"
#include"stdlib.h"
#define MaxVertexNum 100						//定义最大顶点数

typedef struct{
	char vexs[MaxVertexNum];					//顶点表
	int edges[MaxVertexNum][MaxVertexNum];	//邻接矩阵,可看作边表
	int n, e;										//图中的顶点数n和边数e
}MGraph;										//用邻接矩阵表示的图的类型

typedef enum{FALSE,TRUE} Boolean;
Boolean visited[MaxVertexNum];					//定义数组保存访问的状态

/*****************************/
/*      建立邻接矩阵         */
/*****************************/
void CreatMGraph(MGraph *G)
{
	int i, j, k;
	char a;
	printf("Input VertexNum(n) and EdgesNum(e): ");
	scanf("%d,%d",&G->n,&G->e);			//输入顶点数和边数
	scanf("%c",&a);
	printf("Input Vertex string:");
	for(i=0;i<G->n;i++)
	{
		scanf("%c",&a);
		G->vexs[i]=a;						//读入顶点信息,建立顶点表
	}
	for(i=0; i<G->n; i++)
		for(j=0; j<G->n; j++)
			G->edges[i][j]=0;				//初始化邻接矩阵
	printf("Input edges,Creat Adjacency Matrix\n");
	for(k=0; k<G->e; k++) {					//读入e条边,建立邻接矩阵  
		scanf("%d%d",&i,&j);				//输入边(Vi,Vj)的顶点序号
		G->edges[i][j]=1;
		G->edges[j][i]=1;					//若为无向图,矩阵为对称矩阵;若建立有向图,去掉该条语句 
	}
}

/*****************************/
/*          主函数           */
/*****************************/
int main()
{
	void DFS(MGraph *G);
	void BFS(MGraph *G, int k);
	void DFSM(MGraph *G, int i);

	int i;
	MGraph *G;
	G=(MGraph *) malloc(sizeof(MGraph));	//为图G申请内存空间, 大小为100*100
	CreatMGraph(G);						//建立邻接矩阵
	printf("Print Graph DFS: ");
	DFS(G);									//深度优先遍历
	printf("\n");
	printf("Print Graph BFS: ");
	BFS(G, 3);								//以序号为3的顶点开始广度优先遍历
	printf("\n");

	return 0;
}


// 9.1 以邻接矩阵作为存储结构
/***********************************/
/*        BFS:广度优先遍历       */
/*      (以节点k为出发点)       */
/***********************************/
void BFS(MGraph *G, int k)
{
	for(int i=0;i<G->n;i++){
		visited[i]=FALSE;
	}
	char queue[G->n+1]={0};
	int visitedPtr=0;
	int k_0=k;
	queue[visitedPtr]=G->vexs[k];
	for (int counter=0;counter<G->n;counter++)
	{
		// 如果k没有访问过,继续操作
		if(visited[k]==FALSE){
			//设置visited[k]的值为TRUE,表示被访问过了
			visited[k]=TRUE;
			//遍历搜索G->edges[k][i],
			for(int i=0;i<G->n;i++){
				//将所有等于1且没有访问过的结点加入到队列;
				if(G->edges[k][i]==1&&visited[i]==FALSE){
					visited[i]=TRUE;
					//将符合条件的结点入队
					visitedPtr++;
					queue[visitedPtr]=G->vexs[i];
					
					//如果k的值没有被修改过,那么就修改为第一个与k邻接的结点的值,并且此后不再修改
					if(k==k_0){
						k_0=i;
						visited[k_0]=FALSE;
					}
				}
				
			}k=k_0;//将第一个结点的值赋值给k
		}
		
	}
	printf("%s",queue);
	


}

/***********************************/
/*        DFS:深度优先遍历       */
/* (递归部分:以节点i为出发点)  */
/***********************************/
void DFSM(MGraph *G, int i)
{
	//设置被输出的结点的值为true
	visited[i]=TRUE;
	printf("%c",G->vexs[i]);
	int j=0;
	//从0开始遍历寻找第一个邻接结点
	for(j=0;j<G->n;j++){
		if(visited[j]==FALSE&&G->edges[i][j]!=0){	
			DFSM(G,j);
		}
	}
}
/**************************************************/
/*              DFS:深度优先遍历                */
/*   (初始化部分:初始化访问数组,调用DFSM)   */
/**************************************************/
void DFS(MGraph *G)
{
	int i,j=0;
	for(i=0;i<G->n;i++){
		visited[i]=FALSE;
	}
	//测试代码->输出邻接矩阵的图像
	// for(i=0;in;i++){
	// 	for(j=0;jn;j++){
	// 		printf("%d\t",G->edges[i][j]);
	// 	}
	// 	printf("\n");
	// }
	
	//寻找第一个非空节点,并以此结点开始递归(题中所给是0结点开始)
	for(i=0;i<G->n;i++){
		for(j=0;j<G->n;j++){
			if(G->edges[i][j]!=0){
				DFSM(G,i);
				break;
			}
		}break;
	}
	


}


你可能感兴趣的:(datastructure)