的数据结构课程设计.docxVIP

  • 1
  • 0
  • 约2.42千字
  • 约 7页
  • 2023-08-03 发布于辽宁
  • 举报
数据结构课程设计--- 问题:选择合适的结构表示图,在此基础上实现拓扑排序算法。 要求:对所设计的图的结构,提供必要的基本功能。 1 .问题描述 对一个有向无环图(Directed Acyclic Graph简称DAG ) G进行拓扑排序 (Topological Sort ),是将G中所有顶点排成一个线性序列,使得对图中任意一对 顶点i和j,若<i,j> e E(G),则i在线性序列中出现在j之前。通常将这样的线性序 列称为满足拓扑次序(Topolgical Order )的序列,简称拓扑序列。若将图中顶点按 拓扑次序排成一行,则图中所有的有向边均是从左指向右的。显然,若图中存在有向 环,则不可能使顶点满足拓扑次序。 一个有向图经常用来说明事件之间的先后关系。通常将事件表示为顶点,而事件 间的依赖关系表示为有向边。若从顶点i到顶点j有一条有向路径,则i是j的前驱, j是i的后继。若(i,j )是一条边<i,j>,则i是j的直接前驱;j是i的直接后继。 一个DAG的拓扑序列通常表示某种方案切实可行。 拓扑排序方法步骤: 从有向图上选择一个没有入度的节点并输出。 从图中删去改点并删去从该顶点发出的全部有向边。 重复上述两步,直到图中不再存在没有前驱的顶点为止。 2.算法设计 设计本题的算法的构思如下: 采用邻接矩阵作为有向图的存储结构,且需要编写计算顶点入度的函数 Cal_indegree ()。删除入度为零的顶点,及以它为起始点的边的操作,并将终点 的入度减一来实现。避免重复检测入度为零的顶点,需另设一临时变量t存储所有 入度为零的顶点。当有向图上某一顶点入度为零,则将该顶点赋给t,然后输出t, 并将与该顶点有关的顶点的入度减一,若减一后,入度为零,则继续重复上述步骤。 操作的结果: 全部顶点被输出,图中没有回路。 未输出全部顶点,剩余顶点均有前驱,图中有回路。 主要数据结构:图的邻接矩阵存储形式; (4)总体设计流程: 3.程序实现 完整程序的源代码如下: #includestdio.h #includestdlib.h #includeiostream.h #define MaxVertexNum 50 /最大顶点数 typedef struct int edges[MaxVertexNum][MaxVertexNum];/邻接矩阵 int vexnum;//图中当前的顶点数 }DAGraph; void InputGraph( DAGraph *g ) { int n,i,j; cout请输入顶点个数,数的范围是[1..”MaxVertexNum”]:endl; cinn; if( n1|| nMaxVertexNum ) { cout超出范围endl; exit(1); } g-vexnum=n; for( i=0;in;i++ ) for(j=0;jn;j++ ) g-edges[i][j]=0;//邻接矩阵初始化 cout请输入边的起始点和终点他们须在[0..n-1]内,以-1-1结束vvendl; do{ cinij; if( i==-1j==-1 ) break; if( i0lli=nllj0llj=n ) { cout错误:i 和 j 必须在[0..”vvn-1”],请重试!”endl; continue; } g-edges[i][j]=1; }while(1); } void Cal_indegree( DAGraph *g,int indegree[]) { int i,j; for( i=0;ig-vexnum;i++ ) indegree[i]=0;//将起始点i的入度置为0 for( i=0;ig-vexnum;i++ ) for( j=0;jg-vexnum;j++ ) if( g-edges[i][j]==1 ) indegree[j]++;//将i,j终点 j 的入度加 1 } void TopSort( DAGraph *g,int indegree[]) { int t=-1,i,j,count=0;//count对输出的顶点数目计数,初值为0 for( i=0;ig-vexnum;i++ ) { if( indegree[i]==0) { indegree[i]=t;//将入度为0的顶点i的入度置为-1,相当于从图中将其取出 t=i;//把 i赋给t,便于后面输出顶点i } } 〃以下开始拓扑排序 while(t!=-1 )//尚未遍历完该图 { coutVt; count++;//输出顶点i并计数 i=t; t=indegree[t]; for( j=0;jg-vexnum;j++ ) { if( g-edges[i][j]==1 ) indegree[j]--;//j的入度减1

文档评论(0)

1亿VIP精品文档

相关文档