拓扑排序算法

拓扑排序算法

/实验内容:
1.创建一张有向网;
2.给出该图的拓扑有序序列;
/
#include “stdio.h”
#include “malloc.h”
#include<stdlib.h>
#define MAXLEN 40
typedef int SElemType;
typedef int Status;
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define OVERFLOW -1
typedef char VEXTYPE;
typedef struct node
{
int adjvex;
struct node *next;
}ARCNODE;
typedef struct
{
int InDegree,OutDegree;
char data;
ARCNODE *firstarc;
}VEXNODE;
typedef struct
{
VEXNODE vertices[MAXLEN];
int vexnum, arcnum;
}ALGRAPH;
ALGRAPH creat_graph()//创建一张图
{
int i,j,k;
ALGRAPH G;
ARCNODE *s;
printf(“请输入顶点和弧的个数(用逗号隔开):”);
scanf("%d,%d",&G.vexnum,&G.arcnum);
for (i=0;i<G.vexnum;i++)
{
printf(“请输入第%d个顶点的值:”,i+1);
fflush(stdin);/fflush(stdin)是用来清空输入缓冲区,通常是为了确保不影响后面的数据读取,
例如在读完一个字符串后紧接着又要读取一个字符,此时应该先执行fflush(stdin)。
/
scanf("%c",&G.vertices[i].data);
G.vertices[i].firstarc=NULL;
}
for (i=0;i<G.vexnum;i++){
G.vertices[i].InDegree=0;
G.vertices[i].OutDegree=0;
}
for(i=0;i<G.arcnum;i++)
{
printf(“请输入第%d条边的起始顶点和终止顶点的下标(用逗号隔开)”,i+1);
fflush(stdin);
scanf("%d,%d",&j,&k);
G.vertices[k].InDegree++;
G.vertices[j].OutDegree++;
s=(ARCNODE *)malloc(sizeof(ARCNODE));
s->adjvex=k;
s->next=G.vertices[j].firstarc;
G.vertices[j].firstarc=s;
}
return G;
}
typedef struct StackNode
{
SElemType data;
struct StackNode *next;
} StackNode,*LinkStack;
Status InitStack(LinkStack &S)
{ // 构造一个带头结点的空栈S
S=(LinkStack)malloc(sizeof(StackNode));
S->next=NULL;
return OK;
}
int StackEmpty(LinkStack S)
{ // 判断栈是否为空栈
return S->nextNULL;
}
Status Push(LinkStack &S,SElemType e)
{ // 插入元素e为新的栈顶元素
LinkStack p;
p=(LinkStack)malloc(sizeof(StackNode));
p->data=e;
p->next=S->next;
S->next=p;
return OK;
}
Status Pop(LinkStack S){
SElemType x;
LinkStack p;
p=S->next;
if(StackEmpty(S))return ERROR;
x=p->data;
S->next=p->next;
free§;
return x;
}
void PrintStack(LinkStack S)
{ // 从栈底到栈顶依次对栈中每个元素调用函数visit()。
// 一旦visit()失败,则操作失败
SElemType x;
while(S->next!=NULL)
{
x=Pop(S);
printf("%d",x);
}
}
int TopologicalSort(ALGRAPH G)
{
int i,j,count=0;
LinkStack S;
InitStack(S);
ARCNODE *p;
for (i=0;i<G.vexnum;i++)
if(G.vertices[i].InDegree
0)
Push(S,i);
while(!StackEmpty(S)){
i=Pop(S);
printf("%3c",G.vertices[i].data);
count++;
for (p=G.vertices[i].firstarc;p;p=p->next)
{
j=p->adjvex;
if(!(–G.vertices[j].InDegree))
Push(S,j);
}

}
if(count<G.vexnum)
	return FALSE;
else
    return OK;

}
int main()
{
ALGRAPH G;
G=creat_graph();
printf(“该图的拓扑有序序列:\n”);
TopologicalSort(G);
return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值