数据结构课程设计排课系统副本Word文件下载.docx
- 文档编号:21154401
- 上传时间:2023-01-28
- 格式:DOCX
- 页数:18
- 大小:596.28KB
数据结构课程设计排课系统副本Word文件下载.docx
《数据结构课程设计排课系统副本Word文件下载.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计排课系统副本Word文件下载.docx(18页珍藏版)》请在冰豆网上搜索。
一、课程设计的目的
1.巩固和加深学生对C语言课程的基本知识的理解和掌握
2.掌握C语言编程和程序调试的基本技能
3.利用C语言进行基本的软件设计
4.掌握书写程序设计说明文档的能力
5.提高运用C语言解决实际问题的能力
二.设计的内容与要求
要建立一个图,因而要输入图的结点数和边数以及图的每一个结点的名称,要对所输入课程进行排课,因而要确定每一个结点的入度是否为零,并且将入度为零的结点分别进栈再出栈,再进另一个栈,最后出栈,最后实现对所输入的课程进行排课
三.总体设计
(1)该教学计划安排系统分为6个模块
1.建立图
2.栈的初始化
3.出栈
4.进栈
5求结点的入度
6拓扑排序
(2)算法描述(此程序中所包含的函数)
1.主函数main():
调用CreateALGraph(G)函数和TopologicalSort(G)函数。
2.CreateALGraph()函数:
从键盘上输入所需要的值,并对每一个结点的*firstarc赋值为NULL。
3.InitStack()函数:
将栈分配存储空间,并对top和base赋值。
4.Push()函数:
进满足条件的元素压入栈中,并改变top指针的值
5.Pop()函数:
开始判断栈中的top和base指针是否相等,若相等则返回,否则进行出栈操作。
6.StackEmpty()函数:
通过判断栈是否为空来返回相应的值。
7.FindInDegree()函数:
通过循环求出每一个结点的入度
8.TopologicalSort()函数:
通过拓扑排序将相应的课程给输出来
四.详细设计
数据的组织描述(比如主要的变量类型,结构体等等),模块之间的参数设计(接口设计,模块的功能说明),系统控制流程图,各个模块的流程图,采用的算法
typedefstruct
{
SElemType*base;
//在栈构造之前和销毁之后,base的值为NULL
SElemType*top;
//栈顶指针
intstacksize;
//当前已分配的存储空间,以元素为单位
}SqStack;
typedefstructArcNode
intadjvex;
//该弧所指向的顶点的位置
structArcNode*nextarc;
//指向第一条依附该顶点的弧的指针
}ArcNode;
typedefstructVNode
chardata[10];
ArcNode*firstarc;
}AdjList[max_vertex_num];
AdjListvertices;
intvexnum,arcnum;
//图的当前顶点数和弧数
}ALGraph;
1.主函数模块
定义一个图的变量,调用CreateALGraph(G)函数,和TopologicalSort(G)函数。
2.创建图的模块
从键盘上输入学期数,再输入课程数目(即结点数)和课程之间的关系数(即边数),并把指向第一条依附该顶点的弧的指针赋值为NULL,同时把每一个结点所指向的其他结点形成一个链表。
为NULL。
3栈的初始化模块
使栈中base指针分配一定的存储空间,并使栈中top指针指向base指针。
4.栈的进栈模块
先开始判断这个栈是否为满,若满了,则重新分配一定的存储空间,栈中的top指针重新赋值之后,再使该元素进栈,并使top指针指向下一位。
5.栈的出栈模块
判断栈的top指针和base指针是否相等,若相等则为空,否则不为空。
6.栈空的模块
通过判断栈的top指针和base指针是否相等,来返回相应的值
7.求结点的入度模块
对每一个结点已经形成了一个链表进行查找,若发现有一个结点指向另一个结点,就把另一个结点的入度加1,直到循环结束
8.拓扑排序模块
首先对栈进行初始化,然后找出结点的入度为零的结点,若入度为零,则进栈。
当是S1不为空时,就将栈中的S1进行出栈操作,并把序号所对应的结点给输出来。
与此同时,把结点所对应的序号压入栈S2,同时将count加1,并判断栈S2是否为空,
若不为空,则把栈S2中的元素进行出栈操作,并把该结点所形成的链表中每一个结点的入度减一,若减之后,就把该结点的序号压入栈S1。
如此循环,直到该循环结束
图
(1)是CreateALGraph()函数
图
(2)是InitStack()函数
图(3)
图(4)
图(6)是FindInDegree()函数
图(5)
五.调试与测试
调试
1.在编程当中,由于要输入大量的程序,所以经常出现很多不让人注意的小错误。
例如大小写int写成Int(因为是在word中写的,会自动将字母大写)
2.关系运算符和赋值运算符总是用错,而这种错误也总是被忽略。
3.有时候会忘记加分号或是在不该加的地方加上了分号。
不过这种情况还是比较容易被发现的。
4.有时候大括号也会忘加,尤其是在if语句和for语句中。
5.最重要的是函数的应用,函数应该应用得当,否则程序会出现很大的错误,尤其是在如此庞大的程序中。
6.调试拓扑排序的时候,最头疼,有时候调试半天没有结果,最后问了一下同学,才有了思绪,错误逐渐浮出水面,让我明白究竟错在哪里。
7.总是忘了初始化,结果调试半天没有调试出来。
8.我对拓扑排序基本弄清楚了,但是程序不一定写的出来,稍微错了一点很难找出来。
9.在定义结构体时,纠结了半天,没有定义好结构体很多都是白搭,下面很多程序都不好写。
10.全程变量的运用错误导致很多错误,调试了半天。
测试
开始界面
输入课程数目
输入总边数
输入所有课程的名称
输入课程之间的先后关系
学期课程安排
六.课程设计的总结
通过这个课程设计,我们更加牢固的掌握了书本上的知识。
并对于以前不熟悉的知识有了更加深刻的了解。
在完成此次课程设计的过程中,虽然有些疲劳和困倦,但带给我很多的收获。
数据结构已经学了半个学期了,有许多知识都存在似懂非懂的现象,这种现象通过实际的上机操作,已经减少了许多。
很多程序理论上说得过去,但真正上机了却会发现行不通。
所以说无论做什么事空有理论而不去实践都收获不到真正的果实。
说实话,我这个程序在所有程序当中算是简单的,所包含的知识也就是调用函数和结构体,当中穿插了一些拓扑排序算法,总体来说结构还是很清晰的,由各个模块小模块组成了一个排课系统。
但过程中也是遇到了不少的麻烦,很多地方都想不到或是想不全的。
所以说对待任何事情我们都不容小觑,一件自己没做过的事谁都不能说你就一定能做好了。
输入和调试程序的过程是相当枯燥的,但构思和完善程序的过程还是比较有趣的,无论怎样,当你完成了一个程序时,还是相当有成就感的。
此次任务的完成,也体现出同学之间的团结精神。
实践是检验真理的唯一标准。
没有实践,就不会发现和深刻体会它的真实所在。
只有通过检验的真理,在自己的心里,才会认可它的真实性。
面向程序设计的完成,使我们懂得了真理的重要性,理论和实际的相结合,才能真正把握所学和所掌握的知识。
同时培养了我做任何事都要善于坚持的精神,使我我们懂得了团队的重要性。
在今后的学习工作中我们将会更好的发挥团队精神。
总的来说,数据结构还是十分重要的,可以通过人为的设计而让电脑来辅助性的做一些机械的东西。
在今后的学习过程中,我也加更加认真地学习数据结构,希望能在今后设计出一个属于自己的程序。
附录:
#include<
stdio.h>
malloc.h>
#definestack_init_size100//存储空间初始分配量
#definecreatestack10//存储空间分配增量
#definemax_vertex_num20
typedefintStatus;
typedefintSElemType;
intindegree[20]={0};
//存储图的入度的全局变量数组
StatusInitStack(SqStack&
S)
S.base=(SElemType*)malloc(stack_init_size*sizeof(SElemType));
if(!
S.base)
return0;
S.top=S.base;
S.stacksize=stack_init_size;
return1;
}
StatusPush(SqStack&
S,SElemTypee)
//插入元素e为新的栈顶元素
if(S.top-S.base>
=S.stacksize)
{//栈满,追加存储空间
S.base=(SElemType*)realloc(S.base,(S.stacksize+createstack)*sizeof(SElemType));
if(!
return0;
//存储分配失败
S.top=S.base+S.stacksize;
S.stacksize+=createstack;
}
*S.top++=e;
StatusPop(SqStack&
S,SElemType&
e)
if(S.top==S.base)
e=*--S.top;
StatusStackEmpty(SqStackS)
return1;
elsereturn0;
StatusCreateALGraph(ALGraph&
G)
inti,semester_num,v,w,vex;
printf("
请输入学期数目:
"
);
scanf("
%d"
&
semester_num);
if(semester_num>
8)
{
请重新输入学期数目:
}
请输入课程数目(课程数必须小于20):
vex);
if(vex>
=20)
printf("
请重新输入课程数目(课程数必须小于20):
scanf("
G.vexnum=vex;
请输入课程间的先后关系数(总边数):
G.arcnum);
for(i=0;
i<
G.vexnum;
i++)
请输入%d课程的名字(课程名的长度小于等于10个字符):
i+1);
%s"
G.vertices[i].data);
G.vertices[i].firstarc=NULL;
G.arcnum;
i++)
请输入课程间两两间的先后关系(用整数表示,整数与整数之间用逗号隔开):
%d,%d"
v,&
w);
ArcNode*p=newArcNode;
p)return0;
p->
adjvex=w-1;
nextarc=G.vertices[v-1].firstarc;
G.vertices[v-1].firstarc=p;
}
voidFindInDegree(ALGraphG)
ArcNode*p;
for(inti=0;
p=G.vertices[i].firstarc;
while(p)
{
for(intj=0;
j<
j++)
if(p->
adjvex==j)
indegree[j]++;
p=p->
nextarc;
}
StatusTopologicalSort(ALGraphG)
{//拓扑排序
//有向图G采用邻接表存储结构
SqStackS1,S2;
inti,count,k;
FindInDegree(G);
InitStack(S1);
InitStack(S2);
++i)
indegree[i])
Push(S1,i);
//把入度为0的压入栈S1
count=0;
//对输出顶点计数
while(!
StackEmpty(S1))
第%d学期应学的课程:
count+1);
while(!
{
Pop(S1,i);
printf("
%s"
G.vertices[i].data);
//输出i号顶点
Push(S2,i);
//把i号顶点压入栈S2
\n"
count++;
//计数
StackEmpty(S2))
Pop(S2,i);
for(p=G.vertices[i].firstarc;
p;
p=p->
nextarc)
{
k=p->
adjvex;
//对i号顶点的每个邻接点的入度减1
if(!
(--indegree[k]))//若入度减为0,则入栈
Push(S1,k);
}
if(count<
G.vexnum)//该有向图有回路
elsereturn1;
voidmain()
{
//定义一个图的变量
ALGraphG;
CreateALGraph(G);
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课程设计排课系统 副本 数据结构 课程设计 系统