c语言实现拓扑排序(《数据结构》算法7.12)

邻接表+拓扑排序,输出的是无向图的拓扑有序序列。

代码如下:

#include<stdio.h>
#include<stdlib.h>
#include<stack>
#define MAX_VERTEX_NUM 100
using namespace std;
int indegree[MAX_VERTEX_NUM];
stack<int>s;
typedef struct ArcNode{
	int adjvex;//该边的另一个顶点的位置 
	struct ArcNode *nextarc; //指向下一条边 
}ArcNode;
typedef struct VNode{
	int data;//顶点的值 
	ArcNode *firstarc;//指向第一条依附该顶点的边的指针 
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct{
	AdjList vertices;//顶点数组 
	int vexnum,arcnum;
}ALGraph;
int LocateVex(ALGraph G,int v){//定位函数 
	for(int i=0;i<G.vexnum;i++){
		if(v==G.vertices[i].data)return i;
	} 
}
void CreateDG(ALGraph &G){
	ArcNode *p;
	int i,j,k,v1,v2;
	printf("分别输入顶点个数和边的数目:\n");
	scanf("%d%d",&G.vexnum,&G.arcnum);
	printf("分别输入各个顶点值:\n");
	for(i=0;i<G.vexnum;i++){
	scanf("%d",&G.vertices[i].data);
	G.vertices[i].firstarc=NULL;//初始化 
	} 
	printf("分别输入各条弧的弧尾和弧头:\n");
	for(k=0;k<G.arcnum;k++){
		scanf("%d%d",&v1,&v2);
		i=LocateVex(G,v1);j=LocateVex(G,v2);//定位 

		p=(ArcNode*)malloc(sizeof(ArcNode));//申请一个结点 
		p->adjvex=j;p->nextarc=NULL;//赋值 
		p->nextarc=G.vertices[i].firstarc;//连接结点 
		G.vertices[i].firstarc=p;//连接结点 
	}
}
void FindInDegree(ALGraph G){ 
	for(int i=0;i<G.vexnum;i++){
		ArcNode *p=G.vertices[i].firstarc;
        while(p){
        	indegree[p->adjvex]++;
        	p=p->nextarc;
        }
	}
}
void TopologicalSort(ALGraph G){//对邻接表储存方式下的无向图求拓扑有序序列 
	int i,k;
	ArcNode *p;
	FindInDegree(G);//找到每个点的入度 
	for(i=0;i<G.vexnum;i++)
	   if(!indegree[i])s.push(i);//将入度为0的点加入栈 
	while(!s.empty()){
		i=s.top();s.pop();//栈顶元素出栈 
		printf("%d ",i);//输出一个点(这里用该点在邻接表中的位置代替点) 
		for(p=G.vertices[i].firstarc;p;p=p->nextarc){ 
			k=p->adjvex;
			if(!(--indegree[k]))s.push(k);//对i号顶点指向的其余邻接点入度减一 
	    }   
    }
}
int main(){
	ALGraph G;
	CreateDG(G);
	TopologicalSort(G);
	return 0;
}

    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/l_bestcoder/article/details/50808608
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