定义:
typedef char VerTexType;
typedef struct
{
int adjvex;
struct ArcNode *next;
}ArcNode;
typedef struct
{
VerTexType data;
ArcNode *fistarc;
}VNode,*AdjList;
typedef struct
{
AdjList vertices;
int arcnum,vexnum;
}ALGraph;
typedef struct
{
int adjvex;
struct StackNode *next;
}StackNode,*LinkStack;
需要的头文件:
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
入栈算法:
void Push(LinkStack *a,int b)
{
LinkStack c;
c=(StackNode*)malloc(sizeof(StackNode));
c->adjvex=b;
c->next=(struct StackNode*)*a;
*a=c;
}
出栈算法:
void Pop(LinkStack *a,int *b)
{
if(!(*a))
{
printf("栈空!\n");
return;
}
LinkStack c;
c=*a;
*b=c->adjvex;
*a=(StackNode*)(*a)->next;
}
求出各顶点入度算法:
void FindInDegree(ALGraph a,int *b)
{
int c;
for(c=0;c<a.vexnum;++c)
{
b[c]=0;
}
for(c=0;c<a.vexnum;++c)
{
ArcNode *d;
d=a.vertices[c].fistarc;
while(d)
{
++b[d->adjvex];
d=(ArcNode*)d->next;
}
}
}
判断图是否有回路的算法:
bool TopologicalSort(ALGraph G,int *topo)
{
int *indegree,i,m,k;
indegree=(int*)malloc(sizeof(int*)*G.vexnum);
LinkStack S;
InItStack(&S);//*初始化
FindInDegree(G,indegree);//*求各顶点入度
for(i=0;i<G.vexnum;++i)
{
if(!indegree[i])
{
Push(&S,i);//*若入度为0,则入栈
}
}
m=0;
while(S)
{
Pop(&S,&i);//*出栈
topo[m]=i;
++m;
ArcNode *p;
p=G.vertices[i].fistarc;
while(p)
{
k=p->adjvex;
--indegree[k];
if(!indegree[k])
{
Push(&S,k);//*若入度为0,则入栈
}
p=(ArcNode*)p->next;
}
}
free(indegree);
if(m<G.vexnum)
{
return false;//*如果有回路,则返回true
}
else
{
return true;//*如果没有回路,则返回false
}
}