图的遍历过程演示要点Word文档下载推荐.docx

上传人:b****9 文档编号:13076606 上传时间:2022-10-04 格式:DOCX 页数:25 大小:167.76KB
下载 相关 举报
图的遍历过程演示要点Word文档下载推荐.docx_第1页
第1页 / 共25页
图的遍历过程演示要点Word文档下载推荐.docx_第2页
第2页 / 共25页
图的遍历过程演示要点Word文档下载推荐.docx_第3页
第3页 / 共25页
图的遍历过程演示要点Word文档下载推荐.docx_第4页
第4页 / 共25页
图的遍历过程演示要点Word文档下载推荐.docx_第5页
第5页 / 共25页
点击查看更多>>
下载资源
资源描述

图的遍历过程演示要点Word文档下载推荐.docx

《图的遍历过程演示要点Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《图的遍历过程演示要点Word文档下载推荐.docx(25页珍藏版)》请在冰豆网上搜索。

图的遍历过程演示要点Word文档下载推荐.docx

首先由于程序中要有对图的数据信息的创建,定义一个全局变量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

用户登录

图信息的录

进入菜单选择

退出程序

广度优先

修改图的

深度优先

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 总结汇报 > 学习总结

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1