最近在复习数据结构,顺便看看大一的时候写的代码,看完之后比当初有了更加深刻的体会。
希望这些能提供给初学者一些参考。
在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"); }
时间: 2024-10-09 12:30:51