拓扑排序 编程

来源:百度知道 编辑:UC知道 时间:2024/05/24 15:00:45
题目描述:判断一个有向图是否存在回路,并求出有向无环图的拓扑序列。
功能要求及说明:(主要使用的知识: 图)
(1)对一个AOV网,应判断其是否是有向无环图,若是则输出其任意一个拓扑排序序列,不是则进行相关的说明;
(2)以邻接表为存储结构;
(3)该AOV网要求至少有10个顶点,15条边;并且利用文件对数据进行提取。
(4)采用模块化设计。

2、 系统以菜单界面方式(至少采用文本菜单界面,如能采用图形菜单界面更好)工作,运行界面友好,演示程序以用户和计算机的对话方式进行。

*/
#include <stdio.h>
#include <malloc.h>

// 输出有向图的一个拓扑序列。实现算法7.12的程序
// 图的邻接表存储表示
#define MAX_NAME 3// 顶点字符串的最大长度+1
#define MAX_VERTEX_NUM 20
typedef int InfoType;// 存放网的权值
typedef char VertexType[MAX_NAME];// 字符串类型
typedef enum{DG,DN,AG,AN}GraphKind; // {有向图,有向网,无向图,无向网}

typedef struct ArcNode
{
int adjvex;// 该弧所指向的顶点的位置
struct ArcNode *nextarc;// 指向下一条弧的指针
InfoType *info;// 网的权值指针)
}ArcNode;// 表结点

typedef struct VNode
{
VertexType data;// 顶点信息
ArcNode *firstarc;// 第一个表结点的地址,指向第一条依附该顶点的弧的指针
}VNode,AdjList[MAX_VERTEX_NUM];// 头结点

typedef struct
{
AdjList vertices;
int vexnum,arcnum;// 图的当前顶点数和弧数
int kind;// 图的种类标志
}ALGraph;

// 若G中存在顶点u,则返回该顶点在图中位置;否则返回-1。
int LocateVex(ALGraph G,VertexType u)
{
int i;
for(i=0;i<G.vexnum;++i)
if(strcmp(u,G.vertices[i].data)==0)