拓扑排序课程设计报告

合集下载

计算机网络拓扑实验报告

计算机网络拓扑实验报告

校园网络设计方案前言.....................................................................一、需求分析 (1)1.1 实施背景 (1)1.2 网络应用需求 (2)1.3 网络性能需求 (2)1.4 信息点统计 (3)二、网络总体设计 (3)2.1 网络构架分析 (3)2.2 设计思路 (3)2.3 校园网的设计原则 (4)2.4 网络三层结构设计 (4)2.4.1 核心层设备选型 (5)2.4.2 汇聚层设备选型 (6)2.4.3 接入层设备选型 (7)2.4.4 防火墙设备选型 (9)2.4.5 服务器设备选型 (10)2.5 接入Internet设计 (16)2.6 VLAN的划分及IP地址的分配 (18)2.6.1 Vlan号(ID)的分配规划 (18)2.6.2 具体VLAN详细表 (18)2.7 IP地址的分配原则 (19)2.8 物理/链路层配置原则 (21)第3章网络安全与管理 (21)3.1 网络安全 (21)3.1.1 威胁网络安全因素分析 (22)3.1.2 网络安全防范措施 (22)3.2 网络管理 (23)3.2.1 网络管理的内容 (23)3.2.2 网络管理的手段 (23)3.3 网络安全策略配置 (24)3.3.1安全接入和配置 (24)3.3.2 拒绝服务的防止............................................3.3.3 访问控制 (25)3.4 电源系统 (25)第四章代码设计前言科学技术的发展日新月异,九十年代,在计算机技术和通信技术结合下,网络技术得到了飞速的发展。

如今,不仅计算机已经和网络紧密结合,整个社会都不可能脱离网络而存在。

网络技术已经成为现代信息技术的主流,人们对网络的认识也随着网络应用的逐渐普及而迅速改变。

在不久的将来,网络必将成为和电话一样通用的工具,成为人们生活、工作、学习中必不可少的一部分。

拓扑结构过程实验报告

拓扑结构过程实验报告

拓扑结构过程实验报告实验目的本实验旨在通过实际操作,探究拓扑结构的基本概念和分类,并通过构建不同拓扑结构的网络,熟悉拓扑结构的配置过程和性能特点。

实验设备- 路由器:1台- 交换机:2台- 手提电脑:3台- 网线:若干根实验步骤与结果步骤一:创建星型拓扑结构1. 将一台交换机连接到路由器的一个端口上,另一台交换机连接到该交换机的一个端口上,形成星型拓扑结构。

2. 将每台手提电脑连接到交换机的一个端口上。

3. 在路由器中进行网络地址的配置。

4. 通过手提电脑之间的网络互通测试,确认星型拓扑结构搭建成功。

结果:星型拓扑结构搭建成功,手提电脑之间可以互相通信。

步骤二:创建总线型拓扑结构1. 将一台交换机连接到路由器的一个端口上,另一台交换机通过一个网线连接到该交换机的另一个端口上,形成总线型拓扑结构。

2. 将每台手提电脑连接到交换机的一个端口上。

3. 在路由器中进行网络地址的配置。

4. 通过手提电脑之间的网络互通测试,确认总线型拓扑结构搭建成功。

结果:总线型拓扑结构搭建成功,手提电脑之间可以互相通信。

步骤三:创建环型拓扑结构1. 将一台交换机连接到路由器的一个端口上,将另一台交换机通过一个网线连接到该交换机的一个端口上,形成环型拓扑结构。

2. 通过一根网线将第一个交换机的一个端口连接到第二个交换机的另一个端口上,形成环型连接。

3. 将每台手提电脑连接到交换机的一个端口上。

4. 在路由器中进行网络地址的配置。

5. 通过手提电脑之间的网络互通测试,确认环型拓扑结构搭建成功。

结果:环型拓扑结构搭建成功,手提电脑之间可以互相通信。

实验总结本次实验通过构建星型、总线型和环型拓扑结构的网络,旨在了解和熟悉不同拓扑结构的配置过程和性能特点。

实验结果表明,无论采用哪种拓扑结构,网络设备之间的互通性都能得到有效的保证。

星型拓扑结构适用于小型网络,具有易于配置和管理的优点,但同时也存在单点故障的风险。

总线型拓扑结构适用于中型网络,具有成本低、易于扩展的特点,但也存在网络冲突的问题。

网络拓扑实验报告

网络拓扑实验报告

