拓扑排序(算法 非可执行程序)

判断有向图是否有环的算法实现
博客围绕判断有向图是否有环展开,给出了有向图从十字链表形式存储在内存中的相关定义,包括弧、顶点和图的定义。还提供了查找第一个没有前驱的顶点、查找特定顶点位置的函数,以及拓扑排序函数来判断图是否有回路。
 

假设有个有向图G已经从十字链表形式存储在内存中,试写一个判断该有向图是否有环(回路)的算法。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

define MAX_VERTEX_NUM 20

typedef struct ArcBox{

   Int tailvex,headvex;

   Struct ArcBox *hlink,*tlink:

   InforType  info;

}ArcBox;//定义弧

 

tpedef struct vexnode{

VertexType data;

ArcBox *firstin,*firstout;

}VexNode;//定义定点

 

typedef struct{

 VexNode Xlist[MAX_VERTEX_NUM];

  Int vexnum arcnum;

}OLGraph;//定义图

 

LocatFirstNull(OLGraph &G, int i, int n)

//查找第一个没有前驱的顶点,即第一个firstin为空的顶点,返回其位置i,n为循环次数,等于初始时顶点的个数。

{

  for(k=0;k<n;k++)

{

  if(!G.XList[k].firstin)

   {i=k;return true;}

}

return false;

}

LocatFistinheadVex(OLGraph &G,int j,int v2,int n)

//查找firstin指向弧的headvex=v2的顶点,返回其位置j

{

  for(i=0;i<n;i++)

{if(*G.XList[i].firstin.headvex==v2)

{j=i;return true;}

}retrun false;

}

 

TopSort(OLGraph &G)

{

ArcBox *p1,*p2,*pt;

 int i,j,n;

 n=G.vexnum;

while(LocatFirstNull(G,i,n))

{

p1=G.XList[i].firstout;

free(G.XList[i]);//释放数据,保留位置,可以使用无效数据填充;因为若把位置删除,会使图的存储变乱。在释放前加printf G.XList[i].data,最后得到该图拓扑序列。

G.vexnum--;

while(p1)

{

  if(LocateFirstinheadvex(G,j,*p1.headvex,n))

   {

p2=G.XList[j].firstin;

while(*p2.hink.tailvex!=*p1.tailvex)

p2=p2.hlink;

p2.hlink=h1.hlink;//修改同尾链域的指针,使原来指向要删除弧的指针,指向下一个或空。

}

t=p1;p1.tlink;

free(t);//释放以删除顶点为尾的弧;

G.arcnum--;

}

}

if(G.vexnum==0) printf 此图没有回路!;

else printf 此图有回路;

}

转载于:https://www.cnblogs.com/enuosky/archive/2005/12/02/289425.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值