数据结构课程设计 6.docx
- 文档编号:25692815
- 上传时间:2023-06-11
- 格式:DOCX
- 页数:21
- 大小:222.23KB
数据结构课程设计 6.docx
《数据结构课程设计 6.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计 6.docx(21页珍藏版)》请在冰豆网上搜索。
数据结构课程设计6
安徽省巢湖学院计算机与信息工程学院
课程设计报告
课程名称《数据结构》
课题名称教学编制问题
专业计算机科学与技术
班级
学号
姓名
联系方式
指导教师
2011年12月30日
目录
1、数据结构课程设计任务书1
1.1、题目1
1.2、要求1
2、总体设计1
2.1、功能模块设计1
2.2、所有功能模块的流程图1
3、详细设计1
3.1、程序中所采用的数据结构及存储结构的说明1
3.2、算法的设计思想2
3.3、稀疏矩阵各种运算的性质变换2
4、调试与测试:
2
4.1、调试方法与步骤:
2
4.2、测试结果的分析与讨论:
3
4.3、测试过程中遇到的主要问题及采取的解决措施:
3
5、时间复杂度的分析:
4
6、源程序清单和执行结果4
7、C程序设计总结8
8、致谢8
9、参考文献8
1、数据结构课程设计任务书
1.1、题目:
教学编制问题
1.2要求如下:
要求
(1)输入参数包括:
学期总数,一学期的学分上限,每门课的课程号(固定占3位的字母数字串)学分和直接先修课的课程号。
(2)允许用户指定下列两种编排策略之一:
一是使学生在各学期中的学习负担尽量均匀;二是使课程尽可能地集中在前几个学期中。
(3)若根据给定的条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的文件中。
计划的表格格式自行设计。
2:
教学计划编制问题的要点:
根据问题描述及要求,可知设计中需要定义先修关系的AOV网图中的顶点及弧边的结构体,在运行结果中将图的信息显示出来,利用先修关系将课程排序,最后解决问题——输出每学期的课程。
1)采用第二种策略:
使课程尽可能地集中在前几个学期中;
2)根据教学计划中的课程及其关系和学分定义图的顶点和
边的结构体
3)创建图CreateGraph():
结合先修关系的AOV网,显示代号所对应课程及课程的先修课程
4)拓扑排序TopologicalOrder(G):
将课程排序后并决定出每学期所学课程,输出图G的信息Display(G):
将图的顶点和弧边输出
3:
程序模块及可实现的功能简介:
3.1)、图的邻接表的存储表示,即结构体的定义
typedefstructArcNode
{
intAdjOfV;//该弧所指向的顶点的位置
structArcNode*next;//指向下一条弧的指针
}ArcNode;
typedefcharVertexType[MAXOfNAME];
typedefstruct//链接表
{
VertexTypedata;//顶点信息
intgrades;//存储学分信息
ArcNode*first;//指向第一条依附该顶点的弧的指针
}VNode,AdjList[MAX_VER];//头结点
typedefstruct
{
AdjListver;//vertices存储课程名
intvexnum,arcnum;//图的当前顶点数和弧数
}ALGraph;
3.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.3)、输出图的顶点和边 printf("%d个顶点",G.vexnum); for(i=0;i printf("\n%d条弧边: \n",G.arcnum); for(i=0;i {p=G.ver[i].first; while(p) {printf("%s---->%s\n",G.ver[i].data,G.ver[p->AdjOfV].data); p=p->next; } } 3.4)、通过栈实现拓扑排序 intTopologicalOrder(ALGraphG,AdjListR,structNamename[]) { inti,k,j=0,count,indegree[MAX_VER]; SqStackS; ArcNode*p; FindInDegree(G,indegree);//对各顶点求入度 InitStack(S);//初始化栈 for(i=0;i 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 { printf("此有向图有回路无法完成拓扑排序"); return0; } elseprintf("为一个拓扑序列"); printf("\n"); intq=1,Z=0; while(q<=TotalOfTerms) { intC=R[Z].grades; printf("\n第%d个学期应学课程: ",q); while(C<=MaxScores) { C=C+R[Z+1].grades; if(Z { CmpOfStr(R[Z].data,name,N);/*让C1~C12分别与12门课程对应起来*/ ++Z; } } printf("\n"); if(q==TotalOfTerms)printf("\nOKOver! "); q++; } return1;/**/ } 拓扑排序要点: 依次将入度为0的顶点存入InDegree中,对每个顶点求入度,并存入数组InDegree[i]中(i=0…n),初始化栈Stack,Counter=0,对以i号顶点为尾弧的每个邻接点的入度减1,并将入度减1后为零的顶点号压入栈中,输出i,计数器加1(Counter++),推出栈顶的一个元素(入度为零的顶点号)至i,输出i,计数器加1(Counter++),堆栈是否为空? ,n个顶点全输出,依次将入度为0的顶点存入InDegree中 3.5)根据学分上限决定出每学期应学课程,其中R[]中存储的是经过拓扑排序后的课程先后顺序。 intq=1,Z=0; while(q<=TotalOfTerms) { intC=R[Z].grades; printf("\n第%d个学期应学课程: ",q); while(C<=MaxScores) {C=C+R[Z+1].grades; if(Z { CmpOfStr(R[Z].data,name,N);/*让C1~C12分别与12门课程对应起来*/ ++Z;} } printf("\n"); if(q==TotalOfTerms)printf("\nOKOver! "); q++; 4、调试与测试 结果如截图所示 4.2测试过程中遇到的主要问题及采取的解决措施: 遇到了常见的代码错误,由于代码较长,且较多,测试的时候会遇到很多不能调试的结果。 措施: 一遍遍仔细地检查代码的书写,和语法错误 5: 具体的源代码 本程序分为三部分 A: : : : : : : : : SeqStack.h 1)#defineStackofNUM20//存储空间初始分配量 2)#defineStackforMore5//存储空间分配增量 3) 4)typedefstructSqStack 5){ 6)int*a; 7)int*top; 8)intsize;//分配的存储空间 9)}SqStack; 10)intInitStack(SqStack&S)/*栈的初始化*/ 11){ 12)S.a=(int*)malloc(StackofNUM*sizeof(int)); 13)if(! S.a)exit(-1); 14)S.top=S.a; 15)S.size=StackofNUM; 16)return1; 17)} 18) 19)intStackEmpty(SqStackS)/*判断栈是否为空*/ 20){ 21)if(S.top==S.a)return1; 22)elsereturn0; 23)} 24)intPush(SqStack&S,intx)/*入栈*/ 25){ 26)if(S.top-S.a>=S.size) 27){ 28)S.a=(int*)realloc(S.a,(S.size+StackforMore)*sizeof(int)); 29)if(! S.a)exit(-1); 30)S.top=S.a+S.size; 31)S.size+=StackforMore; 32)} 33)*S.top++=x; 34)return1; 35)} 36) 37)intPop(SqStack&S,int&x)/*出栈*/ 38){ 39)if(S.top==S.a)return0; 40)x=*--S.top; 41)return1; 42)} B: : : : : : : : : ALGraph.h 43)#defineMAXOfNAME3//最多字符个数 44)#defineMAX_VER100//最大顶点数 45) 46)typedefstructArcNode 47){ 48)intAdjOfV;//该弧所指向的顶点的位置 49)structArcNode*next;//指向下一条弧的指针 50)}ArcNode; 51) 52)typedefcharVertexType[MAXOfNAME]; 53)typedefstruct//链接表 54){ 55)VertexTypedata;//顶点信息 56)intgrades;//存储学分信息 57)ArcNode*first;//指向第一条依附该顶点的弧的指针 58)}VNode,AdjList[MAX_VER];//头结点 59) 60)typedefstruct 61){ 62)AdjListver;//vertices存储课程名 63)intvexnum,arcnum;//图的当前顶点数和弧数 64)}ALGraph; 65) 66)intTotalOfTerms;//学期总数 67)intMaxScores;//学分上限 68) 69)intLocateVex(ALGraphG,VertexTypeu)/*查找图中某个顶点位置*/ 70){ 71)inti; 72)for(i=0;i 73)if(strcmp(u,G.ver[i].data)==0)returni; 74)return-1; 75)} 76) 77)intCreateGraph(ALGraph&G)/*采用邻接表存储结构*/ 78){ 79)inti,j,h; 80)VertexTypeva; 81)ArcNode*p; 82)printf("请输入教学计划的课程数: "); 83)scanf("%d",&G.vexnum); 84)getchar(); 85)printf("请输入各个课程的先修课程的总和(弧总数): "); 86)scanf("%d",&G.arcnum); 87)getchar(); 88)printf("请输入%d个课程的课程号(最多%d个字符,字母+数字如C10): ",G.vexnum,MAXOfNAME); 89)for(i=0;i 90){ 91)scanf("%s",&G.ver[i].data); 92)getchar(); 93)G.ver[i].first=NULL; 94)} 95) 96)printf("请输入%d个课程的学分值: ",G.vexnum); 97)for(i=0;i 98){ 99)scanf("%d",&G.ver[i].grades);getchar(); 100)} 101)printf("请输入下列课程的先修课程(无先修课程输入0结束后也输入0)\n"); 102)for(h=0;h 103){ 104)printf("%s的先修课程: ",G.ver[h].data); 105)scanf("%s",va);getchar(); 106)while(va[0]! ='0') 107){ 108)i=LocateVex(G,va);//弧头 109)j=h;//弧尾 110)p=(ArcNode*)malloc(sizeof(ArcNode)); 111)p->AdjOfV=j; 112)p->next=G.ver[i].first;//插在表头 113)G.ver[i].first=p; 114)scanf("%s",va);getchar(); 115)} 116)} 117)return1; 118)} 119) 120)voidDisplay(ALGraphG)/*输出图G的信息*/ 121){ 122)inti; 123)ArcNode*p; 124)printf("有向图\n"); 125)printf("%d个顶点",G.vexnum); 126)for(i=0;i 127)printf("\n%d条弧边: \n",G.arcnum); 128)for(i=0;i 129){p=G.ver[i].first; 130)while(p) 131){printf("%s---->%s\n",G.ver[i].data,G.ver[p->AdjOfV].data); 132)p=p->next; 133)} 134)} 135)} 136) 137) 138)voidFindInDegree(ALGraphG,intindegree[])/*求顶点的入度*/ 139){ 140)inti; 141)ArcNode*p; 142)for(i=0;i 143)for(i=0;i 144){ 145)p=G.ver[i].first; 146)while(p) 147){indegree[p->AdjOfV]++; 148)p=p->next; 149)} 150)} 151)} 152)structName 153){ 154)charc[20]; 155)}name; 156) 157)voidCmpOfStr(VertexTypestr,structNamename[],intn)/*让C1~C12分别与12门课程对应起来*/ 158){ 159) 160)if(strcmp(str,name[0].c)==0)printf("程序设计基础"); 161)if(strcmp(str,name[1].c)==0)printf("离散数学"); 162)if(strcmp(str,name[2].c)==0)printf("数据结构"); 163)if(strcmp(str,name[3].c)==0)printf("汇编语言"); 164)if(strcmp(str,name[4].c)==0)printf("语言的设计和分析"); 165)if(strcmp(str,name[5].c)==0)printf("计算机原理"); 166)if(strcmp(str,name[6].c)==0)printf("编译原理"); 167)if(strcmp(str,name[7].c)==0)printf("操作系统"); 168)if(strcmp(str,name[8].c)==0)printf("高等数学"); 169)if(strcmp(str,name[9].c)==0)printf("线性代数"); 170)if(strcmp(str,name[10].c)==0)printf("普通物理"); 171)if(strcmp(str,name[11].c)==0)printf("数值分析"); 6C: : 教学计划编制问题.Cpp #include #include #include #include #include"SeqStack.h" #include"ALGraph.h" #defineN12 intTopologicalOrder(ALGraphG,AdjListR,structNamename[]) { inti,k,j=0,count,indegree[MAX_VER]; SqStackS; ArcNode*p; FindInDegree(G,indegree);//对各顶点求入度 InitStack(S);//初始化栈 for(i=0;i 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 { printf("此有向图有回路无法完成拓扑排序"); return0; } elseprintf("为一个拓扑序列"); printf("\n"); intq=1,Z=0; while(q<=TotalOfTerms) { intC=R[Z].grades; printf("\n第%d个学期应学课程: ",q); while(C<=MaxScores) { C=C+R[Z+1].grades; if(Z { CmpOfStr(R[Z].data,name,N);/*让C1~C12分别与12门课程对应起来*/ ++Z; } } printf("\n"); if(q==TotalOfTerms)printf("\nOKOver! "); q++; } return1;/**/ } voidmain() { ALGraphG; AdjListR; structNamename[N]={{"C1"},{"C2"},{"C3"},{"C4"},{"C5"},{"C6"},{"C7"},{"C8"},{"C9"},{"C10"},{"C11"},{"C12"}}; printf("***************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构课程设计 数据结构 课程设计