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. 结果