数据结构课程设计Word格式文档下载.docx
《数据结构课程设计Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计Word格式文档下载.docx(13页珍藏版)》请在冰豆网上搜索。
3需求分析
该程序的工作是制定课程安排计划,并满足各学期课程数大致相同。
此程序规定:
1、输入的形式和输入值的范围:
输入间用空格隔开。
要求用户输入的课程数小于20,学期数小于或是等于8,课程名的长度小于等于10个字符。
2、程序所能达到的功能:
按照用户的输入,给出每学期应学的课程。
3、测试数据:
输入:
学期数:
5,课程数:
12,课程间的先后关系数:
16,课程的代表值:
v1,v2,v3,v4,v5,v6,v7,v8,v9,v10,v11,v12。
课程间两两间的先后关系:
v1v2,v1v3,v1v4,v1v12,v2v3,v3v5,v3v7,v3v8,v4v5,v5v7,v6v8,v9v10,v9v11,v9v12,v10v12,v11v6
输出:
第1学期应学的课程:
v1v9
第2学期应学的课程:
v2v4v10v11
第3学期应学的课程:
v3v6v12
第4学期应学的课程:
v5v8
第5学期应学的课程:
v7
4概要设计
4.1设计思想
总体思想是利用拓扑排序的思想和堆栈思想编写相应函数。
首先根据课程的先后关系画出AOV网,网中的结点代表课程,有向边表示各学科之间的次序关系。
可以采用邻接表作AOV网的存储结构,且在头结点中增加一个存放顶点入度的数组。
为了避免重复检测入度为零的顶点,可另设一栈暂存所有入度为零的顶点。
然后根据拓扑排序依次输出应学的课程。
4.2设计流程图
图1流程图
4.3数据库设计
系统用到的抽象数据类型定义:
1.ADTGraph{
数据对象V:
V是具有相同特性的数据元素的集合,称为顶点集。
数据关系R:
R={VR}
VR={<
v,w>
|v,w∈V且P(v,w),<
表示从v到w的弧,
谓词P(v,w)定义了弧<
的意义和信息}
基本操作:
(1)StatusCreateDG(ALGraph&
G);
(2)voidFindInDegree(ALGraphG);
(3)StatusTopologicalSort(ALGraphG);
}ADTGraph
2.ADTStack{
数据对象:
D={ai|ai∈ElemSet,i=1,2,…,n,n≥0}
数据关系:
R1={<
ai-1,ai>
|ai-1,ai∈D,i=2,…,n}
约定an端为栈顶,a1端为栈底。
(1)StatusInitStack(SqStack&
S);
(2)StatusPush(SqStack&
S,SElemTypee);
(3)StatusPop(SqStack&
S,SElemType&
e);
(4)StatusStackEmpty(SqStackS);
}ADTStack
4.4函数及功能要求
S):
构造一个空栈。
S,SElemTypee):
插入元素e为新的栈顶元素。
e):
若栈不空,则删除S的栈顶元素,用e返回其值,并返回OK;
否则返回ERROR。
(4)StatusStackEmpty(SqStackS):
判断栈是否为空,为空返回TRUE,否则返回FALSE。
(5)StatusCreateDG(ALGraph&
G):
建立邻接表。
(6)voidFindInDegree(ALGraphG):
求图的入度。
(7)voidprint(intn[],ALGraphG):
排序输出顶点数据。
(8)StatusTopologicalSort(ALGraphG):
拓扑排序,有向图G采用邻接表存储结构。
4.5模块调用关系
各程序模块之间的调用关系(子程序编号见上):
主函数可调用子程序5,8。
子程序8可调用子程序1,2,3,4,6,7。
5详细设计
5.1制定课程计划伪码
制定课程计划算法的伪码描述如下:
StatusCreateDG(ALGraph&
G){//建立邻接表
提示"
请输入学期数目(学期数目必须小于等于8):
"
;
scanf("
%d"
&
学期数目);
if(学期数目>
8)
{
请重新输入学期数目(学期数目必须小于等于8):
}
请输入课程数目(课程数必须小于20):
课程数目);
if(课程数目>
=20)
请重新输入课程数目(课程数必须小于20):
}
图G的顶点数=课程数目;
请输入课程间的先后关系数:
图G的顶点数);
请输入课程的代表值(课程名的长度小于等于10个字符):
for(i=0;
i<
图G的顶点数;
i++)
%s"
图G的第i个顶点的数据);
图G的第i个顶点指向的第一条弧=NULL;
}//输入顶点信息
请输入课程间两两间的先后关系:
图G的弧数;
i++){//输入弧的信息
%d,%d"
弧尾v,&
弧头w);
ArcNode*p=newArcNode;
//建立结点
if(p为空)returnERROR;
p所指向的顶点(p->
adjvex)=w-1;
p所指向的下一条弧(p->
nextarc)=G.vertices[v-1].firstarc;
//顶点v的链表
G.vertices[v-1].firstarc=p;
//添加到最左边
returnOK;
voidFindInDegree(ALGraphG)
{//求图各顶点的入度
ArcNode*p;
for(inti=0;
i++)
p=G.vertices[i].firstarc;
while(p不为空)
{
for(intj=0;
j<
j++)
if(p所指向的顶点位置(p->
adjvex)==j)
第j个顶点的入度+1;
p=p->
nextarc;
voidprint(intn[],ALGraphG)//对刚出s1栈的数据进行排序然后输出
n[i]!
=-1;
for(j=i+1;
n[j]!
if(n[i]>
n[j])
n[i]与n[j]交换;
输出“G.vertices[n[i]].data”;
StatusTopologicalSort(ALGraphG)
{//拓扑排序
//有向图G采用邻接表存储结构
SqStackS1,S2;
inti,count,k,m,n[20];
FindInDegree(G);
InitStack(S1);
InitStack(S2);
20;
n[i]=-1;
//将数组n全部赋值为-1
for(i=图G的顶点数-1;
i>
=0;
--i)
if(第i个顶点的入度为0)
把入度为0的压入栈S1
count=0;
//对输出顶点计数
while(S1不为空栈)
输出("
第%d学期应学的课程:
count+1);
m=0;
将S1的栈顶元素删除,并将其值返回给I;
n[m]=i;
把i号顶点压入栈S2
m++;
调用排序及输出函数
将数组n全部赋值为-1
count++;
//计数
while(S2不为空)
for(p=G.vertices[i].firstarc;
p;
nextarc)
k=p->
adjvex;
//对i号顶点的每个邻接点的入度减1
if(!
(--indegree[k]))//若入度减为0,则入栈
将度为0的顶点入栈S1;
if(count<
G.vexnum)//该有向图有回路
returnERROR;
elsereturnOK;
}//TopologicalSort
6测试分析
1运行程序打开界面如下图,并根据提示,输入学期数目:
图2测试1
输入出错时显示如下:
图3测试2
2输入正确继续根据提示输入课程数目:
图4测试3
输入错误时的显示如下:
图5测试4
3输入正确则继续根据界面提示输入课程的代表值:
图6测试5
4根据界面提示输入课程间两两间的先后关系:
图7测试6
5输入课程间两两间的先后关系后,则输出每学期应学的课程:
图8测试7
若正确输入则运行结果应如下图:
图9正确运行
7使用说明
运行程序,出现主页面,输入学期数目(学期数目必须小于等于8),输入完成后,按回车进行下一步;
输入课程数目(课程数必须小于20),输入完成后,按回车进行下一步;
输入课程间的先后关系,输入完成后,按回车进行下一步;
输入课程的代表值(课程名的长度小于等于10个字符,课程名之间用空格隔开),输入完成后,按回车进行下一步;
输入课程间两两间的先后关系(注意:
只输入课程代表值的数字部分,两两关系间用逗号隔开,不同组的关系用空格隔开),输入完成后,按回车,主界面上将显示每学期的课程安排。
至此,本程序运行结束。
8总结
本程序充分应用了我们数据结构中所学的知识,完成了教学计划安排的检验。
通过本次课程设计我们不仅仅掌握了邻接表的存储结构、栈的基本操作、拓扑排序的思想等知识。
其实我们收获的不仅仅是技术,本次程序设计使我不仅深化理解了教学内容,进一步提高灵活运用数据结构、算法和程序设计技术的能力,并且在总体分析、总体结构设计、算法设计、课程设计、上机操作及程序调试等基本技能方面受到了综合训练,使我在编读程序时更容易。
通过本次课程设计我们小组成员团结合作但又不缺乏分工,查找资料,编写代码,完成报告。
在此期间,我们充分认识了团结合作的重要性,查找、编写过程,我们有过思考,有过讨论,有过困难,但最终通过我们的团结,商讨,困难被化解,报告最终华丽的展现在我们面前。
9参考文献
1、《数据结构C语言》严蔚敏清华大学出版社
2、《c语言程序设计》谭浩强清华大学出版社
3、《数据结构》高教出版社
4、《数据结构习题》李春保清华大学出版社
5、《数据结构习题》严蔚敏清华大学出版社
6、《c语言与数据结构》王立柱清华大学出版社
7、《数据结构(C语言篇)习题与解析》李春葆清华大学出版社
10附录
见源代码:
教学计划.cpp