最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会。
希望这些能提供给初学者一些参考。
在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
原文地址:http://blog.csdn.net/u011694809/article/details/45675009