数据结构课程设计:有向图拓扑排序算法的实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计
设计说明书
有向图拓扑排序算法的实现
学生姓名樊佳佳
学号**********
班级网络工程1301
成绩
指导教师申静
数学与计算机科学学院
2016年1月4日
课程设计任务书
2015—2016学年第一学期
课程设计名称:数据结构课程设计
课程设计题目:图的拓扑排序算法的实现
完成期限:自2015年12月20日至2016年 1 月 3 日共 2 周
设计内容:
1、设计任务
(1)给出一个有向无环图,遍历所有的节点;(2)能够实现对所有顶点的拓扑;(3)界面友好,可
操作性强。
2、需求分析
对系统的功能及性能要求进行分析,写出需求规格说明书(可行性分析报告、系统的分层DFD 图)。
3、软件设计
软件设计分两个阶段进行:总体设计和详细设计;
总体设计:确定系统总体设计方案,完成系统的模块结构图及模块的功能说明;
详细设计:对模块内部过程及数据结构进行设计,以及进行数据库设计、用户界面设计等编写出该项目的详细设计报告;
4、具体编码
编写程序,要求给出详细的注释,包括:模块名、模块功能、中间过程的功能、变量说明等。
同时编写用户使用手册、程序模块说明等文档;
5、软件测试
所有测试过程要求采用综合测试策略:先作静态分析,再作动态测试。应事先制订测试计划,并要求保留所有测试用例,完成测试报告。
指导教师:申静教研室负责人:申静
课程设计评阅
摘要
设计了一个对有向图进行拓扑排序的算法,该算法首先用邻接表构造有向图的存储结构,然后对此有向图进行拓扑排序,输出拓扑排序的结果。用VC++作为软件开发环境,以邻接表作为图的存储结构,将图中所有顶点排成一个线性序列,输出拓扑排序结果。拓扑排序常用来确定一个依赖关系集中,事物发生的顺序。拓扑排序是对有向无环图的顶点的一种排序,它使得如果存在一条从顶点A到顶点B的路径,那么在排序中B出现在A的后面。
关键词:邻接表;有向无环图;拓扑排序
目录
1 课题描述 (1)
2 问题分析和任务定义 (2)
3 逻辑设计 (3)
3.1程序模块功能图 (3)
3.2 抽象数据类型 (3)
4 详细设计 (4)
4.1 C语言定义的相关数据类型 (4)
4.2 主要模块的伪码算法 (4)
4.2.1主函数伪码算法 (4)
4.2.2邻接表伪码算法 (4)
4.2.3拓扑排序的伪码算法: (5)
4.3 主函数流程图 (6)
5 程序编码 (7)
6 程序调试与测试 (13)
7 结果分析 (16)
8 总结 (17)
参考文献 (18)
1 课题描述
根根据设计要求运用C语言程序设计了一个对有向图进行拓扑排序的算法,该算法首先用邻接表构造有向图的存储结构,然后对此有向图进行拓扑排序,输出拓扑排序的结果。
如给定一个有向无环图如图1.1所示。在此图中,从入度为0的顶点出发,删除此顶点和所有以它为尾的弧;重复直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止。
图1.1 有向无环图
开发工具:Visual C++ 6.0
2 问题分析和任务定义
对一个有向无环图G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对由某个集合上的一个偏序得到该集合上的一个全序,这个操作就称之为拓扑排序。偏序集合中仅有部分成员之间颗比较,而全序指集合中全体成员之间均可比较,而由偏序定义得到拓扑有序的操作便是拓扑排序。
一个表示偏序的有向图可用来表示一个流程图,通过抽象出来就是AOV-网,若从顶点i到顶点j有一条有向路径,则i是j的前驱,j是i的后继。若(i,j)是一条弧,则i 是j的直接前驱;j是i的直接后继。
在AOV-网中,不应该出现有向环,用拓扑排序就可以判断网中是否有环,若网中所有顶点都在它的拓扑有序序列中,则该AOV-网必定不存在环。
3.1程序模块功能图
图3.1程序模块功能图
3.2 抽象数据类型
ADT ALGraph
{
数据对象:D={V|V是具有相同特性的数据元素的集合,即顶点集}数据关系:R={
基本操作P:
CreatGraphlist(ALGraph *G)
初始条件:成对输入顶点集V中的点。
操作结果:构造图G的邻接表。
FindInDegree(ALGraph G, int indegree[])
初始条件:图G的邻接表中存在结点V。
操作结果:找到图中入度为0结点。
Initgraph()
操作结果:完成图形初始化。
TopologicalSort(ALGraph G)
初始条件:构造的有向图G已初始化。
操作结果:对于有向图G根据邻接存储表进行拓扑排序。}
4.1 C语言定义的相关数据类型
#define max_vextex_num 20 /*宏定义最大顶点个数*/
#define stack_init_size 100 /*宏定义栈的存储空间大小*/
typedef int ElemType;
typedef struct VNode /*邻接表头结点的类型*/
{
int data; /*顶点信息,数据域*/
}VNode, AdjList[MAX_VEXTEX_NUM]; /*AdjList是邻接表类型*/
typedef struct
{
AdjList vertices; /*邻接表*/
int vexnum, arcnum; /*图中顶点数vexn和边数arcn*/
}ALGraph; /*图的类型*/
typedef struct //构建栈
{
ElemType *base; /*数据域*/
ElemType *top; /*栈指针域*/
int stacksize;
}SqStack;
4.2 主要模块的伪码算法
4.2.1主函数伪码算法:
开始
{
创建及输出邻接表CreatGraphlist(&G);
输出排序后的输出序列TopologicalSort(G);
}
结束
4.2.2邻接表伪码算法:
#define MAX_VEXTEX_NUM 20
typedef struct VNode /*邻接表头结点的类型*/
{
int data; /*顶点信息,数据域*/