数据结构课程设计.docx

上传人:b****6 文档编号:4698004 上传时间:2022-12-07 格式:DOCX 页数:13 大小:171.06KB
下载 相关 举报
数据结构课程设计.docx_第1页
第1页 / 共13页
数据结构课程设计.docx_第2页
第2页 / 共13页
数据结构课程设计.docx_第3页
第3页 / 共13页
数据结构课程设计.docx_第4页
第4页 / 共13页
数据结构课程设计.docx_第5页
第5页 / 共13页
点击查看更多>>
下载资源
资源描述

数据结构课程设计.docx

《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(13页珍藏版)》请在冰豆网上搜索。

数据结构课程设计.docx

数据结构课程设计

目录

1实验目的1

2问题描述1

3需求分析1

4概要设计2

4.1设计思想2

4.2设计流程图2

4.3数据库设计3

4.4函数及功能要求3

4.5模块调用关系4

5详细设计4

5.1制定课程计划伪码4

6测试分析8

7使用说明11

8总结12

9参考文献13

10附录14

教学计划安排检验

1实验目的

本次数据结构课程设计的主要目的是检验和巩固专业知识,提高综合素质和能力。

并在实际操作中掌握:

1.邻接表的存储结构。

2.栈的基本操作。

3.拓扑排序的思想。

通过实习,可以将我们课堂上掌握的理论知识与处理数据的业务相结合,以检验我们掌握知识的宽度、深度及对知识的综合运用能力。

2问题描述

针对学院的计算机系本科课程,根据课程之间的依赖关系,制定课程安排计划,并满足各学期课程数大致相同。

按照用户输入的课程数,学期数,课程间的先后关系数目以及课程间两两间的先后关系,程序执行后会给出每学期应学的课程。

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且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∈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函数及功能要求

(1)StatusInitStack(SqStack&S):

构造一个空栈。

(2)StatusPush(SqStack&S,SElemTypee):

插入元素e为新的栈顶元素。

(3)StatusPop(SqStack&S,SElemType&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):

";

scanf("%d",&学期数目);

}

提示"请输入课程数目(课程数必须小于20):

";

scanf("%d",&课程数目);

if(课程数目>=20)

{

提示"请重新输入课程数目(课程数必须小于20):

";

scanf("%d",&课程数目);

}

图G的顶点数=课程数目;

提示"请输入课程间的先后关系数:

";

scanf("%d",&图G的顶点数);

提示"请输入课程的代表值(课程名的长度小于等于10个字符):

";

for(i=0;i<图G的顶点数;i++)

{

scanf("%s",&图G的第i个顶点的数据);

图G的第i个顶点指向的第一条弧=NULL;

}//输入顶点信息

提示"请输入课程间两两间的先后关系:

";

for(i=0;i<图G的弧数;i++){//输入弧的信息

scanf("%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<图G的顶点数;i++)

{

p=G.vertices[i].firstarc;

while(p不为空)

{

for(intj=0;j<图G的顶点数;j++)

if(p所指向的顶点位置(p->adjvex)==j)

第j个顶点的入度+1;

p=p->nextarc;

}

}

}

voidprint(intn[],ALGraphG)//对刚出s1栈的数据进行排序然后输出

{

for(i=0;n[i]!

=-1;i++)

for(j=i+1;n[j]!

=-1;j++)

if(n[i]>n[j])

{

n[i]与n[j]交换;

}

for(i=0;n[i]!

=-1;i++)

输出“G.vertices[n[i]].data”;

}

StatusTopologicalSort(ALGraphG)

{//拓扑排序

//有向图G采用邻接表存储结构

SqStackS1,S2;

ArcNode*p;

inti,count,k,m,n[20];

FindInDegree(G);

InitStack(S1);

InitStack(S2);

for(i=0;i<20;i++)

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;

while(S1不为空栈)

{

将S1的栈顶元素删除,并将其值返回给I;

n[m]=i;

把i号顶点压入栈S2

m++;

}

调用排序及输出函数

将数组n全部赋值为-1

count++;//计数

while(S2不为空)

{

将S1的栈顶元素删除,并将其值返回给I;

for(p=G.vertices[i].firstarc;p;p=p->nextarc)

{

k=p->adjvex;//对i号顶点的每个邻接点的入度减1

if(!

(--indegree[k]))//若入度减为0,则入栈

将度为0的顶点入栈S1;

}

}

}

if(count

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 理化生

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1