#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
#define SIZE 100
typedef int Status ;
typedef char VerVexType ;
typedef struct
{
int weight ;
}OtherInfo;
typedef struct
{
int headvex,tailvex ;//弧头,弧尾
ArcNode *headlink , *taillink ;//弧头相同的下一条弧,弧尾相同的下一条弧(箭头就是弧头)
OtherInfo info ;
}ArcNode ;
typedef struct
{
VerVexType data ;
ArcNode *firstin ,*firstout ;
}VNode,AdjList[SIZE] ;
typedef struct
{
AdjList vertices ;
int vexnum , arcnum ;
}ALGraph ;//十字链表
ALGraph G = (ALGraph)malloc(sizeof(ALGraph));
int Locate(ALGraph *G , VerVexType a)
{
int i = 0 ;
while(i <= G->vexnum )
{
if(G->vertices[i].data == a )
{
return i ;
}
++i ;
}
return -1 ;
}
Status CreateALGraph(ALGraph *G)//创建十字链表
{
int i , j , k ;
char v1 , v2 ;
ArcNode *p ;
scanf_s("%d",&G->vexnum , sizeof(G->vexnum)) ;
scanf_s("%d",&G->arcnum , sizeof(G->arcnum)) ;
for(i = 0 ; i < G->vexnum ; ++i)
{
scanf_s("%c", &G->vertices[i] , sizeof(G->vertices[i]) ) ;
G->vertices[i].firstin = G->vertices[i].firstout = NULL ;
}
for(k = 0 ; k < G->arcnum ; ++k )
{
scanf_s("%c%c",&v1,sizeof(v1), &v2 , sizeof(v2)) ;
i = Locate(G , v1 ) ;//弧尾
j = Locate(G , v2 ) ;//弧头
p = (ArcNode *)malloc(sizeof(ArcNode)) ;
p->tailvex = i ;
p->headvex = j ;//弧头即弧的箭头
p->headlink = G->vertices[j].firstin ;//弧头相同的下一条弧
G->vertices[j].firstin = p ;
p->taillink = G->vertices[i].firstout ;//弧尾相同的下一条弧
G->vertices[i].firstout = p ;
}
return OK ;
}
//拓扑排序,十字链表实现
//针对对象为有向无环图(无回路)
void visit(ALGraph *G , int i )
{
printf("%c\n",G->vertices[i].data );
}
Status Topo_Sort(ALGraph *G)//拓扑排序(前驱在后继之前输出),用于判断是否有回路
{
int i , j ;
int sum = 0 ; //记录输出节点个数
ArcNode *q , *p ;
for(i = 0 ; i < G->vexnum ; ++i )//输出顶点
{
for(j = 0 ; j < G->vexnum && G->vertices[i].firstin ; ++j) ; //找到无前驱顶点
if(j < G->vexnum)
{
visit(G , j ) ;
p = G->vertices[j].firstout ;
while§
{
q = G->vertices[p->headvex].firstin ;
while(q->headlink != p)//连接边指针
{
q = q->headlink ;
}
q->headlink = p->headlink ;
q = p ;
p = p->taillink ;
free(q) ;//释放内存
q = NULL ;
}
G->vertices[j].firstout = NULL ;
++sum;
}
else
{
break ;
}
}
if(sum == G->vexnum)
{
return TRUE ;
}
else
{
return FALSE ;
}
}