一、实验名称:拓扑排序

二、实验学时:6学时

三、实验目的

1.理解拓扑排序的特性和算法;

2.通过构造图的邻接表,掌握拓扑排序算法。

四、实验内容(步骤)

1.建立邻接表存储的图;

2.对图进行拓扑排序;

3.输出拓扑排序序列。

实验源代码:

#include<iostream>
#include<cstring>
#include<cstdlib>#define MAXSIZE 10
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0using namespace std;typedef int Elemtype;
typedef struct
{Elemtype data[MAXSIZE];int top;
}SqStack;int InitStack(SqStack &S)
{S.top=-1;return OK;
}int StackEmpty(SqStack S)
{return (S.top==-1?TRUE:FALSE);
}int StackFull(SqStack S)
{return (S.top==MAXSIZE-1?TRUE:FALSE);
}int Push(SqStack &S,Elemtype e)
{if(StackFull(S))return ERROR;S.top++;S.data[S.top]=e;return OK;
}int Pop(SqStack &S,Elemtype &e)
{if(StackEmpty(S))return ERROR;e=S.data[S.top];S.top--;return OK;
}// 定义图的存储结构
typedef char VertexType[20];
typedef struct ArcNode
{int adjvex; // 该弧所指向的顶点的位置struct ArcNode *nextarc; // 指向下一条弧的指针// InfoType *info; // 该弧相关信息的指针
}ArcNode; typedef struct VNode
{VertexType data; // 顶点信息 V0ArcNode *firstarc; // 指向第一条依附该顶点的弧的指针
}VNode;typedef struct
{VNode vertexs[20];int vexnum,arcnum; // 图的当前顶点数和弧数// GraphKind kind // 图的种类标志
}ALGraph; int GetIndex(ALGraph G,char *v) // 获得顶点对应下标
{int vIndex=-1;for(int i=0;i<G.vexnum;i++){if(strcmp(G.vertexs[i].data,v)==0){vIndex=i;break; }   }if(vIndex==-1){printf("构成弧的顶点%s输入有误。\n",v);exit(0);}elsereturn vIndex;
}void CreateGraph(ALGraph &G)
{int i,k;ArcNode *p,*q,*s;VertexType vi,vj;printf("请输入有向图的顶点数和边(弧)数:");scanf("%d %d",&G.vexnum,&G.arcnum);// 创建头结点printf("请输入顶点名称:");for(i=0;i<G.vexnum;i++){scanf("%s",G.vertexs[i].data); // 结点数,可输入v0,v1,…等G.vertexs[i].firstarc=NULL; }// 尾插入法建立各结点的单链表for(k=1;k<=G.arcnum;k++){printf("请输入构成第%d条弧的顶点:",k);scanf("%s%s",vi,vj);s=new ArcNode;s->adjvex=GetIndex(G,vj);s->nextarc=NULL;p=G.vertexs[GetIndex(G,vi)].firstarc;if(p==NULL){// 第1个结点G.vertexs[GetIndex(G,vi)].firstarc=s;}else{// 找到表尾while(p){q=p;p=p->nextarc;   }q->nextarc=s;}}
}void PrinAL(ALGraph G) // 以邻接表的形式输出图
{int i;ArcNode *p;printf("\n图的邻接表为:\n");for(i=0;i<G.vexnum;i++){if(G.vertexs[i].firstarc)printf("%d:%s----",i,G.vertexs[i].data);elseprintf("%d:%s---NULL",i,G.vertexs[i].data); p=G.vertexs[i].firstarc;while(p){printf("%d",p->adjvex);p=p->nextarc;if(p)printf("--->");}printf("\n");}
}void FindInDegree(ALGraph G,int indegree[])
{int i,k;ArcNode *p;for(i=0;i<G.vexnum;i++)indegree[i]=0;for(i=0;i<G.vexnum;i++){p=G.vertexs[i].firstarc;while(p){k=p->adjvex;indegree[k]++;p=p->nextarc;}}
}void TopologicalSort(ALGraph G) // 进行拓扑排序
{ // 有向图 G 采用邻接表存储结构 int i,count,n,k; int indegree[20]; // 定义用于保存入度的数组 ArcNode *p;SqStack S;FindInDegree(G,indegree); // 求各顶点的入度存放于数组 indegree 中 InitStack(S); // 初始化栈 count=0; // 定义 count 用于记录输出的顶点数 for(i=0;i<G.vexnum;i++){if(indegree[i]==0)Push(S,i); // 将图中所有入度为0的顶点入栈 }printf("拓扑序列为:");while(!StackEmpty(S)){Pop(S,n); // 取出第一个入度为0的顶点入栈 printf("%s ",G.vertexs[n].data); // 输出 count++; // 计数 for(p=G.vertexs[n].firstarc;p!=NULL;p=p->nextarc){k=p->adjvex; // 获得 p点的后续顶点号 if(!(--indegree[k])) // 对 p点各后续顶点减1,如果入度为0则入栈 Push(S,k);}}printf("\n");if(count<G.vexnum)printf("有向图中存在环!\n"); // 结点未全部输出,图中含有回路
}int main()
{ALGraph G;CreateGraph(G);PrinAL(G);TopologicalSort(G);return 0;
}

