这个图按道理来讲拓扑排序的结果不应该是0,1,2,3,4,5,6,7,8吗(如图二),为什么我的代码输出来的却是逆着的,并且还没有0,感觉代码也都挺完美的
#pragma once
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#define MAXV 20
#define INF 32767
typedef struct ANode
{
int adjvex;
struct ANode* nextarc;
}ArcNode;
typedef struct
{
int count;
ArcNode* firstarc;
}VNode;
typedef struct
{
VNode adjlist[MAXV];
int n;
int e;
}AdjGraph;
void CreateGraph(AdjGraph*& G, int A[][MAXV], int n, int e);
void TopSort(AdjGraph* G);
AdjGraph.cpp:
#include"AdjGraph.h"
void CreateGraph(AdjGraph*& G, int A[][MAXV], int n, int e)
{
G = (AdjGraph*)malloc(sizeof(AdjGraph));
G->n = n;
G->e = e;
int i = 0;
int j = 0;
ArcNode* p = NULL;
for (i = 0; i < G->n; i++)
{
G->adjlist[i].firstarc = NULL;
for (j = 0; j < G->n; j++)
{
if (A[i][j] != 0 && A[i][j] != INF)
{
p = (ArcNode*)malloc(sizeof(ArcNode));
p->adjvex = i;
p->nextarc = G->adjlist[i].firstarc;
G->adjlist[i].firstarc = p;
}
}
}
}
void TopSort(AdjGraph* G)
{
int i = 0;
ArcNode* p = NULL;
int st[MAXV], top = -1;
for (i = 0; i < G->n; i++)//初始化count
{
G->adjlist[i].count = 0;
}
for (i = 0; i < G->n; i++)//计算每个结点的入度
{
p = G->adjlist->firstarc;
while (p != NULL)
{
G->adjlist[p->adjvex].count++;
p = p->nextarc;
}
}
for (i = 0; i < G->n; i++)//让每个度为0的入栈
{
if (G->adjlist[i].count == 0)
{
st[++top] = i;
}
}
while (top != -1)
{
i = st[top--];
printf("%d ", i);
p = G->adjlist[i].firstarc;
while (p != NULL)
{
G->adjlist[p->adjvex].count--;
if (G->adjlist[p->adjvex].count == 0)
{
st[++top] = p->adjvex;
}
p = p->nextarc;
}
}
}
test.cpp:
#include"AdjGraph.h"
int main()
{
int A[MAXV][MAXV] = {
{0, 6, 4, 5, INF, INF, INF, INF, INF},
{INF, 0, INF, INF, 1, INF, INF, INF, INF},
{INF, INF, 0, INF, 1, INF, INF, INF, INF},
{INF, INF, INF, 0, INF, INF, INF, 2, INF},
{INF, INF, INF, INF, 0, 9, 7, INF, INF},
{INF, INF, INF, INF, INF, 0, INF, INF, 2},
{INF, INF, INF, INF, INF, INF, 0, INF, 4},
{INF, INF, INF, INF, INF, INF, INF, 0, 4},
{INF, INF, INF, INF, INF, INF, INF, INF, 0} };
int n = 9, e = 11;
AdjGraph* G;
CreateGraph(G, A, n, e);
TopSort(G);
return 0;
}