图的拓扑排序

#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 ;
}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值