#include<stdio.h>
#include<stdlib.h>
struct stack{
int *data;
int top;
int maxSize;
};
struct node{
int index;
struct node *next;
};
struct table{
struct node **body;
int tablesize;
};
int map[6][6]={
0,1,1,1,0,0,
0,0,0,0,0,0,
0,1,0,0,1,0,
0,0,0,0,1,0,
0,0,0,0,0,0,
0,0,0,1,1,0
};
struct stack *createStack(int maxsize){
struct stack *s;
s=(struct stack *)malloc(sizeof(struct stack));
s->data=(int *)malloc(sizeof(int)*maxsize);
s->top=-1;
s->maxSize=maxsize;
return s;
}
int isFull(struct stack *s){
return s->top==s->maxSize-1;
}
int isEmpty(struct stack *s){
return s->top==-1;
}
void push(struct stack *s,int num){
if(isFull(s)){
printf("stack is full\n");
return;
}
s->data[++s->top]=num;
}
int pop(struct stack *s){
if(isEmpty(s)){
printf("stack is empty\n");
exit(-1);
}
return s->data[s->top--];
}
struct table *createTable(int size){
struct table *T;
T=(struct table *)malloc(sizeof(struct table));
T->tablesize=size;
T->body=(struct node **)malloc(sizeof(struct node *)*T->tablesize);
for(int i=0;i<T->tablesize;i++){
T->body[i]=(struct node *)malloc(sizeof(struct node));
T->body[i]->index=0;
T->body[i]->next=NULL;
}
for(int i=0;i<T->tablesize;i++){
for(int j=0;j<T->tablesize;j++){
if(map[i][j]==1){
struct node *p,*q;
p=T->body[i];
q=(struct node *)malloc(sizeof(struct node));
q->index=j;
q->next=p->next;
p->next=q;
T->body[j]->index++;
}
}
}
return T;
}
int main(){
struct stack *s;
int n=6;
s=createStack(n);
struct table *T;
T=createTable(n);
for(int i=0;i<T->tablesize;i++){
if(T->body[i]->index==0){
push(s,i);/*入队剩余入度为零的元素*/
}
}
int a[n];
int k=0;
while(!isEmpty(s)){/*当栈不为空时,出栈*/
a[k]=pop(s);
struct node *q;
q=T->body[a[k]]->next;
while(q!=NULL){/*对出栈的元素进行处理,将出栈元素能抵达点的对应入度减一*/
T->body[q->index]->index--;
if(T->body[q->index]->index==0){
push(s,q->index);/*一旦有新的元素的入度为零,就将其压栈*/
}
q=q->next;
}
k++;
}
printf("拓扑排序的一种情况:");
for(int i=0;i<T->tablesize;i++){
printf("%3d",a[i]);
}
return 0;
}