网络拓扑实验报告一、实验目的本实验旨在通过搭建不同的网络拓扑结构,探究各种网络拓扑在数据传输、网络拥塞、安全性等方面的表现,为网络通信和管理提供参考依据。

二、实验环境1. 硬件环境:使用多台计算机设备、交换机、路由器等网络设备。

2. 软件环境:使用网络模拟软件或者真实网络环境进行搭建和测试。

三、实验内容1. 星型网络拓扑:通过一个中心节点连接多个外围节点的方式搭建星型拓扑,观察数据传输的效率和可靠性。

2. 总线型网络拓扑:将所有设备连接在同一根传输线上形成总线型拓扑,测试网络拥塞和数据冲突情况。

3. 环状网络拓扑:构建一个环形结构的网络,研究环状拓扑在数据传输时可能出现的环路和数据包循环现象。

4. 树型网络拓扑:设计一颗分层结构的网络,考察树型拓扑在大规模数据传输下的性能表现。

5. 混合型网络拓扑:将不同类型的网络拓扑结合起来形成复杂结构,探究混合型拓扑的数据传输、安全性等特点。

四、实验结果与分析1. 星型网络拓扑:星型拓扑中,由于所有节点都与中心节点相连接,数据传输效率高,但一旦中心节点故障整个网络会崩溃。

2. 总线型网络拓扑:总线型拓扑中,数据包冲突可能会导致丢包和延迟,网络拥塞时整个网络性能明显下降。

3. 环状网络拓扑:环状拓扑中,可能出现环路导致数据包循环,使得网络传输变得复杂且不可靠。

4. 树型网络拓扑:树型拓扑中,数据传输顺畅且易于管理,但是网络中出现瓶颈节点时整体性能会受到影响。

5. 混合型网络拓扑:混合型拓扑结合了多种拓扑结构的优点,但也增加了网络复杂度和管理难度。

五、实验结论不同的网络拓扑结构适用于不同的应用场景,需要根据实际需求选择适合的网络结构。

在构建和管理网络时,应考虑网络拓扑对数据传输、安全性、可扩展性等方面的影响,以保障网络通信的稳定和高效运行。

六、参考文献- 《计算机网络》- 《网络拓扑结构研究与应用》- 《网络管理与安全》以上为网络拓扑实验报告,如有不足之处,欢迎指正。

网络拓扑实验报告

网络拓扑实验报告

《计算机网络》网络拓扑结构学院名称:计算机与信息工程学院专业名称:计算机科学与技术年级班级:姓名:学号:计算机与信息技术学院综合性、设计性实验报告课程名称计算机网络指导教师学号姓名实验地点计科楼414实验时间2013.12.09项目名称网络拓扑结构实验类型设计性一、实验目的通过对网络设备的连通和对拓扑的分析,加深对常见典型局域网拓扑的理解;通过路由建立起网络之间的连接,熟悉交换机、路由器的基本操作命令,了解网络路由的设计与配置。

二、实验仪器或设备二层交换机五台、三层交换机一台,路由器两台,学生实验主机五台及一台服务器。

三、总体设计(设计原理、设计方案及流程等)假设某校园网通过1台三层交换机连到校园网出口路由器,路由器再和校园外的一台路由器相接,现做适当配置,实现校园网内部主机与校园网外部主机的相互通信。

