1、韩山师范学院实验题目:拓扑排序算法实现班级:2015 级软工班作者:黄俊聪#includeusing namespace std;#define MVNum 100/最大顶点数 #define OK 1#define ERROR 0typedef int Status;typedef string VerTexType;typedef int OtherInfo;typedef struct ArcNode/边结点 int adjvex;/该边所指向的顶点的位置 struct ArcNode* nextarc;/指向下一条边的指针 OtherInfo info;/和边相关的信息 ArcNode
2、;typedef struct VNode/顶点信息 VerTexType data;ArcNode* firstarc;/指向第一条依附该顶点的边的指针 VNode,AdjListMVNum;/Adjlist 表示邻接表类型 typedef structAdjList vertices;int vexnum,arcnum;/图的当前顶点数 ALGraph;typedef struct StackNodeint data;struct StackNode* next;StackNode,*LinkStack;Status InitStack(LinkStackreturn OK;Status
3、Push(LinkStackp=new StackNode;p-data=e;p-next=S;S=p;return OK;Status Pop(LinkStackp=new StackNode;if(S=NULL)return ERROR;e=S-data;p=S;S=S-next;delete p;return OK;Status StackEmpty(LinkStack S)if(S=NULL)return OK;elsereturn ERROR;Status LocateVex(ALGraph G,string v)int i;for(int i=0;iG.vexnumG.arcnum
4、;/输入总顶点数和总边数coutG.verticesi.data;/输入顶点值 G.verticesi.firstarc=NULL;/初始化表头结点的指针域为 NULL coutv1v2;/输入一条边依附的两个顶点 i=LocateVex(G,v1);j=LocateVex(G,v2);/确定 v1 和 v2 在 G 中的位置,即顶点在 G.vertices 中的序号 p1=new ArcNode;/生成一个新的边结点*p1 p1-adjvex=j;/邻接点序号为 j p1-nextarc=G.verticesi.firstarc;G.verticesi.firstarc=p1;/将新结点*p
5、1 插入顶点 v1 的边表头部 return OK;Status FindInDegree(ALGraph G,int indegree)ArcNode* p;for(int i=0;inextarc)indegreep-adjvex+;/*出度不为零,则该顶点 firstarc 域指向的弧指向的顶点入度加一*/return OK;Status TopologicalSort(ALGraph G,int topo)LinkStack S; ArcNode* p;int i;int indegreeG.vexnum;FindInDegree(G,indegree);InitStack(S);for(i=0;iadjvex;-indegreek;if(indegreek=0)Push(S,k);p=p-nextarc;if(mG.vexnum)return ERROR;elsereturn OK;int main()ALGraph G;CreateUDG(G);int topoG.vexnum;TopologicalSort(G,topo);