图的遍历过程演示要点Word文档下载推荐.docx
《图的遍历过程演示要点Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《图的遍历过程演示要点Word文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。
![图的遍历过程演示要点Word文档下载推荐.docx](https://file1.bdocx.com/fileroot1/2022-10/4/3d9f933c-0c8f-474b-84d3-43ad92904c92/3d9f933c-0c8f-474b-84d3-43ad92904c921.gif)
首先由于程序中要有对图的数据信息的创建,定义一个全局变量Max,表示最多建立的结点数。
设计实现主要功能的函数有:
创建图的数据信息的函数CreateMGraph();
深度优先遍历递归函数DFSM();
广度优先遍历递归BFSM;
深度优先遍历DFSTraverseM();
广度优先遍历BFSTraverseM();
然后在main()函数中使用一个switch()语句实现对各个子函数的调用。
抽象数据类型队列的定义如下:
ADTQueue{
数据对象:
D={ai|ai∈ElemSet,i=1,2,3……,n,n≥0}数据关系:
R1={<
ai-1,ai>
|ai-1,ai∈D,i=1,2,3,……,n}
约定其中a1端为队列头,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,visit())
Q已存在且非空。
从对头到对尾,依次对Q的每个数据元素调用函数visit()。
一旦visit()失败,则
操作失败。
}
详细设计
#include<
stdio.h>
/*头文件*/#include<
stdlib.h>
#defineMax10
#defineFALSE0
#defineTRUE1#defineErrorprintf#defineQueueSize30typedefstruct
{
charvexs[Max];
intedges[Max][Max];
intn,e;
}MGraph;
/*以邻接矩阵作为图的存储结构*/
intvisited[Max];
/*将visited[Max]定义为全局变量并分配最大空间*/main()
MGraph*G,a;
charch1;
inti,j,ch2;
G=&
a;
ch1='
y'
;
/*设置控制语句标志*/while(ch1=='
||ch1=='
Y'
)
{ /*菜单栏*/
printf("
\n"
);
\t\t++++++++++++图的遍历过程演示++++++++++++++\n"
\t\t+ 选择菜单 +\n"
V/25
\t\t++++++++++++++++++++++++++++++++++++++++++\n"
\t\t+ 创建图的数据请按:
1 +\n"
\t\t+ 深度优先搜索请按:
2 +\n"
\t\t+ 广度优先搜索请按:
3 +\n"
\t\t+ 退出搜索请按:
0 +\n"
printf("
\n\t\t请选择菜单号(0-3):
"
scanf("
%d"
&
ch2);
getchar();
switch(ch2)
case1:
CreateMGraph(G);
/*选1创建一个新的图矩阵*/break;
case2:
DFSTraverseM(G);
/*选2进入深度优先搜索*/break;
case3:
BFSTraverseM(G);
/*选3进入广度优先搜索*/break;
case0:
/*选0结束搜索,退出程序*/ch1='
n'
break;
default:
system("
cls"
\n\t\t输入有误!
break;
if(ch2==1||ch2==2||ch2==3)printf("
\n\n\t\t "
/*控制格式*/
typedefstruct
intfront;
intrear;
intcount;
intdata[QueueSize];
}CirQueue;
/*定义队列的数据结构*/voidInitQueue(CirQueue*Q)
Q->
front=Q->
rear=0;
count=0;
intQueueEmpty(CirQueue*Q)
returnQ->
count=QueueSize;
/*返回队列的最大长度*/
intQueueFull(CirQueue*Q)
count==QueueSize;
voidEnQueue(CirQueue*Q,intx)
if(QueueFull(Q))/*队列满则出错*/
Error("
Queueoverflow"
else
count++;
/*否则count++,将x进队*/Q->
data[Q->
rear]=x;
rear=(Q->
rear+1)%QueueSize;
intDeQueue(CirQueue*Q)
inttemp;
/*定义整型的变量*/
if(QueueEmpty(Q))/*若为真则出错*/
Queueunderflow"
else/*为假则count--,将队员出队*/
temp=Q->
front];
/*用temp返回其值*/Q->
count--;
front=(Q->
front+1)%QueueSize;
returntemp;
/*返回出队元素值*/
voidCreateMGraph(MGraph*G)
inti,j,k;
/*定义整型变量*/
charch1,ch2;
/*定义字符型变量*/
\n请输入顶点数,边数(格式:
3,4):
%d,%d"
(G->
n),&
e));
/*输入图的顶点数和边数*/
for(i=0;
i<
G->
n;
i++)
\n请输入第%d个顶点序号"
i+1);
%c"
vexs[i]));
/*输入顶点的序号*/
for(j=0;
j<
j++)
edges[i][j]=0;
/*初始化矩阵*/
for(k=0;
k<
e;
k++)
\n请输入第%d条边的顶点序号(格式:
i,j):
k+1);
scanf("
%c,%c"
ch1,&
/*输入边的顶点序号*/for(i=0;
ch1!
=G->
vexs[i];
i++);
VI/25
ch2!
vexs[j];
j++);
edges[i][j]=1;
/*有边则赋值为1*/
voidDFSM(MGraph*G,inti)
intj;
%c"
G->
vexs[i]);
visited[i]=TRUE;
/*标记visited[i]*/
/*依次优先搜索访问visited[i]的每个邻接点*/for(j=0;
/*若visited[i]的一个有效邻接点visited[j]未被访问过,则从visited[j]出发进行递归调*/if(G->
edges[i][j]==1&
&
!
visited[j])
DFSM(G,j);
voidDFSTraverseM(MGraph*G)
inti;
\n 深度优先遍历序列:
for(i=0;
visited[i]=FALSE;
/*访问标志数组初始化*/
if(!
visited[i])/*对尚未访问的顶点调用DFSM*/
DFSM(G,i);
voidBFSM(MGraph*G,intk)
inti,j;
CirQueueQ;
/*定义一个队列Q,初始化队列为空*/
VII/25
Q);
vexs[k]);
/*访问初始点,并将其标记已访问过*/visited[k]=TRUE;
Q,k);
/*将以访问过的初始点序号k入队*/
while(!
QueueEmpty(&
Q))/*队列非空进行循环处理*/
i=DeQueue(&
/*将队首元素出队*/
j++)/*依次搜索vexs[k]的每一个可能的邻接点*/
if(G->
edges[i][j]==1&
visited[j])
visited[j]=TRUE;
/*标记vexs[j]已访问过*/
Q,j);
/*顶点序号j入队*/
voidBFSTraverseM(MGraph*G)
\n 广度优先遍历序列:
visited[i])/*对尚未访问的顶点调用BFSM*/
BFSM(G,i);
7)各个模块之间的调用关系如下:
X/25
用户登录
图信息的录
进入菜单选择
退出程序
广度优先
修改图的
深度优先