教学计划编制问题课程设计报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
中北大学
数据结构与算法课程设计
说明书
学院、
系:软件学院
专
业:软件工程
学生姓名:
学号:
设计题
目:教学计划编制问题
起迄日期:2013年12月9日-2013年12月20
日
指导教
师:
2013年12月 20 日
1需求分析
1. 在大学的某个专业中选取几个课程作为顶点,通过各门课的先修关系来构建个图,该图用邻接表来存储,邻接表的头结点存储每门课的信息.
2. 本程序的目的是为用户编排课程,根据用户输入的信息来编排出每学期要学的课程.
3.测试数据:
学期总数:6;学分上限:9;本专业共开设12门课,课程号从C00到C11,学分顺序为2,3,4,3,2,3,4,4,7,5,2,3。
2概要设计
1.抽象数据类型图的定义如下:
ADT Graph{
数据对象V:V是具有相同特性的数据元素的集合,称为顶点集.
数据关系R:
R={VR}
VR={(v,w)|v,w∈V,(v,w)表示v和w之间存在直接先修关系}
基本操作P:
void CreatGraph(ALGraph *);
void FindInDegree(ALGraph , int * );
int TopologicalOrder(ALGraph G,AdjList R,struct Name name[]) int LocateVex(ALGraph G, VertexType u)/* 查找图中某个顶点位置 */
}ADT Graph
2.栈的定义如下:
ADT Stack{
数据对象:D={ai|ai∈ElemSet,i=1,2,…n,n>=0}
数据关系:R1={﹤ai-1 ai﹥|ai-1,ai∈D,i=2,…,n}
基本操作:
void InitStack (SqStack *S);
int StackEmpty(SqStack S);
void Push(SqStack *S, int );
int Pop(SqStack *S, int *e);
}ADT Stack
3.本程序有两个模块,调用关系简单:主程序模块→拓扑排序模块3系统完成功能及功能框图
图3.1系统功能框图
1
图3.2 邻接表
图3.3 拓扑排序流程图
图3.4 课程先修关系图
4 详细设计
1.图的邻接表的存储表示,即结构体的定义:
typedef struct ArcNode
{
i nt AdjOfV; // 该弧所指向的顶点的位置
s truct ArcNode *next; //指向下一条弧的指针
}ArcNode;
typedef char VertexType[MAXOfNAME];
typedef struct //链接表
{
V ertexType data; //顶点信息
i nt grades; //存储学分信息
A rcNode *first; //指向第一条依附该顶点的弧的指针}VNode, AdjList[MAX_VER]; // 头结点
typedef struct
{
A djList ver; //vertices 存储课程名
i nt vexnum, arcnum; // 图的当前顶点数和弧数
}ALGraph;
2. 建立图的邻接链表:
printf("请输入下列课程的先修课程(无先修课程输入0 结束后也输入0)\n");
for (h=0;h { printf("%s的先修课程:",G.ver[h].data); scanf("%s",va);getchar(); while (va[0]!='0') { i = LocateVex(G, va); //弧头 j = h; //弧尾 p = (ArcNode*)malloc(sizeof(ArcNode)); p->AdjOfV = j; p->next = G.ver[i].first; // 插在表头 G.ver[i].first = p; scanf("%s",va); getchar(); } 3. 输出图的顶点和边: printf("%d个顶点", G.vexnum); for (i = 0;i < G.vexnum;++i)printf("%4s", G.ver[i].data); printf(" \n%d条弧边:\n",G.arcnum); for (i = 0;i < G.vexnum;i++) { p = G.ver[i].first; while (p) { printf("%s---->%s\n",G.ver[i].data,G.ver[p->AdjOfV].data); p = p->next; } } 4. 通过栈实现拓扑排序: int TopologicalOrder(ALGraph G,AdjList R,struct Name name[]) { i nt i, k, j = 0, count, indegree[MAX_VER]; S qStack S; A rcNode *p; F indInDegree(G, indegree); // 对各顶点求入度 I nitStack(S); // 初始化栈 f or (i = 0;i < G.vexnum;++i) //建零入度顶点栈S if (!indegree[i]) Push(S, i); // 入度为0者进栈 count = 0; // 对输出顶点计数 while (!StackEmpty(S)) { Pop(S, i); printf("%s(%d学分),",G.ver[i].data,G.ver[i].grades); R[j++] = G.ver[i]; //将当前的拓扑序列保存起来 ++count; // 输出i号顶点并计数 for (p =G.ver[i].first; p; p=p->next)// 对i号顶点的每个邻接点的入度减1 { k = p->AdjOfV; if (!(--indegree[k])) // 若入度减为0,则入栈 Push(S, k); } } if (count < G.vexnum) {