ImageVerifierCode 换一换
格式:DOCX , 页数:21 ,大小:193.18KB ,
资源ID:22398862      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/22398862.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(湖大数据结构教学计划编制问题文档格式.docx)为本站会员(b****7)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

湖大数据结构教学计划编制问题文档格式.docx

1、a01 a034. 请输入课程总数:4请输入第四门课程的课程号(占3位的字母数字串):a04 a02请输入第二条边:请输入第三条边:请输入第四条边:a04 a01a04 a02 a03 a015. 请输入课程总数:-1 结束程序 二 概要设计抽象数据类型因为各个课程的修读之间的关系是非线性的,而且具有结构网状特性,并且课程修读关系是有向的,所以选择有向图来表示教学计划;由于邻接表的时间复杂度为(),比邻接矩阵的时间代价要小,所以我选用邻接表来存储该有向图;有向图的ADT设计:数据对象:G=(V,E),其中V表示顶点集合,E表示边集合数据关系:VR| v,wV 且 P(v,w) 表示从 v 到

2、w 的一条弧, v 为弧头,w 为弧尾。基本操作:int n();/图中顶点个数int e();/图边数int first(int);/该点的第一条临边int next(int,int);/该点的第二条临边void setEdge(int,int,int);/为边设置权值void setMark(int ,int);/设置该顶点的标志值int getMark(int);/获得该顶点的标志值 图的顶点ADT设计: 数据对象:课程的课程号(占3位的字母数字串)数据关系:vi|i=1,2,3n int position();/获取顶点位置算法基本思想1.建表:通过用户输入的课程个数初始化一个有向图的

3、临接矩阵,根据用户输入的课程修读的先后关系构建完整的临接矩阵,并完成图的构建。为了检验图中顶点是否经过拓扑排序,为每个顶点初始化一个标志值0,当一个顶点经过拓扑排序后更改该顶点标志值1。2.排序:从有向图中选取一个没有前驱 的顶点,将该顶点的数据入队列。然后从有向图中删去此顶点以及所 有以它为尾的弧,并把该顶点标志值改为1。重复上述步骤 ,直至所有点的标志值都为1(图空),或者图不空但找不到无前驱的顶点为止。若无标志值为0的顶点,则输出顶点序列并将其存入文件中,若还有1个或1个以上的标志值为0的顶点,则输出此问题无解程序基本流程此程序主要包括4个流程:1.输入流程:由用户输入各项参数:课程总数

4、,每门课的课程号(固定占3位的字母数字串)和直接先修课的课程号。当用户输入有误时,提示用户输入有误并重新输入;2.构建流程:根据用户构建相应的临接矩阵;3.排序流程:将该图的顶点依次进行拓扑排序,并将排序结果存入队列;4.输出流程:若最后所有顶点标志值都为1,则输出队列中的课程修读顺序,将其存入文件中。若最后有1个或1个以上顶点标志值为0,则输出该问题无解三 详细设计物理数据类型1. 图和边的相邻矩阵实现:边的实现:class Edgepublic:int vertex,weight;Edge() vertex=-1;weight=-1; Edge(int v,intw) vertex=v;w

