邻接表存储的拓扑排序
#include<stdio.h>
#include<malloc.h>
const int N=20;
typedef struct edgenode /*图的邻接表:邻接链表结点*/
{
int adjvex;
struct edgenode *next;
} edgenode;
typedef struct vnode /*图的邻接表:邻接表*/
{
char data;
int ind;
struct edgenode *link;
} vnode;
int createGraph_list(vnode adjlist[],int *p);
void topSort(vnode g[],int n);
int createGraph_list(vnode adjlist[],int *p)
{
int i,j,n,e;
char v;
edgenode *s;
i=0;
n=0;
e=0;
printf("输入顶点序列(以#结束):\n");
while((v=getchar())!='#')
{
adjlist[i].data=v;
adjlist[i].link=NULL;
adjlist[i].ind=0;
i++;
}
n=i;
*p=n;
printf("\n请输入弧的信息(i=-1结束):i,j:\n");
scanf("%d,%d",&i,&j);
while(i!=-1)
{
s=(struct edgenode*)malloc(sizeof(edgenode));
s->adjvex=j;
s->next=adjlist[i].link;
adjlist[i].link=s;
adjlist[j].ind++;
e++;
scanf("%d,%d",&i,&j);
}
printf("邻接表:");
for(i=0; i<n; i++)
{
printf("\n%c,%d:",adjlist[i].data,adjlist[i].ind);
s=adjlist[i].link;
while(s!=NULL)
{
printf("->%d",s->adjvex);
s=s->next;
}
}
return n;
}
void topSort(vnode g[],int n)
{
printf("输入拓扑排序顶点序列:\n");
int i,j,k,m=0,top=-1;
struct edgenode *p;
for (i=0; i<=n; i++)
if (g[i].ind==0)
{
g[i].ind=top;
top=i;
}
while (top!=-1)
{
j=top;
top=g[top].ind;
printf("%c",g[j].data);
m++;
p=g[j].link;
while (p)
{
k=p->adjvex;
g[k].ind--;
if (g[k].ind==0)
{
g[k].ind=top;
top=k;
}
p=p->next;
}
}
}
int main()
{
vnode adjlist[N];
int n,*p;
int m;
p=&n;
m=createGraph_list(adjlist,p);
printf("\n");
topSort(adjlist,m-1);
return 0;
}