拓扑排序算法
#include <stdio.h>#include <malloc.h>#include <string.h>#define MAXVEX 100typedef char VertexType[3]; /*定义VertexType为char数组类型*/typedef struct vertex{ int adjvex; VertexType data;} VType;typedef struct graph{ int n,e; /*n为实际顶点数,e为实际边数*/ VType vexs[MAXVEX]; /*顶点集合*/ int edges[MAXVEX][MAXVEX]; /*边的集合*/} AdjMatix; /*图的邻接矩阵类型*/typedef struct edgenode{ int adjvex; /*邻接点序号*/ int value; /*边的权值*/ struct edgenode *next; /*下一条边的顶点*/} ArcNode; /*每个顶点建立的单链表中结点的类型*/typedef struct vexnode{ VertexType data; /*结点信息*/ int count; /*存放顶点入度,新增用于拓扑排序*/ ArcNode *firstarc; /*指向第一条边结点*/} VHeadNode; /*单链表的头结点类型*/typedef struct { int n,e; /*n为实际顶点数,e为实际边数*/ VHeadNode adjlist[MAXVEX]; /*单链表头结点数组*/} AdjList; /*图的邻接表类型*/void DispAdjList(AdjList *G) /*显示邻接表(含顶点入度)*/{ int i; ArcNode *p; printf("图的邻接表表示如下:\n"); for (i=0;i<G->n;i++) { printf(" [%d,%3s:]=>",i,G->adjlist[i].data,G->adjlist[i].count); p=G->adjlist[i].firstarc; while (p!=NULL) { printf("(%d,%d)->",p->adjvex,p->value); p=p->next; } printf("∧\n"); }}void MatToList(AdjMatix g,AdjList *&G) /*例6.3算法:将邻接矩阵g转换成邻接表G*/{ int i,j; ArcNode *p; G=(AdjList *)malloc(sizeof(AdjList)); for (i=0;i<g.n;i++) /*给邻接表中所有头结点的指针域置初值*/ { G->adjlist[i].firstarc=NULL; strcpy(G->adjlist[i].data,g.vexs[i].data); } for (i=0;i<g.n;i++) /*检查邻接矩阵中每个元素*/ for (j=g.n-1;j>=0;j--) if (g.edges[i][j]!=0) /*邻接矩阵的当前元素不为0*/ { p=(ArcNode *)malloc(sizeof(ArcNode));/*创建一个结点*p*/ p->value=g.edges[i][j];p->adjvex=j; p->next=G->adjlist[i].firstarc; /*将*p链到链表后*/ G->adjlist[i].firstarc=p; } G->n=g.n;G->e=g.e;}void TopSort(AdjList *G){ int i,j; int St[MAXV],top=-1; /*栈St的指针为top*/ ArcNode *p; for (i=0;i<n;i++) if (adj[i].count==0) /*入度为0的顶点入栈*/ { top++; St[top]=i; } while (top>-1) /*栈不为空时循环*/ { i=St[top];top--; /*出栈*/ printf("%d ",i); /*输出顶点*/ p=adj[i].firstarc; /*找第一个相邻顶点*/ while (p!=NULL) { j=p->adjvex; adj[j].count--; if (adj[j].count==0)/*入度为0的相邻顶点入栈*/ { top++; St[top]=j; } p=p->nextarc; /*找下一个相邻顶点*/ } }}void main(){ int i,j; AdjMatix g; AdjList *G; int a[6][6]={ {0,1,0,10},{1,0,1,0,0},{0,1,0,1,1},{1,0,1,0,1},{0,0,1,1,0} }; char *vname[MAXVEX]={"a","b","c","d","e"}; g.n=5;g.e=12; /*建立图6.1(a)的无向图,每1条无向边算为2条有向边*/ for (i=0;i<g.n;i++) strcpy(g.vexs[i].data,vname[i]); for (i=0;i<g.n;i++) for (j=0;j<g.n;j++) g.edges[i][j]=a[i][j]; MatToList(g,G); /*生成邻接表*/ DispAdjList(G); /*输出邻接表*/ for (i=0;i<g.n;i++) visited[i]=0; /*顶点标识置初值*/ printf("从顶点0的深度优先遍历序列:\n"); printf(" 递归算法:");DFS(G,0);printf("\n"); for (i=0;i<g.n;i++) visited[i]=0; /*顶点标识置初值*/ printf(" 非递归算法:");DFS1(G,0);printf("\n");}