AOV网和Topo排序

1. 代码

#include<stdio.h>
#include<stdlib.h>
#define MAX_VEX 100
//表结点 
typedef struct node 
{
	int adjvex;				//邻接顶点域 
	struct node* next; 		//指向下一顶点的指针域 
}ARCNODE;

typedef struct  
{
	ARCNODE *firstarc;		//边表头节点 
	int vertex;				//顶点域,存储入度 
}VEXNODE;
VEXNODE adjlist[MAX_VEX];
//创建邻接表 
int creat()
{
	
	int vexnum, edgnum;
	int i;
	int v1, v2;
	printf("输入顶点数,边数(vexnum,edgnum)=");
	scanf("%d,%d",&vexnum, &edgnum);
	for(i=1;i<=vexnum;i++)
	{
		adjlist[i].vertex=0;
		adjlist[i].firstarc = NULL;
		
	}
	ARCNODE *ptr;
	for(i=1;i<=edgnum;i++)
	{
		ptr=(ARCNODE*)malloc(sizeof(ARCNODE));
		printf("(v1,v2)=");
		scanf("%d,%d",&v1,&v2);
		ptr->adjvex=v2;
		ptr->next=adjlist[v1].firstarc;
		adjlist[v1].firstarc=ptr;
		adjlist[v2].vertex++; 
		/*//无向图还要加上
		 	ptr=(ARCNODE*)malloc(sizeof(ARCNODE));
		 	ptr->adjvex=v1;
			ptr->next=adjlist[v2].firstarc;
			adjlist[v2].firstarc=ptr;
		*/
		
	} 
	return vexnum;
}
/*拓扑排序 
1. 在网上选取没有前驱(入度为0)的顶点,输出之;
2. 删除该顶点,以及该顶点出发的全部边;
3. 重复1,2,直至不存在入度为0的顶点 
*/
void toposort(int vexnum) 
{
	
	//队列,将入度为0的顶点入度 
	int queue[vexnum+1];
	int i;
	int front, rear;
	front=rear=0;
	int sum=0;	//用于计数,以判断结束时时顶点是否全部输出(topo排序是否存在) 
	for(i=1;i<=vexnum;i++) 
		if(adjlist[i].vertex==0)
		{
			rear++;
			queue[rear]=i;
		}
	printf("排序结果: ") ;
	while(front!=rear)
	{
		printf("%d  ",queue[++front]);//输出队首 
		sum++;
		//
		ARCNODE *p=adjlist[queue[front]].firstarc;
		while(p)
		{
			adjlist[p->adjvex].vertex--;
			if(adjlist[p->adjvex].vertex==0)
			{
				queue[++rear]=p->adjvex;
				
			}
			p=p->next;
		}
				
	}
	if(sum<vexnum)
		printf("\nnot a set of partial order!\n");
	
	
}
int main()
{
	int vexnum=creat();
	toposort(vexnum);
 	return 0;
}

2. 结果

猜你喜欢

转载自blog.csdn.net/lituusliu/article/details/78074593