教学计划编制问题课程设计报告

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 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)

{

相关文档
最新文档