5、eight=w;图的相邻矩阵实现:class Graphmprivate:int numVertex,numEdge;int *matrix; int *mark;Graphm(int numVert) int i,j;numVertex = numVert; /顶点数 numEdge=0; mark=new intnumVert;for(i=0;inumVertex;i+) marki=0; /每一个顶点的标志值初始化为0 matrix =(int*) new int*numVertex; matrixi=newint*numVertex; for(i=0;for(j=0;jnext; de

6、lete rear;size=0; /队列的清空 bool enqueue(const Node& it) if(rear=NULL) front=rear=new Link(it NULL); else rear-next=new Link size+; return true;/入队bool dequeue( Node& if(size=0) return false; it=front-element;Node* ltemp=front;front=front-nextdelete ltemp;if(front=NULL) rear=NULL;siz-;return true;/出队in

7、t length() const return size; /队列的长度Topological Sort的实现void topsort(Graph* G, Queue* Q) int CountG-n(); int v, w; for (v=0; vn(); v+) Countv = 0; v+) / Process edges for (w=G-first(v); wnext(v,w) Countw+; / Add to v2s count v+) / Initialize Q if (Countv = 0) / No prereqs Q-enqueue(v); while (Q-lengt

8、h() != 0) dequeue(v); printout(v); / PreVisit for V w = G-next(v,w) Countw-; / One less prereq if (Countw = 0) / Now freeenqueue(w);算法具体步骤1.输入:2.构建图:根据用户构建相应的临接表;3.拓扑排序:4.输出:input(classNu);/课程总数Graphm G;Queue Q;for(int i=0;classNu;i+)input(classNamei);/课程编号input(rearClass);/该课程的先修课程if(rearClass!=N)G

9、.setEdge(rearClass,i);G.setMark(i,1);for(int j=0;n;j+) if(G.getMark(i)=0)output:”此问题无解。”;exit;/判断是否有解topsort(G,Q);/排序及输出函数关系调用 输入 构建临接矩阵:G.setEdge(classNum1,classNum2,1)标记函数:G.Mark(I,1)拓扑排序:topsort(G,Q)判断是否有解:存在G.getMark(i)=0?输出:output算法时空分析构建一个临接矩阵的时间代价是(|V|2),拓扑排序的时间代价是(|V|),所以该算法总的时间代价是(|V|2)输入输出

10、格式输入: input(classNu);该课程的先修课是(若没有则输入N,有则输入课程号):/topsort函数中的输出功能 此问题无解。四 调试分析程序需要用到较多指针,因而首次调试时出现了溢出的情况,后来通过设置断点的方法解决了这个问题五 测试结果六 用户使用说明1. 本程序可以通过构建一个有向图来实现教学计划的编排;2. 用户需输入每门课的课程号(固定占输入参数:课程总数,每门课的课程号(固定占3位的字母数字串)和边的总数以及各条边。3在边的输入中,请勿输入之前未经输入的课程名字,否则程序会出错!七 实验心得通过该实验,我掌握了通过构建邻接表来存储图的方法以及拓扑排序的使用方法。#in

11、cludestringusing namespace std;int judge() /对输入的合法性进行判断并返回有效的输入 int temp; cin.sync(); /清空输入流缓冲区 cin temp; while (1) if (cin.fail() | cin.bad() | cin.get() != n) /验证输入是否合法,其中cin.fail()和cin.bad()解决输入字符串和溢出的问题 cout return temp;/结点类 string className; int position; /位置 Node* next; bool visit; /是否被访问 Node

12、() visit = false; next = NULL; position = 0; className = ;class List /线性表类 int num; Node* head; Node* rear; Node* fence; List() num = 0; head = fence = rear = new Node(); List() deletehead; deletefence; void insert(int v, string ch) /插入元素 Node* current = new Node(); current-className = ch;position =

13、 v; fence-next = current; fence = current; num+;class Graph /图类 int numVertex; int numEdge; List* list; Graph(int v, int e) numVertex = v; numEdge = e; list = new Listv; Graph() deletelist; void pushVertex() /读入点 string ch; for (int i = 0; i i+) 请输入课程 i + 1 ch; listi.head-position = i; void pushEdge

14、() /读入边 string ch1,ch2; int pos1,pos2; for (int i = 0;numEdge; cout 请输入第i+1 ch1 ch2; for (int j = 0; jclassName = ch1) pos1 = j; /找到该字母对应的位置 if (listj.head-className = ch2) pos2 = listj.head-position; break; listpos1.insert(pos2, ch2); void topsort() /拓扑排序 int i; int *count = new intnumVertex; for (

15、i = 0; counti = 0; /数组初始化 Node* p = listi.head; while (p-next != NULL) countp-next-position+; /计算每个点的入度 p = p- int top = -1, m = 0, j, k; i+) if (counti = 0) counti = top; /找到第一个入度为0的点 top=i; while (top != -1) j = top; top = counttop; listj.head-className = NULL) k = p- countk-; /当起点被删除,时后面的点的入度-1 if(countk=0) countk = top; top = k; p = p- if (mnumVertex) /输出点的个数小于输入点的个数,不能完全遍历此问题无解 deletecount;int main() int classAmo, sideAmo; cout NUL); return 0;

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

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