实验拓扑图:四、实验步骤(包括主要步骤、代码分析等)三层交换机上配置vlan及IP地址,进行端口划分:Switch(config)#vlan 2exitvlan 3exitvlan 4exitvlan 5exitSwitch(config)#int vlan 2ip add 210.42.242.1 255.255.255.0 no shexitint vlan 3ip add 210.42.243.1 255.255.255.0 no shexitint vlan 4ip add 210.42.244.1 255.255.255.0 no shexitint (f0/2)sw mod accsw acc vlan 2exitint (f0/3)sw mod accsw acc vlan 3exitint range(f0/4-5)sw mod accsw acc vlan 4exitint (f0/1)sw mod accsw acc vlan 5exitint vlan 5ip add 192.168.1.2 255.255.255.0 no shexit配置DHCP:Switch(config)#ip dhcp pool jinghua2Switch(dhcp-config)#network 210.42.242.0 255.255.255.0 Switch(dhcp-config)#default-router 210.42.242.1Switch(dhcp-config)#dns-server 192.168.1.2Switch(dhcp-config)#exitSwitch(config)#ip dhcp pool jinghua3Switch(dhcp-config)#net 210.42.243.0 255.255.255.0 Switch(dhcp-config)#default-router 210.42.243.1Switch(dhcp-config)#dns-server 192.168.1.2Switch(dhcp-config)#exitSwitch(config)#ip dhcp pool jinghua4Switch(dhcp-config)#network 210.42.244.0 255.255.255.0 Switch(dhcp-config)#default-router 210.42.244.1Switch(dhcp-config)#dns-server 192.168.1.2Switch(dhcp-config)#exit各个设备上的IP地址:PC4: IP:50.55.55.2服务器Server0 IP:210.42.241.1路由器Ri: f0/0 IP:192.168.1.1f0/1 IP:210.42.241.100s1/0 IP:210.42.240.1路由器Rj: f0/0 IP:50.55.55.1s1/0 IP:210.42.240.2Router(config)#hostname RiRi(config)#int f0/0ip add 192.168.1.1 255.255.255.0no shexitint f0/1ip add 210.42.241.100 255.255.255.0no shexitint s1/0ip add 210.42.240.1 255.255.255.0clock rate 64000 (DEC)no shexit(路由器Rj的配置方法如同Ri,不再赘述)在三层交换机上配置路由协议:Switch(config)#router ripversion 2network 192.168.1.0net 210.42.242.0net 210.42.243.0net 210.42.244.0exit在路由器Ri上配置路由协议:Ri(config)#router ripversion 2network 192.168.1.0net 210.42.240.0net 210.42.241.0//(net 50.0.0.0)exit(路由器Rj的配置方法如同Ri,不再赘述)PC0: 点击DHCP自动获得以下各个值IP:210.42.242.2 255.255.255.0210.42.242.1 192.168.1.2五、结果分析与总结教师签名:2013年月日(注:文档可能无法思考全面,请浏览后下载,供参考。

教案06(拓扑设计实验)

教案06(拓扑设计实验)
教案06
实验:网络项目工程拓扑设计
实验目的:能够依据项目需求分析进行网络拓扑设计。能够使用VISIO绘制网络拓扑图。
某中学网络设计方案需求分析如下:
信息点需求主要是指整个校园可以提供接入网络的信息点的个数,当然还需要考虑3%到5%的冗余。这一步需要进行比较精确的计算,在本项目中可这样进行计算。
·行政楼:6层、每层8个房间,每个房间3个信息点。
·教师办公楼
4层,每层12个房间。
·实验实训楼:5层,每层8房间,第五层为计算机实验机房。
教学楼1:4层,每层12个房间。
教学楼2:4层,每层8个房间。
·图书馆:5层,每层10个房间。另第3层建8个电子阅览室。
广域网需求:校园网所有信息点均可接入Internet。
局域网需求:行政楼、教师楼、图书馆、教学楼、实验实训楼可互联互通,实验实训楼机房不可和校园网其他区域互通。
·设备管理
设备的配置、更新、升级及维修等。
·服务管理
服务器的配置、升级、更新,系统的维护、调试等。
附图:校园平面图
请依据此需求描述设计网络拓扑。
·授权访问
对于有敏感数据的区域的访问,要进行授权访问设置,未授权的访问要能坚决的拒绝。
·数据保护
敏感数据在进行传输时,为防止数据泄露,可使用加密方式来保护数据。在数据遭遇灾难性损失时的恢复。
·病毒防护
网络对病毒的抵御能力,对关键位置的保护能力。在遭遇病毒入侵时,要能及时发现,并做出相应处理。
·有限的入侵检测
学生的好奇心是无限的,要保证网络正常的运行,对于来自校园网内部的攻击要能够做出及时响应,尤其在关键位置上。
·冗余
在这里主要是链路冗余,在网络某一链路出现问题时要有冗余链路能及时工作,以替代损坏的链路。

输出DAG的所有拓扑排序序列

输出DAG的所有拓扑排序序列

输出DAG的所有拓扑排序序列1.课程设计内容与要求用字符文件提供数据建立DAG(有向无环图)合适的存储结构。

编写程序,输出所有可能的拓扑排序序列。

要求输出的拓扑排序结果用顶点序号或字母表示。

输出结果需存于字符文件。

输出结果中应显示全部拓扑排序序列的数目。

如果DAG存在环(即拓扑排序失败),输出结果中应显示拓扑排序序列的数目为0。

课程设计报告要求给出详细算法描述,在结论部分应分析算法的时间复杂度和空间复杂度,并给出分析的结果。

