拓扑排序

xiaoxiao2021-02-27  375

#include<iostream> #include<stdio.h> #include "Stack.h" #define Status int #define MAXVEX  100 #define OK 0 #define ERROR -1 using namespace std; typedef struct EdgeNode  /*边结点*/ {        int adjvex;//邻接点域,存储该顶点对应的下标        struct EdgeNode *next;//指向下一条弧的指针 }EdgeNode; typedef struct VertexNode  /*顶点表结点*/ {        int in;  //顶点的入度        char data;  //顶点域,存储顶点信息        EdgeNode *firstedge;//边表头指针 }VertexNode, AdjList[MAXVEX]; typedef struct         //图结构 {      AdjList adjList;  //邻接表      int numVertexes, numEdges; //顶点数和弧数 }ALGraph; //找到顶点所在数组的位置  int  LocateVex(ALGraph G,char v){       for(int i = 0; i<G.numVertexes; ++i){    //头结点表          if( G.adjList[i].data==v){          return i;       }     //输入顶点值      }      return ERROR;  } Status CreateUDG(ALGraph &G){//采用邻接表表示法,创建无向图G      cout<<"输入图的顶点数目和边的数目:";      char v1,v2;      EdgeNode *p1;      int i,j;      cin>>G.numVertexes;      cin>>G.numEdges;    //输入总顶点数,总边数       cout<<"输入图的顶点:";      for(int m=0; m<G.numVertexes; ++m){    //输入各点,构造头结点表        cin>> G.adjList[m].data;     //输入顶点值        G.adjList[m].firstedge=NULL; //初始化表头结点的指针域为NULL         G.adjList[m].in=0;      }     //for      cout<<"按方向输入图的边的关联的两个顶点:";     for(int k = 0; k<G.numEdges;++k){                //输入各边,构造邻接表        cin>>v1>>v2;                             //输入一条边依附的两个顶点v1->v2        i = LocateVex(G, v1);  //找到顶点所在的位置        j = LocateVex(G, v2);       //将新结点*p1插入顶点vi的边表头部        p1=new EdgeNode; //生成一个新的边结点*p1        p1->adjvex=j;     //邻接点序号为j        p1->next= G.adjList[i].firstedge;        G.adjList[i].firstedge=p1;        //v2入度加一        G.adjList[j].in++;     }//for     return OK; }//CreateUDG //拓扑排序,若GL无回路,则输出拓扑排序序列并返回OK,若有回路返回ERROR Status TopologicalSort(ALGraph GL) {           Stack s;           EdgeNode *e;           int i, k, gettop;           int count=0;//用于统计输出顶点的个数           for(i=0;i<GL.numVertexes; i++)             if(GL.adjList[i].in==0)                  s.push(i); //将入度为0的顶点的下标入栈          while(s.isEmpty()==false)//栈不是空的时候          {            gettop=s.pop();//得到栈顶中顶点的下标            //cout<<s.pop()<<" "; //打印此顶点            cout<<GL.adjList[gettop].data<<" "; //打印此顶点           // cout<<GL.adjList[0].data<<" "; //打印此顶点            count++;//顶点数加一            e=GL.adjList[gettop].firstedge;//得到该顶点的第一条边            while(e!=NULL)             {                  //cout<<"进入"<<" "; //打印此顶点                k=e->adjvex;//得到第一个对应的顶点数组下标                 GL.adjList[k].in--;                 int n= GL.adjList[k].in;                if(n==0)//将k号顶点邻接点的入度减1                   s.push(k);//若为0,则入栈                 e=e->next;             }         }         if (count< GL.numVertexes)             return ERROR;         else             return OK; } int main(){     ALGraph G;     CreateUDG(G);     TopologicalSort(G);     }

//栈文件

#ifndef STACK_H_INCLUDED #define STACK_H_INCLUDED #define MAX 100 class Stack{ private:     int  s[MAX];     int head; public:     //初始化栈     Stack(){         head = 0;     }    //出栈     int pop(){         char t;         if(head>0){             t = s[--head];//先减,后pop         }         return t;     }     //入栈     void push(int value){//后加         s[head++] = value;     }     //栈是否为空     bool isEmpty(){         if(head==0)             return true;         return false;     } }; #endif // STACK_H_INCLUDED

转载请注明原文地址: https://www.6miu.com/read-4074.html

最新回复(0)