《C语言-数据结构篇章》-图的拓扑排序》

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
理解了用处之后我们就可以开始上代码了;

1.建立好领接表

typedef struct vex
{
	int vex_position;
	int vex_weight;
	struct vex *next;
}vex;
typedef struct node
{
	char node;
	int node_position;
	vex *head;
}node;
typedef struct digraphy
{
   node node_array[max+1];
   int node_number;
   int vex_number;
}digraphy;
int in_degree[max+1]={0};//用来保存建立好领结表的入度情况```

**如下图所示**![建立好领接表](https://img-blog.csdnimg.cn/20191202223114954.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NTU0MDk2NA==,size_16,color_FFFFFF,t_70)


**代码如下**

```cpp
/创建结点的关系
vex* create_vex_relation()
{
	vex *pnew;
	int vexa;
	printf("请输入边的关系,0结束\n");
	scanf("%d",&vexa);
	getchar();
	if(vexa==0)
	{
		return NULL;
	}
	else
	{
     pnew=(vex *)malloc(sizeof(vex));
     pnew->vex_position=vexa;
     in_degree[vexa]++;
     pnew->vex_weight=1;
     pnew->next=create_vex_relation();
     return pnew;
	}
}
///领接表创建有向图
digraphy* create_digraphy()
{
    digraphy *digra;
    digra=(digraphy *)malloc(sizeof(digraphy));
    printf("输入结点个数和边的数:\n");
    scanf("%d,%d",&digra->node_number,&digra->vex_number);
    getchar();
    printf("请输入%d个结点的信息:\n",digra->node_number);
    for(int i=1;i<=digra->node_number;i++)
    {
    	digra->node_array[i].node_position=i;
    	printf("请输入第%d结点值\n",i);
    	digra->node_array[i].node=getchar();
    	getchar();
        digra->node_array[i].head=create_vex_relation();
    }
   return digra;
}

## 最后关键算法```
用之前的indegree[]数组保存入度关系,如果入度为0就是我们要找的,然后删除这个结点,并且把他有指向的结点的度值减少1.
因有度值顺序原因,我们可以用队列去做,后续也可以根据要求采用优先对列,将度为0度入队然后出队,改变所有结点度值,再重复。



***初始值***
![在这里插入图片描述](https://img-blog.csdnimg.cn/20191202223448527.png)
```cpp
void topology_sort(digraphy *gra1)
{ 
   digraphy *gra=gra1;
   vex *pend;
   int k=1;
   int m=1;
   while(k)
   { 
   	 for(int i=1;i<=gra1->node_number;i++)
    {  
   	 if(in_degree[i]==INFINTY)
   	 {
   	 	continue;
   	 }
   	 if(in_degree[i]==0)
   	 {
   	 	p.push(i);
        in_degree[i]=INFINTY;//用来区分已经度为0的结点
   	 }
    } 
    if(p.empty())
     {
     	break;
     }
     k=p.front();
     printf("%d",k);//输出序号
     getchar();
     p.pop();
     pend=gra->node_array[k].head;
     while(pend)
      {
        in_degree[pend->vex_position]--;//减少值
        //printf("%d",pend->vex_position);
     	pend=pend->next;
      }
     // getchar();
    }
    printf("结束\n");
}```

拓扑排只是一种运用,拓扑在我们随后的学习中也是比较重要的一种知识点。

https://blog.csdn.net/weixin_40792878/article/details/82555594 
这片博客就是一个关系计算机网络设计的拓扑结构,感兴趣的兄弟可以了解一下。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值