拓扑排序算法实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拓扑排序算法实现相关的知识,希望对你有一定的参考价值。

采用邻接表作为拓扑排序算法的存储结构。所设计的系统要有简单的 DOS 界面,方便用户
进行操作,完成以下功能:
(1)实现图的基本运算,如:增加边,删除边,判断边是不是存在等。
(2)实现堆栈类,要求采用链式存储结构实现。
(3)实现拓扑排序算法,要求使用(2)中定义的堆栈类存放入度为0的顶点。
(4)输出拓扑排序的结果到文本文件中保存。
(5)退出系统。

#define MAXV 30
#define OK 1
#define ERROR 0
typedef char VertexType;
typedef int status;

typedef struct ArcNode
int adjvex;
struct ArcNode *nextarc;
ArcNode;

typedef struct VNode
VertexType data;
ArcNode *firstarc;
VNode,AdjList[MAXV ];

typedef struct
AdjList vertices;
int vexnum,arcnum;
ALGraph;

int LocateVex(ALGraph G,char m);
status Creat_Graph1(ALGraph &G);
int dfs_topsort(ALGraph g,int n);//拓扑排序算法

void dfs(ALGraph g,int v,int&flag);//深度优先搜索
void Menuselect();
头文件

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<iostream.h>
#include"head.h"

int visited[MAXV];
int finished[MAXV];

int dfs_topsort(ALGraph g,int n)

int flag=1,i;
for(i=0;i<n;i++) //置初值

visited[i]=0;
finished[i]=1;

i=0; //从编号为0的顶点开始遍历
while(flag&&i<n)

if(visited[i]==0)
i++;
dfs(g,i,flag);


return flag;


void dfs(ALGraph g,int v,int&flag)

ArcNode *p;
printf("%d\\n",v);
finished[v]=0;
visited[v]=0;
p=g.vertices[v]. firstarc; //找顶点V的第一条弧
while(p!=NULL)


if(visited[p->adjvex]==0)

dfs(g,p->adjvex,flag);
finished[p->adjvex ]=1;

p=p->nextarc ;



int LocateVex(ALGraph G,char m)
int i;
for(i=0;i<G.vexnum;i++)
if(G.vertices[i].data==m)return i;
return ERROR;


status Creat_Graph1(ALGraph &G)
int i,j,r;char m,n;ArcNode *p;
printf("请输入顶点数:");
scanf("%d",&G.vexnum);
printf("请输入边数:");
scanf("%d",&G.arcnum);
printf("请输入图的所有顶点:");
for(i=0;i<G.vexnum;i++)
cin>>G.vertices[i].data;G.vertices[i].firstarc=NULL;
printf("请输入图的所有边,如A->B边记为AB,:\\n");
for(r=0;r<G.arcnum;r++)
cin>>m;cin>>n;
i=LocateVex(G,m);j=LocateVex(G,n);

p=(ArcNode*)malloc(sizeof(ArcNode));
p->adjvex=j;
p->nextarc=G.vertices[i].firstarc;
G.vertices[i].firstarc=p;

return OK;


void Menuselect()
int done=1,select,i;
ALGraph g;
printf("please input select number");
while(done)
printf("请输入操作码:");
scanf("%d",&select);
switch(select)
case 1:
if(Creat_Graph1(g))printf("OK");
printf("\\n\\n");
break;

case 2:
dfs_topsort( g,g.vexnum);
printf("\\n\\n");
break;
case 3:
done=0;
break;
default:printf("输入的操作码错误\\n\\n");



实现文件

#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<iostream.h>
#include"head.h"
void main()


printf("图的拓扑排序");

Menuselect();


主文件
参考技术A nupt?

以上是关于拓扑排序算法实现的主要内容,如果未能解决你的问题,请参考以下文章

逆拓扑排序实现思想以及通过DFS算法实现逆拓扑排序(C语言)

Python中的拓扑排序算法(DFS)实现

如何用C++语言实现AOV网的所有拓扑排序?(最好能实现动态演示)

算法笔记_023:拓扑排序(Java)

数据结构与算法拓扑排序问题C语言实现

拓扑排序的原理及其实现