1、首先由于程序中要有对图的数据信息的创建,定义一个全局变量 Max,表示最多建立的结点数。设计实现主要功能的函数有:创建图的数据信息的函数 CreateMGraph();深度优先遍历递归函数DFSM();广度优先遍历递归 BFSM;深度优先遍历 DFSTraverseM();广度优先遍历 BFSTraverseM();然后在 main()函数中使用一个 switch()语句实现对各个子函数的调用。抽象数据类型队列的定义如下:ADT Queue数据对象:D=ai| ai ElemSet,i=1,2,3,n,n0 数据关系:R1=| ai-1,ai D,i=1,2,3,,n约定其中 a1 端为队列头
2、,an 端为队列尾。基本操作:InitQueue(&Q)操作结果:构造一个空队列 Q。DestroyQueue(&初始条件:队列 Q 已存在。队列 Q 被销毁,不再存在。ClearQueue(&将 Q 清为空队列。QueueEmpty(Q)若 Q 为空队列,则返回 TRUE,否则 FALSE。QueueLength(Q)返回 Q 的元素个数,即队列的长度。GetHead(Q,&e)Q 为非空队列。用 e 返回 Q 的对头元素。EnQueue(&Q,e)插入元素 e 为 Q 的新的队尾元素。DeQueue(&Q,&删除 Q 的对头元素,并用 e 返回其值。QueueTraverse(Q,visi
3、t()Q 已存在且非空。从对头到对尾,依次对 Q 的每个数据元素调用函数 visit()。一旦 visit()失败,则操作失败。详细设计#include/*头文件*/ #include#define Max 10#define FALSE 0#define TRUE 1 #define Error printf #define QueueSize 30 typedef structchar vexsMax;int edgesMaxMax; int n,e;MGraph;/*以邻接矩阵作为图的存储结构*/int visitedMax;/*将 visitedMax定义为全局变量并分配最大空间*/
4、main()MGraph *G,a; char ch1; int i,j,ch2; G=&a;ch1=y;/*设置控制语句标志*/ while(ch1=|ch1=Y)/*菜单栏*/printf(n);tt+图的遍历过程演示+ntt+选择菜单+nV / 25tt+ntt+创建图的数据请按:1+ntt+深度优先搜索请按:2+ntt+广度优先搜索请按:3+ntt+退出搜索请按:0+n printf(ntt 请选择菜单号(0-3): scanf(%d,&ch2);getchar(); switch(ch2)case 1:CreateMGraph(G);/*选 1 创建一个新的图矩阵*/ break;c
5、ase 2:DFSTraverseM(G);/*选 2 进入深度优先搜索*/ break;case 3:BFSTraverseM(G);/*选 3 进入广度优先搜索*/ break;case 0:/*选 0 结束搜索,退出程序*/ ch1=nbreak; default:system(clsntt 输入有误! break;if(ch2=1|ch2=2|ch2=3) printf(nntt/*控制格式*/typedef structint front;int rear; int count;int dataQueueSize;CirQueue;/*定义队列的数据结构*/ void InitQue
6、ue(CirQueue *Q)Q-front=Q-rear=0;count=0;int QueueEmpty(CirQueue *Q)return Q-count=QueueSize;/*返回队列的最大长度*/int QueueFull(CirQueue *Q)count=QueueSize;void EnQueue(CirQueue *Q,int x)if(QueueFull(Q)/*队列满则出错*/Error(Queue overflowelsecount+;/*否则 count+,将 x 进队*/ Q-dataQ-rear=x;rear=(Q-rear+1)%QueueSize;int
7、DeQueue(CirQueue *Q)int temp;/*定义整型的变量*/if(QueueEmpty(Q)/*若为真则出错*/Queue underflowelse/*为假则 count-,将队员出队*/temp=Q-front;/*用 temp 返回其值*/ Q-count-;front=(Q-front+1)%QueueSize; return temp;/*返回出队元素值*/void CreateMGraph(MGraph *G)int i,j,k;/*定义整型变量*/char ch1,ch2;/*定义字符型变量*/n 请 输 入 顶 点 数 , 边 数 ( 格 式 :3,4):%
8、d,%d(G-n),&e);/*输入图的顶点数和边数*/for(i=0;in;i+)n 请 输 入 第 %d 个 顶 点 序 号 ,i+1);%cvexsi);/*输入顶点的序号*/for(j=0;jj+)edgesij=0;/*初始化矩阵*/for(k=0;kvexsi;i+);VI / 25ch2!vexsj;j+);edgesij=1;/*有边则赋值为 1*/void DFSM(MGraph *G,int i)int j;%c ,G-vexsi);visitedi=TRUE;/*标记 visitedi*/*依次优先搜索访问 visitedi的每个邻接点*/ for(j=0;/*若 vis
9、itedi的一个有效邻接点 visitedj未被访问过,则从 visitedj出发进行递归调*/ if(G-edgesij=1&!visitedj)DFSM(G,j);void DFSTraverseM(MGraph *G)int i;n深度优先遍历序列: for(i=0;visitedi=FALSE;/*访问标志数组初始化*/if(!visitedi)/*对尚未访问的顶点调用 DFSM*/DFSM(G,i);void BFSM(MGraph *G,int k)int i,j;CirQueue Q;/*定义一个队列 Q,初始化队列为空*/VII / 25Q);vexsk);/*访问初始点,并将
10、其标记已访问过*/ visitedk=TRUE;Q,k);/*将以访问过的初始点序号 k 入队*/while(!QueueEmpty(&Q)/*队列非空进行循环处理*/i=DeQueue(&/*将队首元素出队*/j+)/*依次搜索 vexsk的每一个可能的邻接点*/if(G-edgesij=1 & visitedj)visitedj=TRUE;/*标记 vexsj已访问过*/Q,j);/*顶点序号 j 入队*/void BFSTraverseM(MGraph *G)n广度优先遍历序列:visitedi)/*对尚未访问的顶点调用 BFSM*/BFSM(G,i);7)各个模块之间的调用关系如下:X / 25用户登录图信息的录进入菜单选择退出程序广度优先修改图的深度优先
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1