• 拓扑排序算法

    拓扑排序算法

    1. #include <stdio.h>
    2. #include <malloc.h>
    3. #include <string.h>
    4. #define MAXVEX 100
    5. typedef char VertexType[3]; /*定义VertexType为char数组类型*/
    6. typedef struct vertex
    7. {
    8. int adjvex;
    9. VertexType data;
    10. } VType;
    11. typedef struct graph
    12. {
    13. int n,e; /*n为实际顶点数,e为实际边数*/
    14. VType vexs[MAXVEX]; /*顶点集合*/
    15. int edges[MAXVEX][MAXVEX]; /*边的集合*/
    16. } AdjMatix; /*图的邻接矩阵类型*/
    17. typedef struct edgenode
    18. {
    19. int adjvex; /*邻接点序号*/
    20. int value; /*边的权值*/
    21. struct edgenode *next; /*下一条边的顶点*/
    22. } ArcNode; /*每个顶点建立的单链表中结点的类型*/
    23. typedef struct vexnode
    24. {
    25. VertexType data; /*结点信息*/
    26. int count; /*存放顶点入度,新增用于拓扑排序*/
    27. ArcNode *firstarc; /*指向第一条边结点*/
    28. } VHeadNode; /*单链表的头结点类型*/
    29. typedef struct
    30. {
    31. int n,e; /*n为实际顶点数,e为实际边数*/
    32. VHeadNode adjlist[MAXVEX]; /*单链表头结点数组*/
    33. } AdjList; /*图的邻接表类型*/
    34. void DispAdjList(AdjList *G) /*显示邻接表(含顶点入度)*/
    35. {
    36. int i;
    37. ArcNode *p;
    38. printf("图的邻接表表示如下:\n");
    39. for (i=0;i<G->n;i++)
    40. {
    41. printf(" [%d,%3s:]=>",i,G->adjlist[i].data,G->adjlist[i].count);
    42. p=G->adjlist[i].firstarc;
    43. while (p!=NULL)
    44. {
    45. printf("(%d,%d)->",p->adjvex,p->value);
    46. p=p->next;
    47. }
    48. printf("∧\n");
    49. }
    50. }
    51. void MatToList(AdjMatix g,AdjList *&G) /*例6.3算法:将邻接矩阵g转换成邻接表G*/
    52. {
    53. int i,j;
    54. ArcNode *p;
    55. G=(AdjList *)malloc(sizeof(AdjList));
    56. for (i=0;i<g.n;i++) /*给邻接表中所有头结点的指针域置初值*/
    57. {
    58. G->adjlist[i].firstarc=NULL;
    59. strcpy(G->adjlist[i].data,g.vexs[i].data);
    60. }
    61. for (i=0;i<g.n;i++) /*检查邻接矩阵中每个元素*/
    62. for (j=g.n-1;j>=0;j--)
    63. if (g.edges[i][j]!=0) /*邻接矩阵的当前元素不为0*/
    64. {
    65. p=(ArcNode *)malloc(sizeof(ArcNode));/*创建一个结点*p*/
    66. p->value=g.edges[i][j];p->adjvex=j;
    67. p->next=G->adjlist[i].firstarc; /*将*p链到链表后*/
    68. G->adjlist[i].firstarc=p;
    69. }
    70. G->n=g.n;G->e=g.e;
    71. }
    72. void TopSort(AdjList *G)
    73. {
    74. int i,j;
    75. int St[MAXV],top=-1; /*栈St的指针为top*/
    76. ArcNode *p;
    77. for (i=0;i<n;i++)
    78. if (adj[i].count==0) /*入度为0的顶点入栈*/
    79. {
    80. top++;
    81. St[top]=i;
    82. }
    83. while (top>-1) /*栈不为空时循环*/
    84. {
    85. i=St[top];top--; /*出栈*/
    86. printf("%d ",i); /*输出顶点*/
    87. p=adj[i].firstarc; /*找第一个相邻顶点*/
    88. while (p!=NULL)
    89. {
    90. j=p->adjvex;
    91. adj[j].count--;
    92. if (adj[j].count==0)/*入度为0的相邻顶点入栈*/
    93. {
    94. top++;
    95. St[top]=j;
    96. }
    97. p=p->nextarc; /*找下一个相邻顶点*/
    98. }
    99. }
    100. }
    101. void main()
    102. {
    103. int i,j;
    104. AdjMatix g;
    105. AdjList *G;
    106. 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} };
    107. char *vname[MAXVEX]={"a","b","c","d","e"};
    108. g.n=5;g.e=12; /*建立图6.1(a)的无向图,每1条无向边算为2条有向边*/
    109. for (i=0;i<g.n;i++)
    110. strcpy(g.vexs[i].data,vname[i]);
    111. for (i=0;i<g.n;i++)
    112. for (j=0;j<g.n;j++)
    113. g.edges[i][j]=a[i][j];
    114. MatToList(g,G); /*生成邻接表*/
    115. DispAdjList(G); /*输出邻接表*/
    116. for (i=0;i<g.n;i++) visited[i]=0; /*顶点标识置初值*/
    117. printf("从顶点0的深度优先遍历序列:\n");
    118. printf(" 递归算法:");DFS(G,0);printf("\n");
    119. for (i=0;i<g.n;i++) visited[i]=0; /*顶点标识置初值*/
    120. printf(" 非递归算法:");DFS1(G,0);printf("\n");
    121. }