标签:
细节!一定要细节啊!!
#include<cstdio>
#include<cstring>
#include<cstdlib>
#define MAXVEX 100
typedef struct EdgeNode{
int adjvex;
int weight;
struct EdgeNode *next;
}EdgeNode;
typedef struct VertexNode{
int in;
int data;
EdgeNode *firstedge;
}VertexNode,AdjList[MAXVEX];
typedef struct{
AdjList adjlist;
int numVertexes,numEdges;
}graphAdjList,*GraphAdjList;
int TopologicalSort(GraphAdjList GL){
EdgeNode *e;
int i,k,gettop;
int top = -1,cnt = 0;
int *stack;
stack = (int *)malloc(GL->numVertexes*sizeof(int));
for(i=0;i<GL->numVertexes;i++){
if(GL->adjlist[i].in == 0){
stack[++top] = i;
printf("%d\n",i);
}
}
// for(i=0;i<top;i++) printf("qqqqqqqq %d\n",stack[i]);
// printf("stack is %d\n",top);
while(top>-1){
//注意!!!!一定要注意!!!!这里判断条件不是top!=0 !!!!
//注意!!!!一定要注意!!!!这里判断条件不是top!=0 !!!!
//注意!!!!一定要注意!!!!这里判断条件不是top!=0 !!!!
//注意!!!!一定要注意!!!!这里判断条件不是top!=0 !!!!
gettop = stack[top--];
// printf("%d top = %d\n",GL->adjlist[gettop].data,top);
printf("%d ",GL->adjlist[gettop].data);
cnt++;
for(e = GL->adjlist[gettop].firstedge;e;e = e->next){
k = e->adjvex;
// printf("adjlist[%d].in = %d\n",k,GL->adjlist[k].in);
if(!(--GL->adjlist[k].in)){
stack[++top] = k;
// printf("k = %d\n",k);
}
}
// printf("top == %d\n",top);
}
printf("\n");
if(cnt<GL->numVertexes) return 0;
else return 1;
}
void CreateGraph(GraphAdjList G){
int i,j,k,w;
EdgeNode *e;
printf("请输入顶点数和边数:\n");
scanf("%d %d",&G->numVertexes,&G->numEdges);
for(i=0;i<G->numVertexes;i++){
G->adjlist[i].data = i;
G->adjlist[i].in = 0;
G->adjlist[i].firstedge = NULL;
}
for(k=0;k<G->numEdges;k++){
// printf("请输入边(vi,vj)上的下标i,下标j和权w:\n");
scanf("%d %d",&i,&j);
EdgeNode *temp = G->adjlist[i].firstedge;
if(temp == NULL){
EdgeNode *NewEdge = (EdgeNode *)malloc(sizeof(EdgeNode));
NewEdge->adjvex = j;
// NewEdge->weight = w;
NewEdge->next = NULL;
G->adjlist[i].firstedge = NewEdge;
G->adjlist[j].in++;
}else{
while(temp->next!=NULL) temp = temp->next;
EdgeNode *NewEdge = (EdgeNode *)malloc(sizeof(EdgeNode));
NewEdge->adjvex = j;
// NewEdge->weight = w;
NewEdge->next = NULL;
temp->next = NewEdge;
G->adjlist[j].in++;
}
}
}
void test(graphAdjList G){
int i,j,k;
for(i=0;i<G.numVertexes;i++){
// printf("%d %d\n",G.adjlist[i].data,G.adjlist[i].in);
printf("%d %d ",G.adjlist[i].in,G.adjlist[i].data);
if(G.adjlist[i].firstedge){
EdgeNode *temp = G.adjlist[i].firstedge;
while(temp){
printf("%d ",temp->adjvex);
temp = temp->next;
}
}
else
printf("no");
printf("\n");
}
}
int main(){
graphAdjList G;
CreateGraph(&G);
printf("sssssssssssssssssssssssssssssss\n");
//test(G);
printf("sssssssssssssssssssssssssssssss\n");
printf(" %d\n",TopologicalSort(&G));
return 0;
}
/*
14 20
0 11
0 5
0 4
1 8
1 4
1 2
2 9
2 6
2 5
3 13
3 2
4 7
5 12
5 8
6 5
8 7
9 11
9 10
10 13
12 9
*/
标签:
原文地址:http://www.cnblogs.com/zhuozhuo/p/5418331.html