AOV网络拓扑排序
时间:2022-04-22
本文章向大家介绍AOV网络拓扑排序,主要内容包括算法思想:、算法流程:、全部代码:、执行示例:、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。
这个算法,主要是为输出一个无环图的拓扑序列
算法思想:
主要依赖一个栈,用来存放没有入度的节点,每次读取栈顶元素,并将栈顶元素的后继节点入度减一,如果再次出现入度为零的节点,就加入到栈中。参考《大话数据结构》,写下下面完整代码,并发现,其中程序的进行,出现错误。v6执行完,应该执行v9,因为此时v9是站顶元素,并不是v0.
算法流程:
int topGraph(graph g){
EdgeNode *e;
int i,k,gettop;
int top = 0 ;
int count = 0;
int *stack;
stack = (int *)malloc(g->numVertexes * sizeof(int));
for(i=0;i<g->numVertexes;i++){
if(g->headlist[i].in == 0) //把入度为0的,即没有入度的点入栈
stack[++top] = i;
}
while(top){
gettop = stack[top--];
printf("%d ",gettop);
count++;
for(e = g->headlist[gettop].fnode; e ; e=e->next){ //一次遍历链表,减少各个子节点的入度
k = e->data;
if(!(--g->headlist[k].in))
stack[++top] = k;
}
}
if(count < g->numVertexes)
return ERROR;
else
return OK;
}
全部代码:
#include <stdio.h>
#include <stdlib.h>
#define MAX 14
#define ERROR 1
#define OK 0
typedef struct edgeNode{
int data;
struct edgeNode *next;
}EdgeNode;
typedef struct headNode{
int in;
int data;
EdgeNode *fnode;
}HeadNode,HeadList[MAX];
typedef struct{
HeadList headlist;
int numEdges,numVertexes;
}Graph,*graph;
void initGraph(graph g);
int inputInfo(graph g,int tar,int in,int data,int first);
void printGraph(graph g);
int topGraph(graph g);
int main(){
Graph *g = (Graph *)malloc(sizeof(Graph));
initGraph(g);
printGraph(g);
if(topGraph(g) == ERROR)
printf("有环路!n");
else
printf("没有环路!n");
free(g);
getchar();
return 0;
}
int topGraph(graph g){
EdgeNode *e;
int i,k,gettop;
int top = 0 ;
int count = 0;
int *stack;
stack = (int *)malloc(g->numVertexes * sizeof(int));
for(i=0;i<g->numVertexes;i++){
if(g->headlist[i].in == 0) //把入度为0的,即没有入度的点入栈
stack[++top] = i;
}
while(top){
gettop = stack[top--];
printf("%d ",gettop);
count++;
for(e = g->headlist[gettop].fnode; e ; e=e->next){ //一次遍历链表,减少各个子节点的入度
k = e->data;
if(!(--g->headlist[k].in))
stack[++top] = k;
}
}
if(count < g->numVertexes)
return ERROR;
else
return OK;
}
void printGraph(graph g){
int i;
printf("vertex:%d,edges:%dn",g->numVertexes,g->numEdges);
EdgeNode *e = (EdgeNode *)malloc(sizeof(EdgeNode));
for(i=0;i<MAX;i++){
printf("[in:%d]%d",g->headlist[i].in,g->headlist[i].data);
e = g->headlist[i].fnode;
while(e != NULL){
printf("->%d",e->data);
e = e->next;
}
printf("n");
}
free(e);
}
void initGraph(graph g){
g->numVertexes = MAX;
g->numEdges = 0;
int i;
for(i=0;i<MAX;i++){
g->headlist[i].fnode = NULL;
}
inputInfo(g,0,0,0,4);
inputInfo(g,0,0,0,5);
inputInfo(g,0,0,0,11);
inputInfo(g,1,0,1,2);
inputInfo(g,1,0,1,4);
inputInfo(g,1,0,1,8);
inputInfo(g,2,2,2,5);
inputInfo(g,2,2,2,6);
inputInfo(g,2,2,2,9);
inputInfo(g,3,0,3,2);
inputInfo(g,3,0,3,13);
inputInfo(g,4,2,4,7);
inputInfo(g,5,3,5,8);
inputInfo(g,5,3,5,12);
inputInfo(g,6,1,6,5);
inputInfo(g,7,2,7,-1);
inputInfo(g,8,2,8,7);
inputInfo(g,9,1,9,10);
inputInfo(g,9,1,9,11);
inputInfo(g,10,1,10,13);
inputInfo(g,11,2,11,-1);
inputInfo(g,12,1,12,9);
inputInfo(g,13,2,13,-1);
}
int inputInfo(graph g,int tar,int in,int data,int first){
g->numEdges++;
if(first == -1){ //没有后继的边节点
g->headlist[tar].in = in;
g->headlist[tar].data = data;
return 1;
}
if(!g->headlist[tar].fnode){ //观察是否已经初始化
g->headlist[tar].in = in;
g->headlist[tar].data = data;
}
EdgeNode *e = (EdgeNode *)malloc(sizeof(EdgeNode));
e->data = first;
e->next = g->headlist[tar].fnode;
g->headlist[tar].fnode = e;
return 0;
}
执行示例:
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- No qualifying bean of type 'com.pjh.service.Imp.serviceImp' available和Exception in thread "main" jav
- python音频文件中pcm格式提取
- Spring系列之事务的控制 注解实现+xml实现+事务的隔离等级
- Leetcode刷题 237. 删除链表中的节点 两行代码实现
- python提取视频第一帧图片
- Leetcode刷题 206. 反转链表 递归迭代两种方法实现
- airtest本地连接和远程连接
- Flutter基础widgets教程-TextField篇
- poco对象生成的几种方式根据你使用不同的ui决定
- java.lang.ClassNotFoundException: org.springframework.web.context.ContextLoaderL
- SpringMVC系列之SpringMVC快速入门 MVC设计模式介绍+什么是SpringMVC+ SpringMVC的作用及其基本使用+组件解析+注解解析
- [Go] GoAdminGroup/go-admin的安装和运行
- 算法篇:滑动窗口(一)
- PHP代码审计02之filter_var()函数缺陷
- Flutter基础widgets教程-Tooltip篇