拓扑排序课程设计报告
拓扑排序课程设计报告

吉林省2023年一级注册建筑师考试设计汇总模拟试题本卷共分为2大题50小题,作答时间为180分钟,总分100分,60分及格。
一、单项选择题(共25 题,每题 2 分,每题旳备选项中,只有 1 个事最符合题意)1、调制解调器旳功能是__。
A.数字信号旳编号B.模拟信号旳编号C.数字信号转换成其他信号D.数字信号与模拟信号之间旳转换2、超过出让协议约定旳动工开发日期满一年而未动工开发旳,可以征收相称于土地使用权出让金旳百分之多少如下旳土地闲置费(2023,82)A.10%B.20%C.25%D.30%3、根据《抗震规范》,多高层钢构造房屋旳抗震构造措施与下列何种原因无关A.设防烈度B.抗震等级C.构造类型D.房屋高度4、我国现行建设项目工程选价旳构成中,工程建设其他费用包括:(2023,1) A.基本预备费B.税金C.建设期贷款利息D.与未来企业生产经营有关旳其他费用5、初步设计文献扉页上应签订或授权盖章下列哪一组人(2023,74)A.法定代表人、技术总负责人、项目总负责人、各专业审核人B.法定代表人、项目总负责人、各专业审核人、各专业负责人C.法定代表人、技术总负责人、项目总负责人、各专业负责人D.法定代表人、项目总负责人、部门负责人、各专业负责人6、长途客运汽车站、火车站、客运码头重要出入口__m范围内应设公交车站。
A.30B.50C.80D.1007、在吊顶内铺放纤维吸声材料时,应采用旳施工技术措施是:(2023,49) A.防潮措施B.防火措施C.防散落措施D.防霉变措施8、建筑工程定额按生产要素可分为______。
A.全国统一定额、地区定额、行业定额、企业定额等B.劳动定额、材料消耗定额、机械台班使用定额C.施工定额、预算定额、概算定额、概算指标D.建筑工程定额、安装工程定额、市政工程定额等9、铝合金门窗与墙体旳连接应为弹性连接,下面理由对旳旳是()①建筑物在一般振动、沉降变形时不致损坏门窗②建筑物受热胀冷缩变形时,不致损坏门窗③让门窗框不直接与混凝土、水泥砂浆接触,以免碱腐蚀④便于施工与维修A.①②③B.②③C.②④D.①10、工程量清单应由哪个部门对其精确性负责(2023,72)A.招标人B.承包人C.发包人D.设计人11、大型建设项目在选择场地时要搜集地形图,如下__比例尺旳图纸合适。
求拓扑序列排序课程设计

求拓扑序列排序课程设计一、教学目标本课程的教学目标是让学生掌握拓扑序列排序的基本概念、原理和应用,培养学生运用拓扑序列排序解决问题的能力。
具体包括以下三个方面的目标:1.知识目标:(1)理解拓扑序列排序的定义和性质;(2)掌握拓扑排序算法及其实现;(3)了解拓扑序列排序在实际应用中的重要性。
2.技能目标:(1)能够运用拓扑排序解决简单的问题;(2)能够运用图论知识分析和解决拓扑排序相关问题;(3)能够运用编程语言实现拓扑排序算法。
3.情感态度价值观目标:(1)培养学生对计算机科学的兴趣和热情;(2)培养学生团队合作、自主学习的能力;(3)培养学生运用所学知识解决实际问题的意识。
二、教学内容本课程的教学内容主要包括以下几个部分:1.拓扑序列排序的基本概念:图、顶点、边、度数、入度、出度等;2.拓扑排序的原理:拓扑排序的定义、拓扑排序的存在性、拓扑排序的算法;3.拓扑排序算法实现:深度优先搜索(DFS)算法、广度优先搜索(BFS)算法;4.拓扑排序的应用:任务调度、项目规划等实际问题。
三、教学方法为了达到本课程的教学目标,将采用以下几种教学方法:1.讲授法:通过讲解拓扑序列排序的基本概念、原理和应用,使学生掌握相关知识;2.讨论法:学生分组讨论拓扑排序算法实现和应用问题,培养学生的思考和表达能力;3.案例分析法:分析实际应用中的拓扑排序问题,让学生学会将理论知识应用于实际问题;4.实验法:安排拓扑排序算法的编程实验,培养学生的动手能力和实际问题解决能力。
四、教学资源为了支持本课程的教学内容和教学方法的实施,将准备以下教学资源:1.教材:《图论与算法导论》;2.参考书:《计算机网络》、《数据结构与算法》;3.多媒体资料:PPT课件、教学视频;4.实验设备:计算机、网络设备。
通过以上教学资源的使用,丰富学生的学习体验,提高学生的学习效果。
五、教学评估本课程的教学评估将采取多元化、全过程的方式进行,以全面、客观、公正地评价学生的学习成果。
拓扑排序的实现实验报告

