• 图--拓扑排序--p153


    源程序:在vc++6.0中运行通过

    //  c0,c1,c2,c3,c4四个结点,在程序中和0,1,2,3,4来表示

    //  main.cpp

    //  top_sort

    //

    //  Created by duanqibo on 2019/12/20.

    //  Copyright © 2019年 duanqibo. All rights reserved.

    //

    #include <stdio.h>

    #include <stdlib.h>

    const int vnum=20;

    typedef struct node    //定义栈结构

    {

        int data;

        struct node *next;

    }*LkStk,LkStack;

    typedef struct arcnode

    {

        int adjvex;

        struct arcnode *nextarc;

        //OtherInfo info;

    }ArcNode;

    typedef struct vexnode

    {

        char data;

        struct arcnode *firstarc;

    }VNode, AdjList[vnum];

    typedef struct gp

    {

        AdjList adjlist;    //vertices;

        int vexnum, arcnum;

    }Graph;

    //并声明一个int 类型的indegree[]数组,初始化为0:

    int indegree[vnum] = { 0 };

    //用于记录下标节点的入度。

    //入栈函数:

    LkStk Push(LkStk S, int e)

    {

        LkStk p;

        p = (LkStk)malloc(sizeof(LkStack));

        p->data = e;

        p->next = S;

        S = p;

        return S;

    }

    //出栈操作

    LkStk Pop(LkStk S, int *e)

    {

        LkStk p;

        p = S;

        //if (!p)

        //    return NULL;

        *e = p->data;

        S = S->next;

        free(p);

        return S;

    int LocateVex(Graph *G, char v)

    {

        int i;

        for (i = 0; i < (G->vexnum); i++)

        {

            if (v == G->adjlist[i].data)

                return i;

        }

    }

    void CreateUDG(Graph *G)

    {

        int i, j, k;

        char v1, v2;

        ArcNode *p1;

        printf("输入总节点数和总边数:");

        scanf("%d%d", &G->vexnum, &G->arcnum);

        fflush(stdin);

        printf("输入各个节点的值:");

        for (i = 0; i < G->vexnum; i++)

        {

            scanf("%c", &G->adjlist[i].data);

            G->adjlist[i].firstarc = NULL;

        }

        for (k = 0; k < G->arcnum; k++)

        {

            fflush(stdin);

            printf("输入一条边的两个节点:");

            scanf("%c %c", &v1, &v2);

            i = LocateVex(G, v1);

            j = LocateVex(G, v2);

            p1 = (arcnode *)malloc(sizeof(arcnode));

            p1->adjvex = j;

            p1->nextarc = G->adjlist[i].firstarc;

            G->adjlist[i].firstarc = p1;

            indegree[j]++;

        }

    }

    //注意在创建图过程中记录节点的入度。

    //拓扑排序算法:

    int TopologicalSort(Graph G, int *topo)

    {

        int i, m, k;

        LkStk S;

        ArcNode *p;

        S = NULL;

        for (i = 0; i < G.vexnum; i++)

        {

            if (!indegree[i])

                S = Push(S, i);

        }

        m = 0;

        while(S)

        {

            S = Pop(S, &i);

            topo[m] = i;

            ++m;

            p = G.adjlist[i].firstarc;

            while (p != NULL)

            {

                k = p->adjvex;

                --indegree[k];

                if (indegree[k] == 0)

                    S = Push(S, k);

                p = p->nextarc;

            }

        }

        topo[m] = -1;

        if (m < G.vexnum)

            return 0;

        else

            return 1;

    }

    //主函数

    int main(void)

    {

        Graph G;

        int i;

        int topo[99] = { 0 };

        CreateUDG(&G);

        if (TopologicalSort(G, topo))

        {

            for (i = 0; topo[i] != -1; i++)

            {

                printf("%c ", G.adjlist[topo[i]].data);

            }

        }

        else

            printf("错误");

        printf(" ");

        system("pause");

        return 1;

    }

    运行结果:

     

  • 相关阅读:
    微软WP7本机数据库解决方案之Sqlite
    NSIS nsDialogs Plugin
    NSIS 的 Modern UI 教程
    C# Sqlite For WP7
    铁血规则:事件预订与取消预订[转]
    .NET FRAMEWORK2.0中的农历类
    DefWndProc/WndProc/IMessageFilter的区别
    经典正则表达式分析与收藏
    博客园怎么了?
    .net项目开发工具(最近更新V2.1.0.5)
  • 原文地址:https://www.cnblogs.com/duanqibo/p/12073309.html
Copyright © 2020-2023  润新知