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

来源:互联网 发布:网络红本价 编辑:程序博客网 时间:2024/05/16 08:04

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


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

 

      在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");}




1 0
原创粉丝点击