版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
资料内容仅供您学习参考,如有不当之处,请联系改正或者删除。数据结构课程设计设计题目:有向图拓扑排序专业:信息与计算科学学号:姓名:黄秋实指导教师:文军11月28日数据结构课程设计----拓扑排序一需求分析1.问题描述本次课程设计题目是:用邻接表构造图然后进行拓扑排序,输出拓扑排序序列拓扑排序的基本思想为:1).从有向图中选一个无前驱的顶点输出;2).将此顶点和以它为起点的弧删除;3).重复1),2)直到不存在无前驱的顶点;4).若此时输出的顶点数小于有向图中的顶点数,则说明有向图中存在回路,否则输出的顶点的顺序即为一个拓扑序列。2.拓扑排序有向图拓朴排序算法的基本步骤如下:①从图中选择一个入度为0的顶点,输出该顶点;②从图中删除该顶点及其相关联的弧,调整被删弧的弧头结点的入度(入度-1);③重复执行①、②直到所有顶点均被输出,拓朴排序完成或者图中再也没有入度为0的顶点(此种情况说明原有向图含有环)。3基本要求输入的形式和输入值的范围;首先是输入要排序的顶点数和弧数,都为整型,中间用分隔符隔开;再输入各顶点的值,为正型,中间用分隔符隔开;然后输入各条弧的两个顶点值,先输入弧头,再输入弧尾,中间用分隔符隔开,输入的值只能是开始输入的顶点值否则系统会提示输入的值的顶点值不正确,请重新输入,只要继续输入正确的值就行。输出的形式;首先输出建立的邻接表,然后是最终各顶点的出度数,再是拓扑排序的序列,而且每输出一个顶点,就会输出一次各顶点的入度数。(3)程序所能达到的功能;因为该程序是求拓扑排序,因此算法的功能就是要输出拓扑排序的序列,在一个有向图中,若用顶点表示活动,有向边就表示活动间先后顺序,那么输出的拓扑序列就表示各顶点间的关系为反映出各点的存储结构,以邻接表存储并输出各顶点的入度。二概要设计1.算法中用到的所有各种数据类型的定义在该程序中用邻接表作为图的存储结构。首先,定义表结点和头结点的结构类型,然后定义图的结构类型。创立图用邻接表存储的函数,其中根据要求输入图的顶点和边数,并根据要求设定每条边的起始位置,构建邻接表依次将顶点插入到邻接表中。拓扑排序的函数在该函数中首先要对各顶点求入度,其中要用到求入度的函数,为了避免重复检测入度为零的顶点,设置一个辅助栈,因此要定义顺序栈类型,以及栈的函数:入栈,出栈,判断栈是否为空。2.各程序模块之间的层次调用关系第一部分,voidALGraph*G函数构建图,用邻接表存储。这个函数没有调用函数。第二部分,voidTopologicalSort(ALGraph*G)输出拓扑排序函数,这个函数首先调用FindInDegree(G,indegree)对各顶点求入度indegree[0……vernum-1];然后设置了一个辅助栈,调用InitStack(&S)初始化栈,在调用Push(&S,i)入度为0者进栈,while(!StackEmpty(&S))栈不为空时,调用Pop(&sS,&n)输出栈中顶点并将以该顶点为起点的边删除,入度indegree[k]--,当输出某一入度为0的顶点时,便将它从栈中删除。第三部分,主函数,先后调用voidCreatGraph(ALGraph*G)函数构建图、voidTopologicalSort(ALGraph*G)函数输出拓扑排序实现整个程序。3.设计的主程序流程(见附页)三详细设计(实现概要设计中定义的所有数据类型,对每个操作写出伪码算法;对主程序和其它模块也都需要写出伪码算法(伪码算法达到的详细程度建议为;按照伪码算法能够在计算机键盘直接输入高级程序设计语言程序);写出出函数和过程的调用关系。)1.实现概要设计中定义的所有数据类型#include<stdio.h>#include<stdlib.h>#defineMAX_VEXTEX_NUM100#defineSTACK_INIT_SIZE100#defineSTACKINCREMENT10#defineOK1#defineM100#defineERROR0typedefintElemType;typedefstructArcNode{intadjvex;structArcNode*nextarc;}ArcNode;typedefstructVNode{intdata;ArcNode*firstarc;}VNode,AdjList[MAX_VEXTEX_NUM];typedefstruct{AdjListvertices;intvexnum,arcnum;}ALGraph;typedefstruct{ElemType*base;ElemType*top;intstacksize;}SqStack;2.算法和各模块的代码程序中各函数算法思想如下:voidInitStack(SqStack*S)初始化栈将栈的空间设为STACK-INIT-SIZE。intPop(SqStack*S,ElemType*e)出栈操作,若站不空,删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR。voidPush(SqStack*S,ElemTypee)进栈操作,插入元素e为新的栈顶元素。intStackEmpty(SqStack*S)判断栈是否为空,语句if(S->top=S->base)判断,若栈不为空,则删除S的栈顶元素,并返回OK;否则返回ERROR。voidCreatGraph(ALGraph*G)构建图,用邻接表存储,首先定义邻接表指针变量,输入顶点数和弧数,初始化邻接表,将表头向量域置空,输入存在弧的点集合,当输入顶点值超出输入值的范围就会出错,否则依次插入进邻接表,最后输出建立好的邻接表。2.6voidFindInDegree(ALGrapG,intindegreee[])求入度操作,设一个存放各顶点入度的数组indegreee[],然后indegreee[i]=0赋初值,for循环indegreee[]++,存储入度数。2.7voidTopologicalISort(ALGraphG)输出拓扑排序函数。其思路是若G无回路,则输出G的顶点的一个拓扑序列并返回OK,否则返回ERROR。首先由于邻接表的存储结构入度为零的顶点即为没有前驱的顶点,我们能够附设一个存放个顶点入度的数组,调用FindInDegree(G,indegreee[])对各顶点求入度;为了避免重复检测入度为零0的顶点,设置一个栈,调用InitStack(&S)初始化栈,在调用Push(&S,i)入度为0者进栈,while(!StackEmpty(&S))栈不为空时,调用Pop(&sS,&n)输出栈中顶点并将以该顶点为起点的边删除,入度indegree[k]--,当输出某一入度为0的顶点时,便将它从栈中删除。3.算法的时间复杂度和空间复杂度拓扑排序实际是对邻接表表示的图G进行遍历的过程,每次访问一个入度为零的顶点,若图G中没有回路,则需扫描邻接表中的所有边结点,在算法开始时,为建立入度数组D需访问表头向量中的所有边结点,算法的时间复杂度为O(n+e)。四测试与分析对有向无环图【下图】进行拓扑排序。输入:结果如下:五总结拓扑排序就是对一个有向无环图(DirectedAcyclicGraph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v>∈E(G),则u在线性序列中出现在v之前。在进行课程设计中,更好的认识了拓扑排序。理清了各个模块之间算法之间的条理。认识了伪代码(Pseudocode)是一种算法描述语言。使用伪代码的目的是为了使被描述的算法能够容易地以任何一种编程语言(Pascal,C,Java,etc)实现。因此,伪代码必须结构清晰、代码简单、可读性好,而且类似自然语言。介于自然语言与编程语言之间。它是一种让人便于理解的代码。不依赖于语言的,用来表示程序执行过程,而不一定能编译运行的代码。在数据结构讲算法的时候用的很多。在设计中,我们遇到了程序正确,却对某些无向图无法进行拓扑排序的问题。多次对程序进行修改后,才能够进行拓扑排序。问题出在调用函数的错误理解,模块之间的联系模糊不清。六附录:源程序:#include<stdio.h>#include<stdlib.h>#defineMAX_VEXTEX_NUM100#defineSTACK_INIT_SIZE100#defineSTACKINCREMENT10#defineOK1#defineM100#defineERROR0typedefintElemType;typedefstructArcNode{intadjvex;structArcNode*nextarc;}ArcNode;typedefstructVNode{intdata;ArcNode*firstarc;}VNode,AdjList[MAX_VEXTEX_NUM];typedefstruct{AdjListvertices;intvexnum,arcnum;}ALGraph;typedefstruct{ElemType*base;ElemType*top;intstacksize;}SqStack;voidInitStack(SqStack*);intPop(SqStack*,ElemType*);voidPush(SqStack*,ElemType);intStackEmpty(SqStack*);voidCreatGraph(ALGraph*);voidFindInDegree(ALGraph,int*);voidTopologicalSort(ALGraph);voidInitStack(SqStack*S){S->base=(ElemType*)malloc(STACK_INIT_SIZE*sizeof(ElemType));if(!S->base){printf("内存分配失败,请检查储存位置,再见");exit(1);}S->top=S->base;S->stacksize=STACK_INIT_SIZE;}intPop(SqStack*S,ElemType*e){if(S->top==S->base){returnERROR;}*e=*--S->top;return0;}voidPush(SqStack*S,ElemTypee){if(S->top-S->base>=S->stacksize){S->base=(ElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof(ElemType));if(!S->base){printf("内存分配失败,请检查储存位置,再见");exit(1);}S->top=S->base+S->stacksize;S->stacksize+=STACKINCREMENT;}*S->top++=e;}intStackEmpty(SqStack*S){if(S->top==S->base)returnOK;elsereturnERROR;}voidCreatGraph(ALGraph*G){intm,n,i;ArcNode*p;printf("请输入顶点数和边数:");scanf("%d%d",&G->vexnum,&G->arcnum);for(i=1;i<=G->vexnum;i++){G->vertices[i].data=i;G->vertices[i].firstarc=NULL;}for(i=1;i<=G->arcnum;i++){printf("\n请输入存在边的两个顶点的序号,先输入弧尾,再输入弧头:");scanf("%d%d",&n,&m);while(n<0||n>G->vexnum||m<0||m>G->vexnum){printf("输入的顶点序号不正确请重新输入:");scanf("%d%d",&n,&m);}p=(ArcNode*)malloc(sizeof(ArcNode));if(p==NULL){printf("内存分配失败,请检查储存位置,再见");exit(1);}p->adjvex=m;p->nextarc=G->vertices[n].firstarc;G->vertices[n].firstarc=p;}}voidFindInDegree(ALGraphG,intindegree[]){inti;for(i=1;i<=G.vexnum;i++){indegree[i]=0;}for(i=1;i<=G.vexnum;i++){while(G.vertices[i].firstarc){indegree[G.vertices[i].firstarc->adjvex]++;G.vertices[i].firstarc=G.vertices[i].firstarc->nextarc;}}
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026江苏省教育系统公开招聘考试(教育理论/公共知识)历年参考题库含答案详解
- 2026江苏住院医师规范化培训考试(检验科Ⅱ阶段)题库历年参考题库含答案详解
- 2026正高面审答辩-正高004面审答辩肾内科学历年题库含答案详解
- 2026文物保护工程从业资格考试(责任设计师·近现代重要史迹及代表性建筑)历年参考题库含答案详解
- 冰淇淋烹饪课程设计
- DCT图像压缩应用教程课程设计
- AI换脸特效剪辑课程设计
- 包装课程设计作业范文
- 图嵌入欺诈识别课程设计
- 机器学习垃圾邮件分类器系统设计课程设计
- 2025年市场监管综合执法岗《化妆品监管执法》题库附答案
- 粉煤灰供应、运输、售后服务方案
- 第1课 开启物联网之门 课件(内嵌视频)2026-2027学年人教版初中信息科技八年级全一册
- 2026年工商注册代理从业人员考核模拟试题及答案
- 2026国家能源集团科学技术研究总院(北京低碳清洁能源研究院)社会招聘84人考前冲刺试卷【典优】附答案详解
- 2026年跨境电商海外仓建设与运营管理
- 国家开放大学汉语言文学本科《古代诗歌散文专题》历年期末纸质考试真题总题库2027珍藏版
- 2026新教材全国培训:统编版小学语文五年级教材解析
- 2026年秋季开学第一课:强国复兴有我
- 认知中心建设方案
- 世界盐产业地理分布与区域特点
评论
0/150
提交评论