理解了用处之后我们就可以开始上代码了;
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
这片博客就是一个关系计算机网络设计的拓扑结构,感兴趣的兄弟可以了解一下。