拓扑排序算法实现
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拓扑排序算法实现相关的知识,希望对你有一定的参考价值。
采用邻接表作为拓扑排序算法的存储结构。所设计的系统要有简单的 DOS 界面,方便用户
进行操作,完成以下功能:
(1)实现图的基本运算,如:增加边,删除边,判断边是不是存在等。
(2)实现堆栈类,要求采用链式存储结构实现。
(3)实现拓扑排序算法,要求使用(2)中定义的堆栈类存放入度为0的顶点。
(4)输出拓扑排序的结果到文本文件中保存。
(5)退出系统。
#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语言)