运行结果

数据结构 实验4——拓扑排序相关推荐

  1. 数据结构实验:内部排序算法的性能分析

    文章目录 前言 一.问题描述 二.问题分析 三.实验结果及分析 (1)实验数据描述 (2)实验结果 (3)性能分析 四.源代码 前言 记录下本学期的数据结构实验 本实验主要集中于比较几种内部排序算法 ...

  2. 在linux下实现拓扑排序,数据结构——有向图(拓扑排序算法)

    package zieckey.datastructure.study.graph; /** * 有方向图 * * @author zieckey */ public class DirectedGr ...

  3. 数据结构-----图的拓扑排序和关键路径算法

    部分图片取自:http://www.cnblogs.com/navorse/articles/1893863.html 在介绍拓扑排序和关键路径之前,先引入AOE网络的概念: 该图为一个AOE网,顶点 ...

  4. Python 数据结构与算法——拓扑排序

    几乎在所有的项目,甚至日常生活,待完成的不同任务之间通常都会存在着某些依赖关系,这些依赖关系会为它们的执行顺序行程表部分约束.对于这种依赖关系,很容易将其表示成一个有向无环图(Directed Acy ...

  5. BUCT数据结构——图(拓扑排序、关键路径)

    文章目录 问题 A: 邻接矩阵存储的图,节点的出度和入度计算(附加代码模式) 问题 B: 算法7-12:有向无环图的拓扑排序 问题 C: 有向图是否存在环? 问题 D: 图-节点的最早发生时间 问题 ...

  6. 【算法练习】数据结构/图论 poj4084:拓扑排序

    题目链接:http://bailian.openjudge.cn/practice/4084 4084:拓扑排序 总时间限制: 1000ms 内存限制: 65536kB 描述 给出一个图的结构,输出其 ...

  7. C语言数据结构与算法---拓扑排序、关键路径

    文章目录 一. 有向无环图 二. 拓扑排序 1. 分析 2. 拓扑排序的定义及方法 3. 拓扑排序的重要应用 4. 拓扑排序的算法实现 三. 关键路径 1.分析 2. 什么是关键路径 3. 关键路径的 ...

  8. 数据结构与算法—拓扑排序

    目录 介绍 拓扑排序算法分析 拓扑排序代码实现 介绍 拓扑排序,很多人都可能听说但是不了解的一种算法.或许很多人只知道它是图论的一种排序,至于干什么的不清楚.又或许很多人可能还会认为它是一种啥排序.而 ...

  9. 【swjtu】数据结构实验9_多种排序算法的实现

    实验内容及要求: 输入n个整数,分别用希尔排序.快速排序.堆排序和归并排序实现由小到大排序并输出排序结果.要求n=10,15,20进行三组排序实验. 实验目的: 掌握希尔排序.快速排序.堆排序.归并排 ...

  10. 数据结构实验报告六 排序

    一.实验目的 1.掌握内部排序的基本算法: 2.分析比较内部排序算法的效率. 二.实验内容和要求 1.运行下面程序: #include <stdlib.h> #include <st ...

最新文章

  1. 全面升级!星环科技基础软件再升级,赋能数字中国建设
  2. MySQL基础之增删改查
  3. SQL基础【七、Order by】
  4. 如何优雅的设计和使用缓存?
  5. linux 块编辑,vim中的可视块编辑
  6. 玩转算法面试-第二章
  7. 【深度优先搜索】计蒜客:正方形
  8. C语言冒泡排序算法及代码
  9. 使用rkhunter检测rootkit
  10. 学习《自己动手写网络爬虫》之记录1
  11. word表格保存后缺失框线_word表格框线突然没了
  12. CTF Alice与Bob
  13. 头条白板面试_让我们谈谈白板面试和可能的替代方法
  14. 2015版本的pdf文件合并拆分软件
  15. javacv给本地视频添加水印
  16. 系统突然访问变慢,如何排查和解决?
  17. 一款简单好用的数字温度传感器芯片介绍
  18. 用Akka Http写一个web应用
  19. 架构师多如过江之鲫,但你真的了解架构师这个工种吗?
  20. 计算机硬件维护的注意事项有哪些,计算机的硬件维护注意事项

热门文章

  1. 联想ts250进bios_联想Think TS250/TS550安装server 2008 R2/2012系统教程【一】
  2. CAD线型设置:CAD软件中如何加粗曲线?
  3. JAVA---数组从小到大排序方法
  4. 【Git分布式版本控制系统一】你还不会用Git进行项目管理?
  5. 大学学习路线规划建议贴
  6. 基于MDUI的API管理系统
  7. PHPWAMP集成环境配置ssl证书
  8. Python实战之12306抢票
  9. sony android mp3播放器,劲能小钢炮!Sony ZX505 播放器动耳听:云音乐也HiFi
  10. 马哥教育python视频百度云_马哥教育python基础语法全讲解视频资料分享