邻接表存储的拓扑排序

邻接表存储的拓扑排序

#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++;  /*顶点j的入度加1*/
        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;
        }
    }
// if (m<n)
// printf("该图存在环\n");
}

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;
}
    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/qq_39535750/article/details/78676412
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