#include <stdio.h>
#include <stdlib.h>
#define MAX 20
int indegree[MAX];//用来计算所有节点的入度之和
typedef int AdjMatrix[MAX][MAX];
typedef struct{
int vexnum,arcnum;
AdjMatrix arcs;
char vex[MAX];
}MGraph;
typedef struct{
int *base;
int top,stacksize;
}SqStack;
int LocateAdj(MGraph G, char v){
int i;
for(i = 0; i < G.vexnum; i ++)
if(G.vex[i] == v)
return i;
return -1;
}
void CreateMGraph(MGraph &G){
int i,j,k;
char v1,v2;
printf("请输入结点数和边的数目:\n");
scanf("%d%d",&G.vexnum,&G.arcnum);
for(i = 0; i < G.vexnum; i ++)
for(j = 0; j < G.vexnum; j ++)
G.arcs[i][j] = 0; //先对矩阵进行初始化
printf("请输入结点:\n");
getchar();
for(i = 0; i < G.vexnum; i ++){
scanf("%c",&G.vex[i]);
}
printf("请输入各条边:\n");
for(i = 0; i < G.arcnum; i ++){
getchar();
scanf("%c%c",&v1,&v2);
j = LocateAdj(G,v1); k = LocateAdj(G,v2);
// printf("%d %d****\n",j,k);
G.arcs[j][k] = 1;
}
}
void FindInDegree(MGraph G){//计算图中各节点的入度
int i,j;
for(i = 0; i < G.vexnum; i ++){
for(j = 0; j < G.vexnum; j ++)
if(G.arcs[i][j])//当两顶点之间存在边时,入度自加
indegree[j] ++;
}
}
void InitStack(SqStack &S){
S.base = (int *)malloc(sizeof(int) * MAX);
if(!S.base)
return ;
S.top = 0;
S.stacksize = MAX;
}
void Push(SqStack &S, int i){
if(S.top >= S.stacksize){
S.base = (int *)realloc(S.base,(S.stacksize + MAX) * sizeof(int));
if(!S.base)
return ;
S.stacksize += MAX;
}
S.base[S.top ++] = i;
}
void Pop(SqStack &S, int &i){
if(!S.top)
return ;
i = S.base[-- S.top];
}
int StackEmpty(SqStack S){
if(!S.top)
return 1;
return 0;
}
void TopologicalSort(MGraph G){
FindInDegree(G);
SqStack S;
int i,j,count = 0;
InitStack(S);
for(i = 0; i < G.vexnum; i ++)
if(!indegree[i])
Push(S,i);//把入度为零的节点压栈
printf("拓扑序列如下:\n");
while(!StackEmpty(S)){
Pop(S,i);
printf("%c\n",G.vex[i]); count ++;
for(j = 0; j < G.vexnum; j ++){
if(G.arcs[i][j]){
if(!(-- indegree[j]))//删除相对应得边
Push(S,j);
}
}
}
if(count < G.vexnum)
printf("此图有环存在!\n");
}
int main(){
MGraph G;
CreateMGraph(G);
TopologicalSort(G);//对图进行拓扑排序;
return 0;
}