2.程序设计报告2.1总体设计首先创建有向图邻接表,从文件中读取邻接表的顶点和边数,然后再读取临接矩阵的边,每读取一条边,都将其插入到邻接矩阵中。

采用递归调用判断该邻接矩阵是否为有向无环图(DAG) ,如果是则找出邻接矩阵中所有的拓扑排序,并打印到屏幕上。

若含有环,则不打印结果。

2.2详细数据结构设计采用结构体存储邻接表的表结点,该结构包含两个整型数据域和两个该结构体的指针域。

其结构如下:typedef struct node{int i, j;//弧的端点下标struct node *hlink;struct node *vlink;} OLANode;采用结构体存储邻接表的头结点,该结构包含一个三个整型属于和两个表结点类型的指针域,其结构如下:typedef struct{ElemTp data;//顶点数据(可选)InfoTp info;//顶点信息(可选)int i;//顶点下标OLANode *firstin;OLANode *firstout;} OLHNode;采用结构体存储邻接表,该结构包含一个头结点数组,和两个整型数据域,其结构如下:typedef struct{OLHNode h[MAX_N]; //头结点形成数组int n, e; //n:实际顶点数; e:边或弧的数目//Graphkind kind; //图类型(可选)} OLGraph;采用队列存储入度为零的表结点,队列的结构体包含一个整型数组,三个整型数据域,其结构如下:typedef struct{ElemType *elem;int n; //队列容量int f; //队头指针int r; //队尾指针}SqQueue;2.2详细算法设计该程序的核心算法是拓扑排序,拓扑排序的算法如下:(1)、采用邻接表作为有向图的存储结构。

数据结构课程设计环拓扑排序和纸牌游戏 (1)

数据结构课程设计环拓扑排序和纸牌游戏 (1)

目录课题一 joseph环 41.1 问题的提出1.1.问题的提出41.2 概要设计2.1算法思想51.3流程图根据算法思想,画程序流程图如下:661.4 源代码1.3.详细设计 7 输入m 、nm>0且n>0的整数建立含n 个结点的链表且用head 指向第一个元素,结点数据域包含password 、No 、以及指向下一结点的指head=>pn ≥2(m%n)==0?n:m%n=>1=>i i<mp →next=>pi++输出p →Nop →password=>m删除p 所指向结点n--输出p →No结束开始1.5 结果与分析.4 测试及性能分析10课题二拓扑排序 112.1 问题的提出2.1 问题的提出112. 2 概要设计112.3 流程图2.根据算法思想,画流程图如下:1212 开始设辅助数组indegree 记录图的各顶点的入度值,并将indegree 数组各变量赋初值。

输入图的顶点数、边数建立一个栈,存储图的顶点的序号用邻接表法建图,并计算出indegree 数组中各变量值根据indegree 数组将入度为0的顶点入栈count 对输出顶点计数0=>count栈不空删除栈顶元素,赋给i count++将与第i 个顶点链接的各顶点入度减1输出第i 个顶点值 顶点入度为0 顶点序号入栈count<G.vexnum输出“拓扑排序成功” 输出“拓扑排序不成功” 结束2.4 源代码132.5 结果与分析2.4 测试及性能分析17课题三纸牌游戏 193.1 问题的提出.1 问题的提出193. 2 概要设计191.当每个号码每次遇到是某个数的倍数时,都会相应的翻一次,这样,每张牌会翻的次数就各不一样,可能很多次,也可能只有一两次,结果就只是要输出在经过各个不同次数的翻牌后,正面向上的牌都有哪几个。

举例说明一下,比如24,第一次它是2的倍数时要从正面翻到背面,当进行到3时,就又要从背面翻回来,而到4时还要在翻,同理呢,到6.8.12…它都要来回的翻。

拓扑排序的应用解决课程安排和任务调度问题

拓扑排序的应用解决课程安排和任务调度问题

拓扑排序的应用解决课程安排和任务调度问题拓扑排序是图论中的一种排序算法,通过分析有向无环图(DAG)中各个顶点之间的依赖关系,可以找到满足依赖关系的顺序。

该算法在解决课程安排和任务调度问题方面有着广泛的应用。

一、课程安排问题在学校的课程安排中,课程之间存在先后依赖关系,比如某些课程必须在先修课程完成后才能进行。

利用拓扑排序便可以解决这一问题。

以某大学为例,假设该学期有n门课程,其中一些课程存在先修关系。

首先,根据先修关系,我们可以构建一个有向图,其中每个课程对应一个顶点,而依赖关系对应的有向边。

接下来,我们可以使用拓扑排序来确定课程的学习顺序。

具体步骤如下:1. 创建一个队列,用于存储入度为0的顶点。

2. 遍历图中的所有顶点,将入度为0的顶点全部入队。

3. 当队列非空时,执行以下操作:- 出队一个顶点,输出该顶点作为当前学习的课程。

- 更新与该顶点相邻的顶点的入度,即将其入度减1。

- 若相邻顶点的入度减为0,则将其入队。

4. 若所有顶点都已输出,则拓扑排序成功;否则,存在环路,无法进行拓扑排序,即无法完成课程安排。

通过上述算法,我们可以得到一个满足课程依赖关系的学习顺序,使得学生按照该顺序完成所有课程的学习。

这种方法可以有效地解决课程安排问题,确保学生学习的合理性和顺序性。

二、任务调度问题在实际工作中,任务之间往往存在一定的依赖关系,比如某些任务必须在其他任务完成后才能开始。

利用拓扑排序可以有效解决任务调度问题。

假设我们需要完成一个项目,项目中有n个任务,其中某些任务存在依赖关系。

为了合理安排任务的执行顺序,我们可以采用拓扑排序来解决。

首先,我们可以根据任务之间的依赖关系构建一个有向图。

其中每个任务对应一个顶点,而依赖关系对应的有向边。

接下来,我们可以使用拓扑排序来确定任务的执行顺序。

具体步骤如下:1. 创建一个队列,用于存储入度为0的顶点。

2. 遍历图中的所有顶点,将入度为0的顶点全部入队。

3. 当队列非空时,执行以下操作:- 出队一个顶点,执行该顶点对应的任务。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

数据结构课程设计设计题目:有向图拓扑排序专业:信息与计算科学学号:021240616姓名:黄秋实指导教师:文军2013年11月28日数据结构课程设计----拓扑排序一需求分析1.问题描述本次课程设计题目是:用邻接表构造图然后进行拓扑排序,输出拓扑排序序列拓扑排序的基本思想为:1).从有向图中选一个无前驱的顶点输出;2).将此顶点和以它为起点的弧删除;3). 重复1),2)直到不存在无前驱的顶点;4). 若此时输出的顶点数小于有向图中的顶点数,则说明有向图中存在回路,否则输出的顶点的顺序即为一个拓扑序列。

