c语言用结构体描述矩阵,C语言利用图的邻接矩阵的存储方式实现拓扑排序

要求:入度为零的顶点用栈存储。

Input

输入数据:

第1行:顶点数,弧数

第2行开始,每行输入一个顶点偶对,例如:vi,vj

Output

输出数据:

以空格分隔的拓扑序列,如果存在环,则输出空或者部分顶点。

Sample Input

6,8

0,1

0,2

0,3

2,1

2,4

3,4

5,3

5,4

Sample Output

5 0 2 1 3 4

想要输出5  0  2  1  3   4这个顺序:我们需要做的如下步骤。

获取这个图的所有顶点的入度,存入一个stack(栈)/或者队列,便于动态的存取顶点;

删除入度为0的顶点,并把关联的顶点的入度-1,输出这个删除的顶点;

-1之后,再次检查图中是否有入度为0的顶点;

下面是预编译文件和结构体,我们需要声明一个邻接矩阵和栈;

#include #include #define STACK_SIZE 30

#define Max_Vetex_Num 100

typedef struct {

int vexs[Max_Vetex_Num];

int arcs[Max_Vetex_Num][Max_Vetex_Num];

int vexnum,arcnum;

}Mgraph;

typedef struct{

int *base;

int *top; //栈顶指针

int size;

}seqStack;

关于栈的操作,我在最后会贴上代码,分别是初始化,入栈,出栈,检空等...

然后就是关于拓扑排序的函数操作,我们需要两个函数,1.获取所有的入度,2.对这些入度为0的顶点进行删除和入度-1等操作。

void FindIndegree(Mgraph *G,int indegree[])

{

int i;

int j;

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

{

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

{

if(G->arcs[j][i]==1){

indegree[i]++;

}

}

}/*for*/

}/*end*/

void TopSort(Mgraph *G){

int i,j,k;

int count;

int indegree[G->vexnum];

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

{

indegree[i] = 0;

}

FindIndegree(G,indegree);

seqStack s;

InitStack(&s);

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

{

//入度为0的顶点入栈

if(indegree[i]==0){

Push(&s,i);

}

}

count =0;

while(!IsEmpty(&s)){

Pop(&s,&i);

printf("%d ",i);

++count;

int x;

for(x = 0;xvexnum;x++){

k = G->arcs[i][x];

if(k==1){

if((--indegree[x]==0)){

Push(&s,x);

}

}/*if*/

}/*for*/

}/**/

/*回路异常*/

if(countvexnum){

exit(0);

}

}

怎么创建一个邻接矩阵呢,我们在之前的博文里面已写过了一个邻接矩阵的创建函数这里就不多阐述。

下面是所有的代码,包括栈操作,main函数,创建邻接矩阵函数。

#include #include #define STACK_SIZE 30

#define Max_Vetex_Num 100

typedef struct {

int vexs[Max_Vetex_Num];

int arcs[Max_Vetex_Num][Max_Vetex_Num];

int vexnum,arcnum;

}Mgraph;

typedef struct{

int *base;

int *top; //栈顶指针

int size;

}seqStack;

int InitStack(seqStack *s){

s->base = (int *)malloc(STACK_SIZE* sizeof(seqStack));//动态分配30个单位的stack

//省略是否空间满

s->top = s->base;//栈顶和栈尾相同,栈里面没有元素

s->size = STACK_SIZE;

return 1;

}

int Push(seqStack *s,int x){

*s->top = x;

s->top++;

return 1;

}

int Pop(seqStack *s,int *x){

if(s->top == s->base)return 0;

else{

s->top--;

*x = *s->top;

return 1;

}

}

int IsEmpty(seqStack *s){

if(s->top==s->base){

return 1;

}else{

return 0;

}

}

int GetTop(seqStack *s, int *x){

if(s->top==s->base)

return 0;

else{

*x=*(s->top-1);

return 1;

}

}

void FindIndegree(Mgraph *G,int indegree[])

{

int i;

int j;

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

{

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

{

if(G->arcs[j][i]==1){

indegree[i]++;

}

}

}/*for*/

}/*end*/

void TopSort(Mgraph *G){

int i,j,k;

int count;

int indegree[G->vexnum];

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

{

indegree[i] = 0;

}

FindIndegree(G,indegree);

seqStack s;

InitStack(&s);

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

{

//入度为0的顶点入栈

if(indegree[i]==0){

Push(&s,i);

}

}

count =0;

while(!IsEmpty(&s)){

Pop(&s,&i);

printf("%d ",i);

++count;

int x;

for(x = 0;xvexnum;x++){

k = G->arcs[i][x];

if(k==1){

if((--indegree[x]==0)){

Push(&s,x);

}

}/*if*/

}/*for*/

}/**/

/*回路异常*/

if(countvexnum){

exit(0);

}

}

void CreateMGraph(Mgraph *G){

int type;

int i,j,k,w;

int v1,v2;

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

//自动构造顶点信息为index

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

{

G->vexs[i]=i;

}

//初始化邻接矩阵,全部为0

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

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

G->arcs[i][j]=0;

}

}

//输入每行一个边的偶对,如v1,v2

for(k=0;karcnum;k++)

{

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

G->arcs[v1][v2]=1;

}

//PrintVex(G);

}

int main()

{

Mgraph G;

CreateMGraph(&G);

//PrintVex(&G);

TopSort(&G);

return 0;

}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值