// 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;i<G->n;i++){
// for(j=0;j<G->n;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;
}
}
数据结构 邻接矩阵深度/广度遍历 图
最新推荐文章于 2023-12-22 16:58:59 发布