拓扑排序的实现实验报告GDOU-B-11-112广东海洋大学学生实验报告书(学生用表)实验名称拓扑排序的实现课程名称数据结构与算法教程课程号学院(系) 数学与计算机专业软件工程班级学生姓名学号实验地点实验日期一、实验内容、目的掌握拓扑排序的原理和方法。
二、实验原理a)算法基本思想用Kahn算法。
先使用一个栈保存入度为0 的顶点,然后输出栈顶元素并且将和栈顶元素有关的边删除,减少和栈顶元素有关的顶点的入度数量并且把入度减少到0的顶点也入栈。
b)实验程序说明1.创建栈。
2.计算每个顶点的入度,保存在数组中。
3.将入度为0的顶点入栈。
4.创建循环,将栈顶元素出栈,输出拓扑序列,再创建循环,顶点入度减1,若为0则入栈。
5.判断图是否有环,若有则失败。
三、程序流程图四、实现步骤1.在有向图中选一个没有前驱的顶点并且输出2.从图中删除该顶点和所有以它为尾的弧(白话就是:删除所有和它有关的边)3.重复上述两步,直至所有顶点输出,或者当前图中不存在无前驱的顶点为止,后者代表我们的有向图是有环的,因此,也可以通过拓扑排序来判断一个图是否有环。
五、实验结果一个有向无环图,输入6 81 21 31 43 23 54 56 46 5六、操作说明需要对有向无环图分解,顶点个数,边条数,每条边的起点终点编号,然后再输入。
七、附录:代码bool Graph_DG::topological_sort() {cout << "图的拓扑序列为:" << endl;//栈s用于保存栈为空的顶点下标stack s;int i;ArcNode * temp;//计算每个顶点的入度,保存在indgree数组中for (i = 0; i != this->vexnum; i++) {temp = this->arc[i].firstarc;while (temp) {++this->indegree[temp->adjvex];temp = temp->next;}}//把入度为0的顶点入栈for (i = 0; i != this->vexnum; i++) {if (!indegree[i]) {s.push(i);}}//count用于计算输出的顶点个数int count=0;while (!s.empty()) {//如果栈为空,则结束循环i = s.top();s.pop();//保存栈顶元素,并且栈顶元素出栈cout << this->arc[i].data<<" ";//输出拓扑序列temp = this->arc[i].firstarc;while (temp) {if (!(--this->indegree[temp->adjvex])) {//如果入度减少到为0,则入栈s.push(temp->adjvex);}temp = temp->next;}++count;}if (count == this->vexnum) {cout << endl;return true;}cout << "此图有环,无拓扑序列" << endl; return false;//说明这个图有环}成绩指导教师日期注:请用A4纸书写,不够另附纸。
求拓扑排序序列课程设计

求拓扑排序序列课程设计一、教学目标本节课的教学目标是让学生掌握拓扑排序序列的概念、性质和求解方法,能够运用拓扑排序解决实际问题。
具体分为以下三个部分:1.知识目标:学生能够理解拓扑排序的定义,了解拓扑排序的性质和应用场景,掌握拓扑排序的求解方法。
2.技能目标:学生能够运用拓扑排序解决实际问题,如任务调度、项目规划等,提高问题解决的效率。
3.情感态度价值观目标:培养学生对计算机科学和图论的兴趣,培养学生的逻辑思维和创新能力。
二、教学内容本节课的教学内容主要包括以下三个方面:1.拓扑排序的定义和性质:介绍拓扑排序的定义,解释拓扑排序的性质,如无环性、唯一性等。
2.拓扑排序的求解方法:讲解拓扑排序的求解方法,如DFS、BFS等,并通过实例进行演示。
3.拓扑排序的应用:介绍拓扑排序在实际问题中的应用,如任务调度、项目规划等,并通过实例进行讲解。
三、教学方法为了提高学生的学习兴趣和主动性,本节课将采用以下教学方法:1.讲授法:讲解拓扑排序的定义、性质和求解方法,为学生提供系统的知识结构。
2.案例分析法:通过分析实际问题,让学生了解拓扑排序的应用,提高学生的解决问题的能力。
3.实验法:让学生动手实践,求解实际问题,培养学生的实际操作能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:为学生提供系统的知识结构,方便学生课后复习。
2.多媒体资料:通过动画、图片等形式,直观地展示拓扑排序的概念和性质,提高学生的学习兴趣。
3.实验设备:为学生提供实际操作的机会,培养学生的实际操作能力。
五、教学评估本节课的评估方式包括以下几个方面:1.平时表现:通过观察学生在课堂上的参与程度、提问回答等情况,评估学生的学习态度和理解程度。
2.作业:布置相关的拓扑排序题目,评估学生对拓扑排序概念和求解方法的理解和应用能力。
3.考试:设计考试题目,全面考察学生对拓扑排序的定义、性质、求解方法和应用的掌握程度。
数据结构拓扑排序实验报告

数据结构拓扑排序实验报告一、实验目的本次实验的主要目的是深入理解和掌握数据结构中的拓扑排序算法,并通过实际编程实现来验证其有效性和应用场景。
拓扑排序在解决有向无环图(DAG)中的依赖关系问题上具有重要作用,例如任务调度、工程流程规划等。
二、实验环境本次实验使用的编程语言为 Python,开发环境为 PyCharm。
Python具有简洁易懂的语法和丰富的库函数,能够方便地实现拓扑排序算法。
三、实验原理拓扑排序是对有向无环图的顶点进行排序,使得对于图中的每条有向边(u, v),顶点 u 都在顶点 v 之前。
其基本思想是选择一个入度为0 的顶点,将其输出,并删除与其相关的边,从而更新其他顶点的入度,重复这个过程直到图中所有顶点都被输出。
实现拓扑排序的常见方法有两种:基于深度优先搜索(DFS)和基于广度优先搜索(BFS)。
四、实验步骤1、构建有向无环图的数据结构我们使用邻接表来表示有向图,其中每个顶点对应一个列表,存储其指向的顶点。
2、计算顶点的入度遍历邻接表,统计每个顶点的入度。
3、执行拓扑排序基于 BFS 的方法:创建一个队列,将入度为 0 的顶点入队。
然后不断取出队首顶点,输出,并更新与其相邻顶点的入度。
若有新的入度为 0 的顶点,则入队。
基于 DFS 的方法:使用递归函数,从一个未访问的顶点开始,访问其相邻顶点,并在回溯时输出顶点。
4、输出排序结果五、实验代码以下是基于 BFS 实现拓扑排序的 Python 代码示例:```pythonfrom collections import dequeclass Graph:def __init__(self, vertices):selfvertices = verticesselfadjacency_list = for _ in range(vertices)selfindegree = 0 verticesdef add_edge(self, source, destination):selfadjacency_listsourceappend(destination) selfindegreedestination += 1def topological_sort_bfs(self):queue = deque()for vertex in range(selfvertices):if selfindegreevertex == 0:queueappend(vertex)sorted_order =while queue:current_vertex = queuepopleft()sorted_orderappend(current_vertex)for adjacent_vertex in selfadjacency_listcurrent_vertex: selfindegreeadjacent_vertex = 1if selfindegreeadjacent_vertex == 0: queueappend(adjacent_vertex)if len(sorted_order)!= selfvertices:print("Graph contains a cycle Topological sort is not possible")else:print("Topological Sort:", sorted_order)测试示例g = Graph(6)gadd_edge(5, 2)gadd_edge(5, 0)gadd_edge(4, 0)gadd_edge(4, 1)gadd_edge(2, 3)gadd_edge(3, 1)gtopological_sort_bfs()```以下是基于 DFS 实现拓扑排序的 Python 代码示例:```pythonclass Graph:def __init__(self, vertices):selfvertices = verticesselfadjacency_list = for _ in range(vertices) selfvisited = False verticesselfstack =def add_edge(self, source, destination):selfadjacency_listsourceappend(destination) def topological_sort_dfs(self, vertex):selfvisitedvertex = Truefor adjacent_vertex in selfadjacency_listvertex: if not selfvisitedadjacent_vertex: selftopological_sort_dfs(adjacent_vertex) selfstackappend(vertex)def perform_topological_sort(self):for vertex in range(selfvertices):if not selfvisitedvertex:selftopological_sort_dfs(vertex)print("Topological Sort:", selfstack::-1)测试示例g = Graph(6)gadd_edge(5, 2)gadd_edge(5, 0)gadd_edge(4, 0)gadd_edge(4, 1)gadd_edge(2, 3)gadd_edge(3, 1)gperform_topological_sort()```六、实验结果分析1、基于 BFS 的方法对于上述测试示例,输出的拓扑排序结果为 4, 5, 0, 2, 3, 1,符合预期。
课程设计拓扑排序摘要

课程设计拓扑排序摘要一、教学目标本课程的教学目标是使学生掌握拓扑排序的基本概念和方法,能够运用拓扑排序解决实际问题。
具体分为以下三个部分:1.知识目标:学生需要理解拓扑排序的定义、特点和应用场景,掌握拓扑排序算法的实现和优化。
2.技能目标:学生能够运用拓扑排序算法解决基本的图论问题,如任务调度、课程安排等。
3.情感态度价值观目标:通过学习拓扑排序,学生能够培养逻辑思维能力、问题解决能力和创新意识,提高对计算机科学和图论的兴趣。
二、教学内容本课程的教学内容主要包括拓扑排序的定义和性质、拓扑排序算法的实现和优化、拓扑排序的应用场景。
具体安排如下:1.第一章:拓扑排序的定义和性质,介绍拓扑排序的基本概念和特点,分析拓扑排序的性质和限制。
2.第二章:拓扑排序算法的实现和优化,讲解常见的拓扑排序算法,如Kahn算法和Dijkstra算法,探讨算法的效率和优化方法。
3.第三章:拓扑排序的应用场景,介绍拓扑排序在任务调度、课程安排等实际问题中的应用,并通过案例分析让学生掌握拓扑排序的运用。
三、教学方法为了激发学生的学习兴趣和主动性,本课程将采用多种教学方法相结合的方式进行教学。
具体包括:1.讲授法:通过讲解拓扑排序的基本概念、算法和应用,使学生掌握拓扑排序的理论基础。
2.案例分析法:通过分析实际问题案例,让学生了解拓扑排序在实际中的应用和解决问题的方式。
3.实验法:安排课后实验,让学生动手实现拓扑排序算法,培养学生的实际操作能力和问题解决能力。
四、教学资源为了支持教学内容和教学方法的实施,丰富学生的学习体验,我们将准备以下教学资源:1.教材:选择一本关于图论和拓扑排序的经典教材,作为学生学习的基础资料。
2.参考书:提供一些相关领域的参考书籍,供学生深入学习和拓展知识。
3.多媒体资料:制作PPT、教学视频等多媒体资料,帮助学生更好地理解和掌握拓扑排序的知识。
4.实验设备:准备计算机实验室,让学生能够进行课后实验和实践操作。
拓扑排序课程设计报告

沈阳航空航天大学课程设计报告课程设计名称:数据结构课程设计课程设计题目:拓扑排序算法院(系):计算机学院专业:计算机科学与技术(嵌入式系统方向)班级:14010105班学号:2011040101221姓名:王芃然指导教师:丁一军目录1 课程设计介绍 (1)1.1课程设计内容 (1)1.2课程设计要求 (1)2 课程设计原理 (2)2.1课设题目粗略分析 (2)2.2原理图介绍 (2)2.2.1 功能模块图 (2)2.2.2 流程图分析 (3)3 数据结构分析 (7)3.1存储结构 (7)3.2算法描述 (7)4 调试与分析 (12)4.1调试过程 (12)4.2程序执行过程 (12)参考文献 (14)附录(关键部分程序清单) (15)1 课程设计介绍1.1 课程设计内容由某个集合上的一个偏序得到该集合上的一个全序,这个操作称之为拓扑排序。
若在图一的有向图上人为的加一个表示V2<=V3的弧(“<=”表示V2领先于V3)则图一表示的亦为全序且这个全序称为拓扑有序,而由偏序定义得到拓扑有序的操作便是拓扑排序。
在AOV网中为了更好地完成工程,必须满足活动之间先后关系,需要将各活动排一个先后次序即为拓扑排序。
编写算法建立有向无环图,主要功能如下:1.能够求解该有向无环图的拓扑排序并输出出来;2.拓扑排序应该能处理出现环的情况;3.顶点信息要有几种情况可以选择。
1.2 课程设计要求1.输出拓扑排序数据外,还要输出邻接表数据;2.参考相应的资料,独立完成课程设计任务;3.交规范课程设计报告和软件代码。
2 课程设计原理2.1 课设题目粗略分析本课设题目要求编写算法能够建立有向无环图,有向无环图,顾名思义,即一个无环的有向图,是一类较有向图更一般的特殊有向图。
其功能要求及个人在写程序时对该功能的实现作如下分析:1. 将图以合适的方式存储起来。
图有多种存储方式,其中最常用的存储方式有图的邻接矩阵和邻接表。
拓扑排序实习报告

}
void BianLi(ALGraph g,int n) //通过已建立的邻接表来遍历图
{
int i;
Vertex *p;
printf("遍历图的结果如下:\n");
for(i=1;i<=n;i++)
{
printf("%d=>",i);//邻接表中的一个结点
p=g.vertices[i].link;//邻接表中一个结点的第一个邻接点
while(p!=NULL)//一个顶点的全部邻接点
{
if(p->next!=NULL)
printf("%d-->",p->adjvex);
else
printf("%d",p->adjvex);
p=p->next;//下一个邻接点
}
printf("^\n");//结束符号
}
}
void TuoPuPaiXu(ALGraph g,int n) //输出拓扑排序的结果
利用DFS求拓扑序列的抽象算法可描述为:
void DFSTopSort(G,i,T){
//在DisTraverse中调用此算法,i是搜索的出发点,T是栈
int j;
visited[i]=TRUE;//访问i
for(所有i的邻接点j)//即<i,j>∈E(G)
if(!visited[j])
DFSTopSort(G,j,T);
④一个DAG可能有多个拓扑序列。
【例】对图G9进行拓扑排序,至少可得到如下的两个(实际远不止两个)拓扑序列:C0,C1,C2,C4,C3,C5,C7,
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
拓扑排序一问题描述本次课程设计题目是:编写函数实现图的拓扑排序二概要设计1.算法中用到的所有各种数据类型的定义在该程序中用邻接表作为图的存储结构。
首先,定义表结点和头结点的结构类型,然后定义图的结构类型。
创建图用邻接表存储的函数,其中根据要求输入图的顶点和边数,并根据要求设定每条边的起始位置,构建邻接表依次将顶点插入到邻接表中。
拓扑排序的函数在该函数中首先要对各顶点求入度,其中要用到求入度的函数,为了避免重复检测入度为零的顶点,设置一个辅助栈,因此要定义顺序栈类型,以及栈的函数:入栈,出栈,判断栈是否为空。
2.各程序模块之间的层次调用关系第一部分,void CreatGraph(ALGraph *G)函数构建图,用邻接表存储。
这个函数没有调用函数。
第二部分,void TopologicalSort(ALGraph *G)输出拓扑排序函数,这个函数首先调用FindInDegree(G,indegree)对各顶点求入度indegree[0……vernum-1];然后设置了一个辅助栈,调用InitStack(&S)初始化栈,在调用Push(&S,i)入度为0者进栈,while(!StackEmpty(&S))栈不为空时,调用Pop(&sS,&n)输出栈中顶点并将以该顶点为起点的边删除,入度indegree[k]--,当输出某一入度为0的顶点时,便将它从栈中删除。
第三部分,主函数,先后调用void CreatGraph(ALGraph *G)函数构建图、void TopologicalSort(ALGraph *G)函数输出拓扑排序实现整个程序。
3.设计的主程序流程三详细设计1.实现概要设计中定义的所有数据类型#include<stdio.h>#include<stdlib.h>#include <malloc.h>#define MAX_VEXTEX_NUM 20 //*定义点最大的数值为顶30*// #define M 20#define STACK_INIT_SIZE 100 //*定义点最大的数值为顶30*//#define STACKINCREMENT 10 //*定义栈的增量为10*//#define OK 1#define ERROR 0typedef char ElemType; //*定义栈顶元素类型*//typedef struct ArcNode{int adjvex; //该弧所指向的顶点的位置//struct ArcNode *nextarc; //指向下一条弧的指针//}ArcNode; //*表结点*//typedef struct VNode{char data; //顶点信息ArcNode *firstarc; //指向第一条依附该顶点的弧的指针// }VNode,AdjList[MAX_VEXTEX_NUM];typedef struct{AdjList vertices;int vexnum, arcnum; //图的当前顶点数和弧数//}ALGraph;typedef struct //构建栈//{ElemType *base;//*在栈构造之前的指针*//ElemType *top;//*栈顶指针*//int stacksize;//*定义所分配的存储空间*//}SqStack;//*顺序栈*//2.算法和各模块的代码程序中各函数算法思想如下:○1void InitStack(SqStack *S)初始化栈将栈的空间设为STACK-INIT-SIZE。
○2int Pop(SqStack *S,ElemType *e)出栈操作,若站不空,删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR。
○3void Push(SqStack *S,ElemType e)进栈操作,插入元素e为新的栈顶元素。
○4int StackEmpty(SqStack *S)判断栈是否为空,语句if (S->top=S->base )判断,若栈不为空,则删除S的栈顶元素,并返回OK;否则返回ERROR。
○5void CreatGraph (ALGraph *G)构建图,用邻接表存储,首先定义邻接表指针变量,输入顶点数和弧数,初始化邻接表,将表头向量域置空,输入存在弧的点集合,当输入顶点值超出输入值的范围就会出错,否则依次插入进邻接表,最后输出建立好的邻接表。
○6void FindInDegree(ALGrap G, int indegreee[])求入度操作,设一个存放各顶点入度的数组indegreee[],然后indegreee[i]=0赋初值,for循环indegreee[]++,存储入度数。
○7void TopologicalISort(ALGraph G)输出拓扑排序函数。
其思路是若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)。
四调试分析对如下有向无环图进行拓扑排序。
输入:结果如下:五心得体会在进行拓扑排序的课程设计中,更好的认识了拓扑排序。
在设计中,我们遇到了程序正确,却对某些无向图无法进行拓扑排序的问题。
多次对程序进行修改后,才可以进行拓扑排序。
问题出在调用函数的错误理解,模块之间的联系模糊不清,在同学的帮助和自己的努力思考下,我最终把这些问题一一解决,并把教训牢记在心,努力使自己得到更大的收获和提高。
因为在理论学习中没有好好的掌握,现在要独立完成一个较复杂的程序编写,确实有困难。
今后我必需扎实基础理论、认真思考,而且要践行我的承诺,一步一个脚印的走下去,才可以达到我们预期的彼岸!六程序清单#include<stdio.h>#include<stdlib.h>#include <malloc.h>#define MAX_VEXTEX_NUM 20 //*定义点最大的数值为顶30*// #define M 20#define STACK_INIT_SIZE 100 //*定义点最大的数值为顶30*//#define STACKINCREMENT 10 //*定义栈的增量为10*//#define OK 1#define ERROR 0typedef char ElemType; //*定义栈顶元素类型*//typedef struct ArcNode{int adjvex; //*该弧所指向的顶点的位置*//struct ArcNode *nextarc; //*指向下一条弧的指针*//}ArcNode; //*表结点*//typedef struct VNode{char data; //*顶点信息*//ArcNode *firstarc; //*指向第一条依附该顶点的弧的指针*// }VNode,AdjList[MAX_VEXTEX_NUM];typedef struct{AdjList vertices;int vexnum, arcnum; //*图的当前顶点数和弧数*//}ALGraph;typedef struct //*构建栈*//{ElemType *base;//*在栈构造之前的指针*//ElemType *top;//*栈顶指针*//int stacksize;//*定义所分配的存储空间*//}SqStack;//*顺序栈*//void InitStack(SqStack *); //*函数声明*//int Pop(SqStack *, ElemType &);void Push(SqStack *,ElemType );int StackEmpty(SqStack *);void CreatGraph(ALGraph *);void FindInDegree(ALGraph , int * );void TopologicalSort(ALGraph );void InitStack(SqStack *S) //*初始化栈*//{S->base=(ElemType *)malloc(STACK_INIT_SIZE*sizeof(ElemType)); //*申请新的结点并由s->base指向*//if(!S->base) //*存储分配失败*//{printf("memory allocation failed, goodbye");exit(1);}S->top=S->base; //*空栈之前的指针赋给头指针*//S->stacksize=STACK_INIT_SIZE; //*栈的空间设为Stack_init_size*//}int Pop(SqStack *S,ElemType &e) //*出栈操作*//{if(S->top==S->base) //*栈空返回OK*//{return ERROR; //*删除S的栈顶元素*//}e=*--S->top;return 0;}void Push(SqStack *S,ElemType e) //*进栈操作,插入元素e为新的栈顶元素*//{if(S->top-S->base>=S->stacksize){S->base=(ElemType*)realloc(S->base,(S->stacksize+STACKINCREMENT)*sizeof( ElemType));if(!S->base) //*存储分配失败*//{printf("memory allocation failed, goodbye");exit(1);}S->top = S->base+S->stacksize;S->stacksize+=STACKINCREMENT;}*S->top++=e;}int StackEmpty(SqStack *S) //*判断栈是否为空*//{if(S->top==S->base) //*栈不为空,则删除S的栈顶元素,并返回OK;否则返回*// return OK;elsereturn ERROR;}int locatevex(ALGraph G,char u) //*若G图中存在顶点u,则返回该顶点在图中的位置;否则返回-2.*//{int i;for(i=0;i<G.vexnum;i++){if(G.vertices[i].data==u){return i;exit(OK);}}return -2;}void CreatGraph(ALGraph *G) //*构建图建立有向的图的邻接表*// {int i,k;printf("输入结点的个数和弧数(用空格隔开):\n");scanf("%d %d",&G->vexnum,&G->arcnum);printf("输入顶点的值(用空格隔开):\n");for(i=0;i<G->vexnum;i++) //*构造表头向量*//{scanf("%s",&G->vertices[i].data); //*输入顶点的值*//G->vertices[i].firstarc=NULL; //*初始化指针*//}for(k=0;k<G->arcnum;k++){char v1,v2;int i,j;loop: printf("输入一条弧的起点和终点(用空格隔开):\n");scanf("%s %s",&v1,&v2);i=locatevex(*G,v1); //*确定v1,v2在G中的位置*// j=locatevex(*G,v2);if(i==-2||j==-2){printf("输入有误!");break; goto loop;}ArcNode *p;p = (ArcNode*)malloc(sizeof(ArcNode));if (p == NULL){printf("memory allocation failed,goodbey");exit(1);}p->adjvex=j; //*对弧结点赋值*//p->nextarc=G->vertices[i].firstarc;G->vertices[i].firstarc=p; //*插入到表头向量后面*//}ArcNode *p; //*定义邻接表指针变量*//p = (ArcNode*)malloc(sizeof(ArcNode));if (p == NULL){printf("memory allocation failed,goodbey");exit(1);}printf("建立的邻接表为:\n"); //*输出建立好的邻接表*// for(i = 0; i < G->vexnum; i++){printf("%c",G->vertices[i].data);for(p = G->vertices[i].firstarc; p; p = p->nextarc)printf("%3d",p->adjvex);printf("\n");}}void FindInDegree(ALGraph G, int indegree[]) //*求入度操作*//{int i;for (i = 0; i < G.vexnum; i++)indegree[i] = 0;for (i = 0; i < G.vexnum; i++){while (G.vertices[i].firstarc){indegree[G.vertices[i].firstarc->adjvex]++;G.vertices[i].firstarc = G.vertices[i].firstarc->nextarc;}}}void TopologicalSort(ALGraph G) //*输出拓扑排序函数。