`
jaychang
  • 浏览: 736019 次
  • 性别: Icon_minigender_1
  • 来自: 嘉兴
社区版块
存档分类
最新评论

拓扑排序(邻接表实现)

 
阅读更多
/**********************************
         title:   拓扑排序(邻接表实现)
         author:  jay chang
         date:    2009/07/16
**********************************/
#include<iostream>

#define MAXSIZE 99
#define TRUE 1
#define FALSE 0

using namespace std;

typedef char VertexData;
 
typedef int AdjType;

typedef struct Stack          //定义栈
{
  int data[MAXSIZE+1];
  int top;
}Stack;

typedef struct ArcNode		 //定义弧结点
{
  AdjType adj;
  ArcNode *nextArc;
}ArcNode;

typedef struct VertexNode    //定义顶点
{
  VertexData vertexData;
  ArcNode *firstArc;
}VertexNode;


typedef struct AdjMatrix     //定义图
{
  VertexNode vertexNodes[MAXSIZE+1];
  int verNum,arcNum;
}AdjMatrix;

//全局变量
int indegree[MAXSIZE+1]={0};

int LocateGraph(AdjMatrix *g, VertexData vertexData)
{
  int iIndex;
  for(iIndex=1;iIndex<=g->verNum;iIndex++)
  {
    if(vertexData==g->vertexNodes[iIndex].vertexData)
      return iIndex;
  }
  return FALSE;
}

void  CreateGraph(AdjMatrix *g)
{   
  int iCount,arcStart,arcEnd;char start,end;
  cout<<"*****************************************"<<endl;
  cout<<"***       拓扑排序\n";
  cout<<"***       Author: Jay Chang\n";
  cout<<"*****************************************"<<endl;
  cout<<"输入有向无环图的顶点,及弧数\n";
  cin>>g->verNum>>g->arcNum;
  cout<<"输入有向无环图的顶点信息\n";
  ArcNode *q=NULL;

  for(iCount=1;iCount<=g->verNum;iCount++)
  {    
	   cout<<"输入第"<<iCount<<"个顶点的信息"<<endl;
       cin>>g->vertexNodes[iCount].vertexData;
	   g->vertexNodes[iCount].firstArc=NULL;
  }

  for(iCount=1;iCount<=g->arcNum;iCount++)
  {
      cout<<"输入第"<<iCount<<"条弧的起始与结束的信息"<<endl;
      cin>>start>>end;

      arcStart=LocateGraph(g,start);
	  arcEnd  =LocateGraph(g,end);
	
	  //添加弧结点
      q=(ArcNode*)malloc(sizeof(ArcNode));
      q->adj=arcEnd;
      q->nextArc=g->vertexNodes[arcStart].firstArc;
      g->vertexNodes[arcStart].firstArc=q;
      //对于第arcEnd个顶点的入度值加1
	  indegree[arcEnd]++;
  }
}


//判栈空
int IsEmpty(Stack *stack)
{
  return stack->top==-1?TRUE:FALSE;
}

//初始化栈
void InitStack(Stack *stack)
{
  stack->top=-1;
}

//出栈
void Pop(Stack *stack,int *iIndex)
{
  *iIndex=stack->data[stack->top--];
}

//进栈
void Push(Stack *stack,int value)
{
  stack->data[++stack->top]=value;
}

//拓扑排序
int Tuopu(AdjMatrix *g)
{
  int iCount,count=0;
  Stack *stack=(Stack*)malloc(sizeof(Stack));
  InitStack(stack);
  ArcNode *p=NULL;

  //对于入度为0的顶点入栈
  for(iCount=1;iCount<=g->verNum;iCount++)
  {
    if(indegree[iCount]==0){
      Push(stack,iCount);
    }
  }

  cout<<"输出拓扑序列\n";
  
  //输出顶点后,将与该顶点相连的顶点的边删除,将与相连顶点的入度减1,如减后为0,入栈,栈空结束
  while(!IsEmpty(stack))
  {
    Pop(stack,&iCount);
    cout<<g->vertexNodes[iCount].vertexData<<" ";
    count++;
    p=g->vertexNodes[iCount].firstArc;
    while(p!=NULL)
    {	
		if(--indegree[p->adj]==0)
			Push(stack,p->adj);
		p=p->nextArc;
    }
  }//end while

  if(count<g->verNum){
    cout<<"有回路"<<endl;
    return FALSE;
  }
  cout<<endl;
}
   
int main()
{
    AdjMatrix *g=(AdjMatrix*)malloc(sizeof(AdjMatrix));
    CreateGraph(g);
    Tuopu(g);
    return 0;
}






















 
分享到:
评论
2 楼 jaychang 2010-07-15  
lixia0417 写道
不错,不过要是用java来描述就更好了

呵呵,有时间出个JAVA版的,敬请期待哈。。。
1 楼 lixia0417 2010-07-14  
不错,不过要是用java来描述就更好了

相关推荐

    拓扑排序 邻接表实现.zip

    在这个"拓扑排序 邻接表实现.zip"文件中,我们很显然会深入探讨如何通过邻接表数据结构来实现拓扑排序算法。 首先,让我们理解什么是拓扑排序。在有向无环图中,拓扑排序是对图中所有顶点的一种线性排序,使得对于...

    逆邻接表快速实现拓扑排序

    本篇将详细介绍如何使用逆邻接表来快速实现拓扑排序。 首先,我们需要理解什么是逆邻接表。在图的表示中,邻接表是一种常见的数据结构,它为每个顶点存储其相邻顶点的列表。对于有向图,正向邻接表记录了每条边的...

    基于邻接表存储的图的拓扑排序算法

    基于邻接表存储的图的拓扑排序算法,学习C++和理解数据结构很有帮助

    在C语言下用邻接表实现拓扑排序

    在C语言下利用C语言创建AOE网,并进行拓扑排序。功能模块包含图的创建,图的输出及拓扑排序。

    拓扑排序 拓扑排序 有注释 邻接表形式的 求入度的

    拓扑排序 有注释 邻接表形式的 求入度的

    【数据结构】基于紧缩图的邻接表的拓扑排序.doc

    该报告将对拓扑排序问题进行深入分析,并设计实现基于紧缩图的邻接表的拓扑排序程序。 知识点1:紧缩图的邻接表 紧缩图的邻接表是一种高效的图存储方式,它将图的每个顶点的邻接表紧凑的存储在两个向量list和h中。...

    数据结构之AOV网的拓扑排序算法

    在提供的源代码`AOV网的拓扑排序算法.c`中,你可以期待看到关于这些步骤的实现,包括数据结构的定义(如顶点和边)、邻接表的构建、入度计算、以及拓扑排序的函数。代码注释会帮助理解每一部分的功能。 输入示意图`...

    数据结构基于紧缩图的邻接表的拓扑排序-毕业论文.doc

    该论文的主要内容包括:紧缩邻接表的数据结构、基于紧缩图的拓扑排序算法、STL 图库的应用、紧缩图的邻接表结构的设计和实现、拓扑排序的实现等。 在数据结构方面,本文主要介绍了紧缩邻接表的数据结构,包括向量 ...

    数据结构拓扑排序课程设计.docx

    为了实现拓扑排序,通常会使用到【邻接表】这种数据结构来表示图。邻接表是一种节省空间的图表示方法,它由一个顶点数组和一组链表组成,每个链表都包含了与其顶点相连的所有边的目标顶点。在C++中,可以定义如下: ...

    拓扑排序 数据结构 邻接表 存储

    请输入有向图的顶点数和弧数: 6 8 请输入各顶点的值(eg:字符型): ABCDEF 请输入各条弧的始点和终点: AB AC AD CB CE FD FE DE 该有向图的一个拓扑排序为: FACBDE

    【数据结构】基于紧缩图的邻接表的拓扑排序正文终稿.doc

    该课题的主要目标是设计基于紧缩图的邻接表的拓扑排序程序,采用STL的图、栈等数据结构,实现紧缩图的邻接表结构的拓扑排序。 知识点1:紧缩图的邻接表结构 紧缩图的邻接表结构是指将图的每个顶点的邻接表紧凑的...

    毕业设计-数据结构基于紧缩图的邻接表的拓扑排序.doc

    本课程设计的目标是设计基于紧缩图的邻接表的拓扑排序程序,采用STL的图、栈等数据结构,实现STL的紧缩邻接表结构图类,并实现紧缩图的邻接表结构的拓扑排序。 在该课程设计中,我们首先对紧缩图的邻接表进行了深入...

    图的邻接表实现.rar

    在实际应用中,使用邻接表实现的图可以有效地进行深度优先搜索(DFS)和广度优先搜索(BFS),并支持多种图算法,如最短路径计算(Dijkstra算法或Floyd-Warshall算法)、拓扑排序等。此外,由于类模板的使用,此实现...

    基于邻接表的网络拓扑结构描述

    Kahn's算法或Tarjan's algorithm是实现拓扑排序的常见方法。 7. **连通性**:判断网络中所有顶点是否连通,可以使用深度优先搜索,若DFS能遍历所有顶点,则图是连通的;否则,它是不连通的。 8. **查找强连通分量*...

    AOV网与拓扑排序

    ### AOV网与拓扑排序:深入理解与C语言实现 #### AOV网(Activity On Vertex Network) AOV网络,即活动在顶点上的网络,是一种有向无环图(Directed Acyclic Graph, DAG),主要用于表示项目管理中的任务依赖关系...

    DS图-课程表(拓扑排序)C++邻接表实现

    拓扑排序

    C#有向图算法(邻接表包含关键路径、DFS、BFS、拓扑排序)

    本文将详细讲解如何使用C#语言实现有向图算法,包括邻接表、关键路径、深度优先搜索(DFS)和广度优先搜索(BFS),以及拓扑排序。 首先,我们要理解有向图的概念。有向图是由顶点(节点)和边组成的,边具有方向性...

    拓扑排序 整体 拓扑排序

    拓扑排序是图论中的一个重要概念,主要应用于有向无环图(DAG,...在压缩包中的"拓扑排序(整体)"文件可能包含了关于拓扑排序的详细讲解、实例解析或代码实现,进一步深入学习将有助于深化对该概念的理解和应用。

    c语言实现图的拓扑排序

    通过上述C语言实现,我们可以对任何有向无环图进行拓扑排序。这个过程涉及到图的遍历、队列的操作以及邻接表的管理,是数据结构和算法学习中的经典问题。掌握这种方法不仅可以加深对图的理解,也有助于提升编程解决...

Global site tag (gtag.js) - Google Analytics