#include <stdio.h>
#include<string.h>
#define MAX 9999
#define M 1000
int indegree[MAX];
typedef int ElemType;
typedef struct //定义一个顺序栈
{
ElemType data[M];//栈中最多可放M个元素
int top;//用来存放栈顶元素的下标,top为-1表示栈空
} SeqStack;
struct node
{
int adjvex;
node* next;
} adj[MAX];
void InitStack(SeqStack *s);//创建一个栈
bool Push(SeqStack *s, ElemType x);//进栈操作
bool Pop(SeqStack *s,ElemType *x);//出栈操作
bool IsEmpty(SeqStack *s);//判断栈空
int Create(node *adj,int n,int m);//邻接表建表函数,n代表定点数,m代表边数
void print(int n);//邻接表打印函数
void topsort(node *adj,int n);//拓扑排序
int main(void)
{
int n;
int m;
printf("请输入顶点数及边数:");
scanf("%d%d",&n,&m);
Create(adj,n,m);
printf("输入的邻接表为:\n");
print(n);
printf("拓扑排序结果为:\n");
topsort(adj,n);
return 0;
}
void InitStack(SeqStack *s)//创建一个栈
{
s->top=-1;
}
bool Push(SeqStack *s, ElemType x)//进栈操作
{
if(s->top==M-1)
return false;
else
{
s->top++;
s->data[s->top]=x;
return true;
}
}
bool Pop(SeqStack *s,ElemType *x) //出栈操作
{
if(s->top==-1)
return false;
else
{
*x=s->data[s->top];
s->top--;
return true;
}
}
bool IsEmpty(SeqStack *s) //判断栈空
{
if(s->top==-1)
return true;
else
return false;
}
int Create(node *adj,int n,int m)//邻接表建表函数,n代表定点数,m代表边数
{
int i;
node *p;
for(i=1; i<=n; i++)
{
adj[i].adjvex=i;
adj[i].next=NULL;
}
for(i=1; i<=m; i++)
{
printf("请输入第%d条边:",i);
int u,v;
scanf("%d%d",&u,&v);
p=new node;
p->adjvex=v;
p->next=adj[u].next;
adj[u].next=p;
}
return 1;
}
void print(int n)//邻接表打印函数
{
int i;
node *p;
for(i=1; i<=n; i++)
{
p=&adj[i];
while(p!=NULL)
{
printf("%d ",p->adjvex);
p=p->next;
}
printf("\n");
}
}
void topsort(node *adj,int n)//拓扑排序
{
SeqStack mystack;
InitStack(&mystack);
int x;
node *p;
memset(indegree,0,sizeof(indegree));
for(int i=1; i<=n; i++)
{
p=adj[i].next;
while(p!=NULL)
{
indegree[p->adjvex]++;
p=p->next;
}
}
for(int i=1; i<=n; i++)
{
if(indegree[i]==0)
Push(&mystack,i);
}
int count=0;
while(!IsEmpty(&mystack))
{
Pop(&mystack,&x);
printf("%d ",x);
count++;
for(p=adj[x].next; p!=NULL; p=p->next)
{
int k=p->adjvex;
indegree[k]--;
if(indegree[k]==0)
Push(&mystack,k);
}
}
printf("\n");
if(count<n)
printf("有回路\n");
}
拓扑排序
最新推荐文章于 2020-12-13 22:07:31 发布
本文介绍了一个使用邻接表表示的图进行拓扑排序的过程。通过建立图的数据结构,并利用栈来辅助实现拓扑排序,文章详细展示了从创建图到完成排序的每一步骤。此外,还提供了完整的C语言代码实现,帮助读者理解拓扑排序的基本原理。
286

被折叠的 条评论
为什么被折叠?



