pat拓扑排序

在这里插入图片描述
在这里插入图片描述

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define  TRUE   1
#define  FALSE  0
#define  OK     1
#define  ERROR 0
#define  OVERFLOW  -1
#define MAXSIZE 30
#define VERTEX_MAX 30  
#define VEX_NUM 10

typedef int Status;
typedef char Vextype[20];  
typedef int ElemType;

typedef struct
{
    ElemType elem[MAXSIZE];
    int top;
}SeqStack;            

typedef struct node      
{
    int  adjvex;          
    struct node* next; 
}EdgeNode;
typedef struct vnode   
{
    int Indegree;        
    Vextype  vertex;     
    EdgeNode* firstedge;
}VertexNode;
typedef struct                       
{
    VertexNode adjlist[VERTEX_MAX];
    int n, e;                           
} ALGraph;


void InitStack_Sq(SeqStack& s)                    
{
    s.top = -1;  
}

int Empty_Sq(SeqStack s)                       
{
    if (s.top == -1)
        return 1;
    else
        return 0;
}
Status Push_SeqStack(SeqStack& s, ElemType x)
{
    if (s.top >= MAXSIZE - 1)
        exit(OVERFLOW);
    s.elem[++s.top] = x;
    return OK;
}

Status  Pop_SeqStack(SeqStack& s, ElemType& y)
{
    if (Empty_Sq(s)) 
        return OVERFLOW;           
    else 
    {
        y = s.elem[s.top];
        s.top--;  
        return OK;
    }                                        
}
void CreateALGraph(ALGraph& G)
{
    int i, v, w;
    int Indegree[VERTEX_MAX] = { 0 };
    EdgeNode* s;
    scanf("%d,%d", &(G.n), &(G.e)); 
    for (i = 0; i < G.n; i++)
    {
        scanf("%s", G.adjlist[i].vertex);
        G.adjlist[i].firstedge = NULL;
    }
    for (w = 0; w < G.e; w++) 
    {
        scanf("%d,%d", &i, &v);
        s = (EdgeNode*)malloc(sizeof(EdgeNode));
        s->adjvex = v;
        Indegree[v]++; 
        s->next = G.adjlist[i].firstedge;    
        G.adjlist[i].firstedge = s;
    }
    for (i = 0; i < G.n; i++)
        G.adjlist[i].Indegree = Indegree[i];
}
void topsort(ALGraph& G)
{
    int i, v, w;
    int cnt = 0;//计数器初始化为0
    EdgeNode* ptr;
    SeqStack st;
    InitStack_Sq(st);
    for (i = 0; i < G.n; i++)
    {
        if (!G.adjlist[i].Indegree)
            Push_SeqStack(st, i);
    }
    while (!Empty_Sq(st))
    {
        Pop_SeqStack(st, v);//出栈一次,出栈元素放在v中
        printf("%s ", G.adjlist[v].vertex);
        ++cnt;
        ptr = G.adjlist[v].firstedge; //ptr指向第一个边结点
        while (ptr != NULL)//只要有边
        {
            w = ptr->adjvex;
            --G.adjlist[w].Indegree;
            if (G.adjlist[w].Indegree == 0)
                Push_SeqStack(st, w);
            ptr = ptr->next;
        }
    }
    if (cnt < G.n)
        printf("后续无法输出!\n");
}

int main()
{
    ALGraph g;
    CreateALGraph(g);
    printf("拓扑序列为:");
    topsort(g);
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿猿收手吧!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值