编程语言:c++

截图展示:

 

代码如下:

  1 #include<cmath>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<stack>
  5 #include<memory.h>
  6 #include<iostream>
  7 using namespace std;
  8 #define MAX 9999
  9 
 10 stack<int>mystack;
 11 int indegree[MAX];
 12 
 13 struct node
 14 {
 15     int adjvex;
 16     node* next;
 17 }adj[MAX];
 18 
 19 int Create(node adj[],int n,int m)//邻接表建表函数,n代表定点数,m代表边数
 20 {
 21     int i;
 22     node *p;
 23     for(i=1;i<=n;i++)
 24     {
 25 
 26         adj[i].adjvex=i;
 27         adj[i].next=NULL;
 28     }
 29     for(i=1;i<=m;i++)
 30     {
 31         cout<<"请输入第"<<i<<"条边:";
 32         int u,v;
 33         cin>>u>>v;
 34         p=new node;
 35         p->adjvex=v;
 36         p->next=adj[u].next;
 37         adj[u].next=p;
 38     }
 39     return 1;
 40 }
 41 
 42 
 43 void print(int n)//邻接表打印函数
 44 {
 45     int i;
 46     node *p;
 47     for(i=1;i<=n;i++)
 48     {
 49         p=&adj[i];
 50         while(p!=NULL)
 51         {
 52             cout<<p->adjvex<<' ';
 53             p=p->next;
 54         }
 55         cout<<endl;
 56     }
 57 }
 58 
 59 void topsort(node adj[],int n)
 60 {
 61 
 62     int i;
 63     node *p;
 64     memset(indegree,0,sizeof(indegree));
 65     for(i=1;i<=n;i++)
 66     {
 67 
 68         p=adj[i].next;
 69         while(p!=NULL)
 70         {
 71             indegree[p->adjvex]++;
 72             p=p->next;
 73         }
 74     }
 75     for(i=1;i<=n;i++)
 76     {
 77 
 78         if(indegree[i]==0)
 79             mystack.push(i);
 80     }
 81     int count=0;
 82     while(mystack.size()!=0)
 83     {
 84 
 85         i=mystack.top();
 86         mystack.pop();
 87         cout<<i<<' ';
 88         count++;
 89         for(p=adj[i].next;p!=NULL;p=p->next)
 90         {
 91             int k=p->adjvex;
 92             indegree[k]--;
 93             if(indegree[k]==0)
 94                 mystack.push(k);
 95         }
 96     }
 97     cout<<endl;
 98     if(count<n)cout<<"有回路"<<endl;
 99 }
100 
101 int main()
102 {
103     int n;
104     int m;
105     cout<<"请输入顶点数及边数:";
106     cin>>n>>m;
107     Create(adj,n,m);
108     cout<<"输入的邻接表为:"<<endl;
109     print(n);
110     cout<<"拓扑排序结果为:"<<endl;
111     topsort(adj,n);
112     system("pause");
113     return 0;
114 }

 

 posted on 2017-08-21 19:52  几缕清风依旧  阅读(200)  评论(0编辑  收藏  举报