拓扑排序-C语言实现AOV算法(数据结构课程设计)
学校每个学期开设的课程是有先后顺序的,如物联网专业:开设《数据结构》课程之前,必须先开设《程序设计基础》和《离散数学》课程,现在需要根据给定的课程信息和课程之间的先后关系,合理安排出开设各门课程的先后顺序。参考文献注意:1)在概要设计模块一定要有本课程设计的功能模块图,即可对本课程设计进行功能模块划分,如AOV网的构建模块、AOV网的显示模块、顶点的入度计算模块,栈操作模块(包括栈的初始化、判空、
·
目录
背景:
描述:
学校每个学期开设的课程是有先后顺序的,如物联网专业:开设《数据结构》课程之前,必须先开设《程序设计基础》和《离散数学》课程,现在需要根据给定的课程信息和课程之间的先后关系,合理安排出开设各门课程的先后顺序。
设计要求:
- 对输入的课程先后关系如果存在回路关系时应提示有回路错误,并能在程序不结束的情况下可以实现重新输入。
- 根据读入的课程信息及先后关系,计算出安排教学计划的拓扑序列。
- 在输入课程的先后关系,即给出每条弧的弧尾和弧头时,若输入的弧尾或弧头不在课程信息列表中时,应提示指出输入的弧尾或弧头不在课程信息列表中的错误,并能够在程序不结束的情况下可以实现重新输入。
- 构建AOV网所需的信息输入后,能够显示其信息,包括顶点数,顶点名称,弧数,弧信息(弧尾->弧头)
- 输出教学计划的安排顺序或给出错误信息提示。
参考文献
注意:
1)在概要设计模块一定要有本课程设计的功能模块图,即可对本课程设计进行功能模块划分,如AOV网的构建模块、AOV网的显示模块、顶点的入度计算模块,栈操作模块(包括栈的初始化、判空、入栈、出栈)分别用自然语言表述每个模块的算法思想(举例说明)。
2)在详细设计模块中,要求:
- 数据结构设计环节,用自然语言介绍本课程设计所使用的数据结构,以及图的存储结构设计(分别对结构体的数据成员,结构体变量进行说明)。
- 子函数设计环节,具体介绍实现各功能模块的每一个子函数是如何实现的,要有算法实现流程图,相应的核心程序代码及子函数的输入参数,输出结果等。
- 测试结果环节,用给定的测试数据进行测试,并截屏显示程序运行结果。



代码运行效果:

测试例子:


排序结果:

验证环:


main函数与拓扑:
//若图无回路,则输出拓扑排序序列并返回OK,否则返回error
int TopologicalSort(Graph G){
//printf("----%d\n",G);
ArcNode *e;
int i, k, gettop;
int top = 0;//用于栈指针下标索引
int count = 0;//用于统计输出顶点的个数
int* stack;//用于存储入度为0的顶点
stack = (int *)malloc(G.vexnum * sizeof(int));
//遍历所有结点
for (i = 0; i < G.vexnum; i++) {
if( G.vertices[i].in == 0) {
stack[++top] = i;//将入度为0的顶点入栈
//printf("元素下标%d入栈\n",i);
//printf("top is:%d\n", top);
}
}
//printf("step1 top is %d\n",top);
while (top != 0) {
//printf("step1 top is %d\n",top);
gettop = stack[top--];//出栈
printf("c%d->",G.vertices[gettop].data + 1);
//printf("gettop is %d\n",gettop);
//printf("%d->\n", G.vertices[gettop].data);
count++;//统计输出顶点数目
//printf("\ngraph->vertices[gettop].firstarc %d\n",graph->vertices[gettop].firstarc);
//if (graph.vertices[i].firstarc == NULL)
//printf("测试111111\n");
//printf("第一个顶点为vertices[%d]\n",gettop);
//printf("第一个顶点入度为%d\n",G.vertices[gettop].in);
//printf("第一个顶点数值为%d\n",G.vertices[gettop].data);
//printf("第一个顶点指向后面的节点为%d\n",G.vertices[3].firstarc);
//printf("第一个顶点指向的内容为graph.vertices[i].firstarc");
//G.vertices[j].firstarc
/*if (&graph->vertices[gettop].firstarc->adjvex == NULL) {
printf("222222\n");
}*/
int main() {
while(1) {
printf("*********************主菜单界面*********************\n");
printf("******现在预备开始构造邻接表,请按照提示进行!*******\n");
printf("******输入1开始构造邻接表,输入2结束程序!***********\n");
int flag;
scanf("%d",&flag);
fflush(stdin);//去掉回车
if (flag == 1) {
//int v_count = 0;
/*printf("请第一次输入顶点数目\n");
scanf("%d",&MAX_VERTEX_NUM);
fflush(stdin);//去掉回车
MAX_VERTEX_NUM =
*/
//1:创建图
Graph graph;
int i = CreateGraph(graph);//获取子菜单返回值
if (i == -2){
//输出的弧头或弧尾不在课程信息列表中重新输入
} else if(i == -3) {
//存在环,重新输入数据
} else if(i == 1) {
//用户自己返回到主菜单
}
} else {
printf("***********程序正常退出*****************************\n");
break;
}
}
return 0;
}
姊妹篇:
源码获取
欢迎大家点赞、收藏、关注、评论、批评啦 、查看👇🏻👇🏻获取联系方式👇🏻👇🏻
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐

所有评论(0)