c语言 拓补排序源代码,c语言实现拓扑排序

/*

* c语言实现拓扑排序.

*/

#include

#include

#define MAX_VERTEX_NUM 30

#define INFINITY 0

/** 用链表实现栈 */

typedef int DataType;

typedef struct stack

{

DataType data;

struct stack *next;

}Stack;

Stack *S=NULL;

void InitStack() {

S=(Stack *)malloc(sizeof(Stack));

S->next = NULL;

}

int StackEmpty() {

return S->next == NULL;

}

void Push(DataType value) {

Stack *new_node = NULL;

if((new_node=(Stack *)malloc(sizeof(Stack)))==NULL) {

printf("memory alloc error!/n");

}

new_node->data = value;

new_node->next = S->next;

S->next = new_node;

}

void Pop() {

Stack *first_node;

if(StackEmpty()) {

printf("Stack is empty!/n");

return;

}

first_node=S;

S = first_node->next;

free(first_node);

}

DataType GetTop() {

return S->next->data;

}

void StackPrint() {

Stack *stack=NULL;

printf("The elements of stack are: /n");

for(stack=S->next; stack!=NULL; stack=stack->next)

printf("%d/n",stack->data);

}

/** 用邻接矩阵实现图的存储 */

typedef struct ArcCell {

int power;

char info; //have not used!

}ArcCell;

typedef struct {

char vexs[MAX_VERTEX_NUM];

ArcCell arcs[MAX_VERTEX_NUM][MAX_VERTEX_NUM];

int vexnum, arcnum;

}MGraph;

/** 定位顶点位置的函数 */

int LocateVex(MGraph *G, char c) {

for(int i=0; ivexnum; ++i) {

if(c==G->vexs[i]) return i;

}

}

void PrintVex(MGraph *G, int index) {

putchar(G->vexs[index]);

}

/** 有向画的创建 */

void CreateDG(MGraph *G) {

printf("请输入顶点数目按回车继续: /n");

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

getchar();/*用来吸收键入的回车符*/

printf("请输入弧数目按回车继续: /n");

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

getchar();/*用来吸收键入的回车符*/

printf("请输入各顶点的字符表示,如/"abcdef/",按回车继续: /n");

for(int k=0; kvexnum; ++k) {

scanf("%c", &G->vexs[k]);

//printf("%c",G->vexs[k]);

}

getchar();/*用来吸收键入的回车符*/

//char temp; temp = getchar();/*用来做测试的语句*/

//for(int n=0; nvexnum; ++n) printf("%c", G->vexs[n]);/*用来做测试

的语句*/

for(int i=0; ivexnum; ++i)

for(int j=0; jvexnum; ++j)

G->arcs[i][j].power = INFINITY;

char vex1, vex2;

int power;

for(int m=0; marcnum; ++m) {

printf("输入一条边依附的顶点,如/"a,b/"按回车继续: /n ");

scanf("%c,%c", &vex1, &vex2);

int i = LocateVex(G, vex1), j = LocateVex(G, vex2);

//printf("%d,%d/n", i, j);/*用来做测试的语句*/

G->arcs[i][j].power = 1;

getchar();/*用来吸收键入的回车符*/

}

//printf("%d,%d",G->arcnum,G->vexnum);

//printf("/n%d", G->arcs[0][1].power);

}

void PrintMatrix(MGraph *G) {

for(int i=0; ivexnum; i++) {

printf("/n");

for(int j=0; jvexnum; j++)

printf("%d", G->arcs[i][j].power);

}

}

int FindInDegree(MGraph *G, int i) {

int indegreecount = 0;

for(int j=0; jvexnum; ++j) {

if(G->arcs[j][i].power == 1) indegreecount++;

}

return indegreecount;

}

/** 用来判断顶点的下一个邻接点 */

int NextVex(MGraph *G, int i, int j) {

for(; jvexnum; ++j) {

if(G->arcs[i][j].power == 1) return j;

}

return G->vexnum;

}

/** 拓扑排序函数 */

void TopologicalSort(MGraph *G) {

int indegree[G->vexnum];

for(int i=0; ivexnum; ++i) {

indegree[i] = FindInDegree(G, i);

//printf("%d/n", indegree[i]);/*用来做测试的语句*/

}

InitStack();

for(int i=0; ivexnum; ++i) {

if(!indegree[i]) Push(i);

}

int count = 0;

//printf("%d/n", S->next->data);/*用来做测试的语句*/

printf("Topological sort: /n");

while(!StackEmpty()) {

int t = GetTop();

Pop();

PrintVex(G, t);

printf("->");

count++;

for(int j=NextVex(G, t, 0); jvexnum; j=NextVex(G ,t,++j)) {

if(!--indegree[j]) Push(j);

}

}

if(countvexnum) printf("该有向图有回路");

}

int main() {

MGraph mgraph, *G;

G = &mgraph;

CreateDG(G);

//PrintMatrix(G);/*用来做测试的语句*/

TopologicalSort(G);

return 0;

}

//如输入

//6

//8

//abcdef

//a,b

//a,c

//a,d

//b,c

//c,e

//c,f

//d,e

//e,f

//输出结果为

//a->d->b->c->e->f->

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

0818b9ca8b590ca3270a3433284dd417.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值