拓扑排序

来源:互联网 发布:洗数据 编辑:程序博客网 时间:2024/06/09 19:31
#include <stdio.h>#include<string.h>#define MAX 9999#define M 1000int 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");}