目录

背景:

描述:

设计要求:

代码运行效果:

测试例子:

排序结果:

验证环:

main函数与拓扑:

姊妹篇:

源码获取


背景:

描述:

学校每个学期开设的课程是有先后顺序的,如物联网专业:开设《数据结构》课程之前,必须先开设《程序设计基础》和《离散数学》课程,现在需要根据给定的课程信息和课程之间的先后关系,合理安排出开设各门课程的先后顺序。

设计要求:

  1. 对输入的课程先后关系如果存在回路关系时应提示有回路错误,并能在程序不结束的情况下可以实现重新输入。
  2. 根据读入的课程信息及先后关系,计算出安排教学计划的拓扑序列。
  3. 在输入课程的先后关系,即给出每条弧的弧尾和弧头时,若输入的弧尾或弧头不在课程信息列表中时,应提示指出输入的弧尾或弧头不在课程信息列表中的错误,并能够在程序不结束的情况下可以实现重新输入。
  4. 构建AOV网所需的信息输入后,能够显示其信息,包括顶点数,顶点名称,弧数,弧信息(弧尾->弧头)
  5. 输出教学计划的安排顺序或给出错误信息提示。

    参考文献

    注意:

    1)在概要设计模块一定要有本课程设计的功能模块图,即对本课程设计进行功能模块划分,如AOV网的构建模块、AOV网的显示模块、顶点的入度计算模块,栈操作模块(包括栈的初始化、判空、入栈、出栈)分别用自然语言表述每个模块的算法思想(举例说明)。

    2)在详细设计模块中,要求:

  6. 数据结构设计环节,用自然语言介绍本课程设计所使用的数据结构,以及图的存储结构设计(分别对结构体的数据成员,结构体变量进行说明)。
  7. 子函数设计环节,具体介绍实现各功能模块的每一个子函数是如何实现的,要有算法实现流程图,相应的核心程序代码及子函数的输入参数,输出结果等。
  8. 测试结果环节,用给定的测试数据进行测试,并截屏显示程序运行结果。

代码运行效果:

测试例子:

排序结果:

验证环:

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;
}

姊妹篇:

C语言《数据结构与算法》安排教学计划课设-CSDN博客

源码获取

欢迎大家点赞、收藏、关注、评论、批评啦 、查看👇🏻👇🏻获取联系方式👇🏻👇🏻

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