2.拓扑排序有向图拓朴排序算法的基本步骤如下:①从图中选择一个入度为0的顶点,输出该顶点;②从图中删除该顶点及其相关联的弧,调整被删弧的弧头结点的入度(入度-1);③重复执行①、②直到所有顶点均被输出,拓朴排序完成或者图中再也没有入度为0的顶点(此种情况说明原有向图含有环)。

3基本要求(1) 输入的形式和输入值的范围;首先是输入要排序的顶点数和弧数,都为整型,中间用分隔符隔开;再输入各顶点的值,为正型,中间用分隔符隔开;然后输入各条弧的两个顶点值,先输入弧头,再输入弧尾,中间用分隔符隔开,输入的值只能是开始输入的顶点值否则系统会提示输入的值的顶点值不正确,请重新输入,只要继续输入正确的值就行。

(2) 输出的形式;首先输出建立的邻接表,然后是最终各顶点的出度数,再是拓扑排序的序列,并且每输出一个顶点,就会输出一次各顶点的入度数。

(3) 程序所能达到的功能;因为该程序是求拓扑排序,所以算法的功能就是要输出拓扑排序的序列,在一个有向图中,若用顶点表示活动,有向边就表示活动间先后顺序,那么输出的拓扑序列就表示各顶点间的关系为反映出各点的存储结构,以邻接表存储并输出各顶点的入度。

二概要设计1. 算法中用到的所有各种数据类型的定义在该程序中用邻接表作为图的存储结构。

首先,定义表结点和头结点的结构类型,然后定义图的结构类型。

创建图用邻接表存储的函数,其中根据要求输入图的顶点和边数,并根据要求设定每条边的起始位置,构建邻接表依次将顶点插入到邻接表中。

拓扑排序的函数在该函数中首先要对各顶点求入度,其中要用到求入度的函数,为了避免重复检测入度为零的顶点,设置一个辅助栈,因此要定义顺序栈类型,以及栈的函数:入栈,出栈,判断栈是否为空。

