C语言拓扑排序

定义:

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

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值