图--拓扑排序--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("\n");

    system("pause");

    return 1;

}

运行结果:

 

posted @ 2019-12-20 15:23  bobo哥  阅读(187)  评论(0编辑  收藏  举报