2.各程序模块之间的层次调用关系第一部分,void 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>#define MAX_VEXTEX_NUM 100#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OK 1#define M 100#define ERROR 0typedef int ElemType;typedef struct ArcNode{int adjvex;struct ArcNode *nextarc;}ArcNode;typedef struct VNode{int 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.算法和各模块的代码程序中各函数算法思想如下:2.1void InitStack(SqStack *S)初始化栈将栈的空间设为STACK-INIT-SIZE。

2.2int Pop(SqStack *S,ElemType *e)出栈操作,若站不空,删除S的栈顶元素,用e返回其值,并返回OK;否则返回ERROR。

2.3void Push(SqStack *S,ElemType e)进栈操作,插入元素e为新的栈顶元素。

2.4int StackEmpty(SqStack *S)判断栈是否为空,语句if (S->top=S->base )判断,若栈不为空,则删除S的栈顶元素,并返回OK;否则返回ERROR。

2.5void CreatGraph (ALGraph *G)构建图,用邻接表存储,首先定义邻接表指针变量,输入顶点数和弧数,初始化邻接表,将表头向量域置空,输入存在弧的点集合,当输入顶点值超出输入值的范围就会出错,否则依次插入进邻接表,最后输出建立好的邻接表。

2.6 void FindInDegree(ALGrap G, int indegreee[])求入度操作,设一个存放各顶点入度的数组indegreee[],然后indegreee[i]=0赋初值,for循环indegreee[]++,存储入度数。

2.7 void 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)。

四测试与分析对有向无环图【下图】进行拓扑排序。

输入:结果如下:五总结拓扑排序就是对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若<u,v> ∈E(G),则u在线性序列中出现在v之前。

在进行课程设计中,更好的认识了拓扑排序。

理清了各个模块之间算法之间的条理。

认识了伪代码(Pseudocode)是一种算法描述语言。

使用伪代码的目的是为了使被描述的算法可以容易地以任何一种编程语言(Pascal,C,Java,etc)实现。

因此,伪代码必须结构清晰、代码简单、可读性好,并且类似自然语言。

介于自然语言与编程语言之间。

它是一种让人便于理解的代码。

不依赖于语言的,用来表示程序执行过程,而不一定能编译运行的代码。

在数据结构讲算法的时候用的很多。

在设计中,我们遇到了程序正确,却对某些无向图无法进行拓扑排序的问题。

多次对程序进行修改后,才可以进行拓扑排序。

问题出在调用函数的错误理解,模块之间的联系模糊不清。

六附录:源程序:#include<stdio.h>#include<stdlib.h>#define MAX_VEXTEX_NUM 100#define STACK_INIT_SIZE 100#define STACKINCREMENT 10#define OK 1#define M 100#define ERROR 0typedef int ElemType;typedef struct ArcNode{int adjvex;struct ArcNode *nextarc;}ArcNode;typedef struct VNode{int 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));if(!S->base){printf("内存分配失败,请检查储存位置,再见");exit(1);}S->top=S->base;S->stacksize=STACK_INIT_SIZE;}int Pop(SqStack *S,ElemType *e){if(S->top==S->base){return ERROR;}*e=*--S->top;return 0;}void Push(SqStack *S,ElemType e){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;}int StackEmpty(SqStack *S){if(S->top==S->base)return OK;elsereturn ERROR;}void CreatGraph(ALGraph *G)int m, 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;}}void FindInDegree(ALGraph G, int indegree[]){int i;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;}}void TopologicalSort(ALGraph G){int indegree[M];int i, k, n,b,j=0;int a[20];int count = 0;ArcNode *p;SqStack S;FindInDegree(G, indegree);InitStack(&S);for ( i = 1; i <= G.vexnum; i++){if (!indegree[i])Push(&S,i);}while(!StackEmpty(&S)){Pop(&S,&n);a[j]=G.vertices[n].data;j++;count++;for (p = G.vertices[n].firstarc; p != NULL; p = p->nextarc) {k = p->adjvex;if (!(--indegree[k])){Push(&S,k);}}}printf("\n");if (count < G.vexnum){printf("该有向图有环\n");}else{printf("排序成功\n");printf("进行拓扑排序输出顺序为:");for (b=0;b<j;b++){printf("%4d",a[b]);}printf("\n");}}int main(void){ALGraph G;CreatGraph(&G);TopologicalSort(G);system("pause");return 0;}(注:可编辑下载,若有不当之处,请指正,谢谢!)。

相关文档
最新文档