1、1目 录一、课题的主要功能 .21.1 设计内容 21.2 对课程设计功能的需求分析 2二、课题的功能模块的划分 .22.1 模块划分 22.2 系统的概要设计 3三、主要功能的实现 .43.1 算法思想 41.图的邻接矩阵的建立 42.图的遍历的实现 43.2 数据结构 43.3 主函数流程图 53.4 深度优先遍历流程图 63.5 深度优先遍历递归 73.6 深度优先遍历流程图 93.7 广度优先遍历递归流程图 .10四、程序调试 114.1 程序的调试分析 .114.2 程序的测试结果 .11五、总结 16六、附件 166.1 源程序 .162一、课题的主要功能1.1 设计内容演示图的深
2、度优先, 广度优先遍历过程,并输出原图结构及遍历结果。要求图的结点数不能少于 6 个。可以由系统随机生成图,也可以由用户手动输入图。报告中要写出画图的思路;画出图的结构,有兴趣的同学可以进一步改进图的效果。1.2 对课程设计功能的需求分析图的遍历并不需要是一个过于复杂的工作环境,一般来说:最合适的才是最好的。软件设计必须符合我们使用实际情况的需要。根据要求,图的遍历主要功能如下:1.用户可以随时建立一个有向图或无向图;2.用户可以根据自己的需要,对图进行深度遍历或广度遍历;3.用户可以根据自己的需要对图进行修改;4.在整个程序中,用户可以不断的按照不同的方式对图进行遍历,若不继续,用户也可以随
3、时跳出程序,同时,如果用户输入的序号错误,程序会提示用户重新输入序号;二、课题的功能模块的划分2.1 模块划分1.队列的初始化、进队、出队、队列空、队列满的函数void InitQueue(CirQueue *Q) /初始化队列int QueueEmpty(CirQueue *Q)/队列是否为空int QueueFull(CirQueue *Q)/队列满Void EnQueue(CirQueue *Q,int x)/将队员进队int DeQueue(CirQueue *Q)/将队员出队2.创建图的函数void CreateMGraph(MGraph *G)/根据用户需要创建一个图3.图的深度优
4、先遍历递归void DFSM(MGraph *G,int i)/*含有输出已访问的顶点的语句*/34.图的广度优先遍历递归 void BFSM(MGraph *G,int k) /*含有输出已访问的顶点的语句*/5.深度优先遍历 void DFSTraverseM(MGraph *G)/*调用 DFSM 函数*/6.广度优先遍历 void BFSTraverseM(MGraph *G) /*调用 BFSM 函数*/7.主函数 main() /*包含一些调用和控制语句*/2.2 系统的概要设计开 始信息录入菜单选择深度优先修改信息广度优先退出程序4三、主要功能的实现3.1 算法思想本课题所采用的
5、是邻接矩阵的方式存储图,实现图的深度、广度两种遍历,并将每种遍历结果输出来。1.图的邻接矩阵的建立对任意给定的图(顶点数和边数自定) ,根据邻接矩阵的存储结构建立图的邻接距阵。2.图的遍历的实现图的遍历包括图的广度优先遍历与深度优先遍历。对于广度优先遍历应利用队列的五种基本运算(置空队列、进队、出队、取队头元素、判队空)来实现。首先建立一空队列,从初始点出发进行访问,当被访问时入队,访问完出队。并以队列是否为空作为循环控制条件。对于深度优先遍历则采用递归或非递归算法来实现,这里我所采用的是递归算法。3.2 数据结构#define Max 10#define FALSE 0#define TRU
6、E 1#define Error printf#define QueueSize 30typedef struct char vexsMax;int edgesMaxMax;int n,e;5MGraph;int visitedMax;typedef struct int front;int rear;int count;int dataQueueSize;CirQueue;3.3 主函数流程图登陆开始输入 ch26CreateMGraph(G);Ch1=yCh1=y 真假 012 33.4 深度优先遍历流程图Ch2Ch1=nCreateMGraph(G)DFSTraverseM(G) BFS
7、TraverseM(G)BFSTraverseM(G) DFSTraverseM(G) DFSTraverseM(G) DFSTraverseM(G) DFSTraverseM(G) DFSTraverseM(G)DFSTraverseM(G)B r ea k结束程序DFSTraverseM(MGraph *G)7真非零 零3.5 深度优先遍历递归i=0invisitedi=FALSEi+i=0!visitediDFSM(G,i)ini+结束程序8真 DFSM(MGraph *G,int i)visitedi=TRUEjnj=0G-edgesij=1int edgesMaxMax;int n,
8、e;MGraph;/*以邻接矩阵作为图的存储结构*/int visitedMax;/*将 visitedMax定义为全局变量并分配最大空间*/typedef struct 17int front;int rear;int count;int dataQueueSize;CirQueue;/*定义队列的数据结构*/初始化队列 void InitQueue(CirQueue *Q)Q-front=Q-rear=0;Q-count=0;/队列空int QueueEmpty(CirQueue *Q)return Q-count=QueueSize;/*返回队列的最大长度*/ /队列满int Queue
9、Full(CirQueue *Q)return Q-count=QueueSize;/*返回队列的最大长度*/ /进队void EnQueue(CirQueue *Q,int x)if(QueueFull(Q)/*队列满则出错*/Error(“Queue overflow“);18elseQ-count+;/*否则 count+,将 x 进队*/Q-dataQ-rear=x;Q-rear=(Q-rear+1)%QueueSize;/出队int DeQueue(CirQueue *Q)int temp;/*定义整型的变量*/if(QueueEmpty(Q)/*若为真则出错*/Error(“Que
10、ue underflow“);else/*为假则 count-,将队员出队*/temp=Q-dataQ-front;/*用 temp 返回其值*/Q-count-;Q-front=(Q-front+1)%QueueSize;return temp;/*返回出队元素值*/ /建立一个图void CreateMGraph(MGraph *G)int i,j,k;/*定义整型变量*/char ch1,ch2;/*定义字符型变量*/printf(“n 请输入顶点数,边数(格式:3,4):“);19scanf(“%d,%d“,/*输入图的顶点数和边数*/for(i=0;in;i+)getchar();p
11、rintf(“n 请输入第%d 个顶点序号“,i+1);scanf(“%c“,/*输入顶点的序号*/for(i=0;in;i+)for(j=0;jn;j+)G-edgesij=0;/*初始化矩阵*/for(k=0;ke;k+)getchar();printf(“n 请输入第%d 条边的顶点序号(格式:i,j):“,k+1);scanf(“%c,%c“,/*输入边的顶点序号*/for(i=0;ch1!=G-vexsi;i+);for(j=0;ch2!=G-vexsj;j+);G-edgesij=1;/*有边则赋值为 1*/ /深度优先遍历递归 void DFSM(MGraph *G,int i)
12、int j;printf(“%c “,G-vexsi);visitedi=TRUE;/*标记 visitedi*/*依次优先搜索访问 visitedi的每个邻接点*/20for(j=0;jn;j+)/*若 visitedi的一个有效邻接点 visitedj未被访问过,则从 visitedj出发进行递归调用*/if(G-edgesij=1 /广度优先遍历递归void BFSM(MGraph *G,int k)int i,j;CirQueue Q;/*定义一个队列 Q,初始化队列为空*/InitQueue(printf(“%c “,G-vexsk);/*访问初始点,并将其标记已访问过*/visit
13、edk=TRUE;EnQueue(/*将以访问过的初始点序号 k 入队*/while(!QueueEmpty(/*将队首元素出队*/for(j=0;jn;j+)/*依次搜索 vexsk的每一个可能的邻接点*/if(G-edgesij=1 /*标记 vexsj已访问过*/EnQueue(/*顶点序号 j 入队*/深度优先遍历void DFSTraverseM(MGraph *G)21int i;printf(“n 深度优先遍历序列:“);for(i=0;in;i+)visitedi=FALSE;/*访问标志数组初始化*/for(i=0;in;i+)if(!visitedi)/*对尚未访问的顶点调
14、用 DFSM*/DFSM(G,i); /广度优先遍历void BFSTraverseM(MGraph *G)int i;printf(“n 广度优先遍历序列:“);for(i=0;in;i+)visitedi=FALSE;/*访问标志数组初始化*/for(i=0;in;i+)if(!visitedi)/*对尚未访问的顶点调用 BFSM*/BFSM(G,i);22 main()MGraph *G,a;char ch1;int i,j,ch2;G=printf(“ntt 深度优先搜索和广度优先搜索 n“);CreateMGraph(G);/*调用创建图矩阵的函数*/getchar(); ch1=y
15、;/*设置控制语句标志*/while(ch1=y|ch1=Y) /*菜单栏*/printf(“n“);printf(“ 选择菜单“); printf(“ntt*n“);printf(“tt* 更改数据请按:1 *n“);printf(“tt* 深度优先搜索请按:2 *n“);printf(“tt* 广度优先搜索请按:3 *n“);printf(“tt* 退出搜索请按:0 *n“);printf(“tt*n“);printf(“ntt 请选择菜单号(0-3):“);scanf(“%d“,getchar();switch(ch2)case 1:CreateMGraph(G);/*选 1 创建一个新
16、的图矩阵*/break;23case 2:DFSTraverseM(G);/*选 2 进入深度优先搜索*/break;case 3:BFSTraverseM(G);/*选 3 进入广度优先搜索*/break;case 0:/*选 0 结束搜索,退出程序*/ch1=n;break;default:system(“cls“);printf(“ntt 输入有误!n“);break;if(ch2=1|ch2=2|ch2=3)printf(“nntt “);/*控制格式*/24计算机与通信学院课程设计评分表课程名称: 项 目 评 价设计方案的合理性与创造性设计与调试结果设计说明书的质量答辩陈述与回答问题情况课程设计周表现情况综合成绩教师签名: 日 期: (注:1此页附在课程设计报告之后;2综合成绩按优、良、中、及格和不及格五级评定。 )2