#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define MAXVEX 100 //最大顶点数
#define INFINITY 65535 //用0表示∞
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Status;
typedef char VertexType; //顶点类型,字符型A,B,C,D...
typedef int EdgeType; //边上权值类型10,15,...
//邻接矩阵结构
typedef struct
{
VertexType vers[MAXVEX]; //顶点表
EdgeType arc[MAXVEX][MAXVEX]; //邻接矩阵,可看作边表
int numVertexes, numEdges; //图中当前的顶点数和边数
}MGraph;
typedef struct EdgeNode //边表结点
{
int adjvex;
int weight;
struct EdgeNode* next;
}EdgeNode;
typedef struct VertexNode //顶点表结点
{
int in;
VertexType data;
EdgeNode* firstedge;
}VertexNode,AdjList[MAXVEX];
//邻接表结构
typedef struct
{
AdjList adjlist;
int numVertexes, numEdges; //图中当前的顶点数和边数
}AdjGraphList;
//创建邻接矩阵
void CreateMGraph(MGraph* G);
//显示邻接矩阵
void showGraph(MGraph G);
//邻接矩阵转邻接表
void MGragp2AdjList(MGraph G,AdjGraphList* AG);
//拓扑排序
Status TopologicalSort(AdjGraphList AG);
int main()
{
MGraph MG;
AdjGraphList AG;
CreateMGraph(&MG);
showGraph(MG);
MGragp2AdjList(MG, &AG);
if (TopologicalSort(AG))
printf("no ring\n");
else
printf("ring\n");
system("pause");
return 0;
}
//生成邻接矩阵
void CreateMGraph(MGraph* G)
{
int i, j, k, w;
G->numVertexes = 14;
G->numEdges = 20;
//读入顶点信息
G->vers[0] = 'A';
G->vers[1] = 'B';
G->vers[2] = 'C';
G->vers[3] = 'D';
G->vers[4] = 'E';
G->vers[5] = 'F';
G->vers[6] = 'G';
G->vers[7] = 'H';
G->vers[8] = 'I';
G->vers[9] = 'J';
G->vers[10] = 'K';
G->vers[11] = 'L';
G->vers[12] = 'M';
G->vers[13] = 'N';
//getchar(); //可以获取回车符
for (i = 0; i < G->numVertexes; i++)
for (j = 0; j < G->numVertexes; j++)
G->arc[i][j] = INFINITY; //邻接矩阵初始化
//创建了有向邻接矩阵
G->arc[0][4] = 1;
G->arc[0][5] = 1;
G->arc[0][11] = 1;
G->arc[1][4] = 1;
G->arc[1][2] = 1;
G->arc[1][8] = 1;
G->arc[2][5] = 1;
G->arc[2][6] = 1;
G->arc[2][9] = 1;
G->arc[3][2] = 1;
G->arc[3][13] = 1;
G->arc[4][7] = 1;
G->arc[5][8] = 1;
G->arc[5][12] = 1;
G->arc[6][5] = 1;
G->arc[8][7] = 1;
G->arc[9][10] = 1;
G->arc[9][11] = 1;
G->arc[10][13] = 1;
G->arc[12][9] = 1;
}
//显示邻接矩阵
void showGraph(MGraph G)
{
for (int i = 0; i < G.numVertexes; i++)
{
for (int j = 0; j < G.numVertexes; j++)
{
if (G.arc[i][j] != INFINITY)
printf("%5d", G.arc[i][j]);
else
printf(" 0");
}
printf("\n");
}
}
void MGragp2AdjList(MGraph G, AdjGraphList* AG)
{
int i, j;
EdgeNode* edge;
AG->numEdges = G.numEdges;
AG->numVertexes = G.numVertexes;
for (i = 0; i < G.numVertexes;i++)
{
AG->adjlist[i].data = G.vers[i];
AG->adjlist[i].in = 0;
AG->adjlist[i].firstedge = NULL;
}
for (i = 0; i < G.numVertexes; i++)
{
for (j = 0; j < G.numVertexes; j++)
{
if (G.arc[i][j] != INFINITY)
{
edge = (EdgeNode*)malloc(sizeof(EdgeNode));
edge->adjvex = j;
edge->weight = G.arc[i][j];
edge->next = AG->adjlist[i].firstedge;
AG->adjlist[i].firstedge = edge;
AG->adjlist[j].in++;
}
}
}
}
Status TopologicalSort(AdjGraphList AG)
{
EdgeNode* e;
int i, j, k, gettop;
int count = 0; //用于统计输出顶点个数
int top = -1; //这是我们要创建的栈的指针
int *stack = (int*)malloc(sizeof(int)*AG.numVertexes); //这是我们创建的临时栈
//最开始将所有入度为0的顶点入栈
for (i = 0; i < AG.numVertexes; i++)
if (!AG.adjlist[i].in)
stack[++top] = i;
//下面进入主循环,直到栈中无数据结束
while (top != -1)
{
//出栈数据
gettop = stack[top--]; //出栈
printf("%c -> ", AG.adjlist[gettop].data);
count++;
//对他出栈数据的所有邻接点的入度减一
for (e = AG.adjlist[gettop].firstedge; e; e = e->next)
{
k = e->adjvex;
if (!(--AG.adjlist[k].in))
stack[++top] = k;
}
}
printf("\n");
//进行判断,若是count小于顶点数,则有环
if (count < AG.numVertexes)
return ERROR;
return OK;
}