数据结构课程设计教学计划安排系统Word文档下载推荐.doc

上传人:聆听****声音 文档编号:417679 上传时间:2023-04-28 格式:DOC 页数:23 大小:327.60KB
下载 相关 举报
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第1页
第1页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第2页
第2页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第3页
第3页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第4页
第4页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第5页
第5页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第6页
第6页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第7页
第7页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第8页
第8页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第9页
第9页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第10页
第10页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第11页
第11页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第12页
第12页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第13页
第13页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第14页
第14页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第15页
第15页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第16页
第16页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第17页
第17页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第18页
第18页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第19页
第19页 / 共23页
数据结构课程设计教学计划安排系统Word文档下载推荐.doc_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据结构课程设计教学计划安排系统Word文档下载推荐.doc

《数据结构课程设计教学计划安排系统Word文档下载推荐.doc》由会员分享,可在线阅读,更多相关《数据结构课程设计教学计划安排系统Word文档下载推荐.doc(23页珍藏版)》请在冰点文库上搜索。

数据结构课程设计教学计划安排系统Word文档下载推荐.doc

(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()函数

inti,semester_num,v,w,vex

CreateALGraph函数

semester_num>

8

输入学期数

N

vex>

=20

Y

课程数目

输入课程之间

的关系数

输入课程的名字

i<

G.vexnum

输入课程的之间的先后关系数v,w

G.arcnum

结束

(1)

(2)是InitStack()函数

图(3)

return1

e=*--S.top

return1

return0

S.top==S.base

图(3)是Pop()函数

(2)

S.base=(SElemType*)malloc(stack_init_size*sizeof(SElemType))

s.base!

=0

return0

S.top=S.base,

S.stacksize=stack_init_size

图(4)是Push函数

图(4)

S.top-S.base>

=S.stacksize

*S.top++=e

S.top=S.base+S.stacksize,

S.stacksize+=createstack;

S.base==0

S.base=(SElemType*)realloc(S.base,(S.stacksize+createstack)*sizeof(SElemType))

图(6)

图(6)是FindInDegree()函数

p=p->

nextarc

i++

结束

indegree[j]++

intj=0,j<

p->

adjvex==j

P==NULL

p=G.vertices[i].firstarc

i<

G.vexnum

inti=0

ArcNode*p

图(5)

图(5)是StackEmpty()函数

SqStackS1,S2;

ArcNode*p;

inti=0,count=0,k;

图(7)拓扑排序函数函数

indegree[i]==0

Push(S1,i)

i++,i<

StackEmpty(S1)!

输出相应的课程

Pop(S1,i),输出i号结点,Push(S2,i)

count++

StackEmpty(S2)!

Pop(S2,i)

p=G.vertices[i].firstarc;

p

Push(S1,k)

--indegree[k])==0

k=p->

adjvex

五.调试与测试

调试

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;

return1;

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)

{

printf("

请重新输入学期数目:

scanf("

}

printf("

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

scanf("

vex);

if(vex>

=20)

printf("

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

scanf("

}

G.vexnum=vex;

请输入课程间的先后关系数(总边数):

G.arcnum);

for(i=0;

G.vexnum;

i++)

请输入%d课程的名字(课程名的长度小于等于10个字符):

i+1);

%s"

G.vertices[i].data);

G.vertices[i].firstarc=NULL;

for(i=0;

G.arcnum;

i++)

请输入课程间两两间的先后关系(用整数表示,整数与整数之间用逗号隔开):

%d,%d"

v,&

w);

ArcNode*p=newArcNode;

if(!

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++;

//计数

while(!

StackEmpty(S2))

Pop(S2,i);

for(p=G.vertices[i].firstarc;

p;

nextarc)

{

k=p->

adjvex;

//对i号顶点的每个邻接点的入度减1

if(!

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

Push(S1,k);

}

if(count<

G.vexnum)//该有向图有回路

elsereturn1;

voidmain()

{

//定义一个图的变量

ALGraphG;

CreateALGraph(G);

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

当前位置:首页 > 高中教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2