版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、.问题描述: 若用有向网表示教学计划,其中顶点表示某门课程,有向边表示课程之间的先修关系(如果A课程是B课程的先修课程,那么A到B之间有一条有向边从A指向B)。试设计一个教学计划编制程序,获取一个不冲突的线性的课程教学流程。(课程线性排列,每门课上课时其先修课程已经被安排)。基本要求:(1) 输入参数:课程总数,每门课的课程号(固定占3位的字母数字串)和直接先修课的课程号。(2) 若根据输入条件问题无解,则报告适当的信息;否则将教学计划输出到用户指定的文件中。一、 需求分析:本程序需要基于图的基本操作来实现二、概要设计 : 抽象数据类型 :为实现上述功能需建立一个结点类,线性表类,图类。 算法
2、的基本思想 : 1、图的构建:建立一个结点类,类的元素有字符型变量用来存储字母,整形变量用来存储位置,该类型的指针,指向下一个元素。建立一个线性表类,完成线性表的构建。建立一个图类,完成图的信息的读取,(如有n个点,则建立n个线性表,将每个结点与其指向的结点组成一个线性表,并记录线性表的长度)。2、Topsort算法:先计算每个点的入度,保存在数组中。找到第一个入度为0的点,将该点所连的各点的入度减一。再在这些点中找入度为0 的点。如果找到,重复上述操作。如果找不到,则跳出while循环,再搜索其他的点,看入度是否为0。再重复上述操作,如果所有的入度为0的点都被寻找到,但个数少于输入顶点的个数
3、,说明该图存在环。程序的流程 程序由三个模块组成: 输入模块: 读入图的信息(顶点和边,用线性表进行存储)。处理模块:topsort算法。输出模块:将结果输出。 三、详细设计 算法的具体步骤:class Node/结点类public: string node; int position; /位置 Node* next; bool visit; /是否被访问 Node()visit=false;next=NULL;position=0;node= ;class Line /线性表类public:int num;Node* head;Node* rear;Node* fence;Line()num
4、=0;head=fence=rear=new Node(); void insert(int v,string ch) /插入元素Node* current=new Node();current-node=ch;current-position=v;fence-next=current;fence=current;num+;class Graph /图类private:int numVertex;int numEdge;Line* line;public:Graph(int v,int e)numVertex=v;numEdge=e;line =new Linev;void pushVerte
5、x() /读入点string ch;for(int i=0;inumVertex;i+)cout请输入顶点i+1ch;linei.head-node=ch;linei.head-position=i;void pushEdge() /读入边string ch1,ch2;int pos1,pos2;for(int i=0;inumEdge;i+)cout请输入边i+1ch1ch2;for(int j=0;jnode=ch1)pos1=j; /找到该字母对应的位置if(linej.head-node=ch2)pos2=linej.head-position;break;linepos1.inser
6、t(pos2,ch2); void topsort() /拓扑排序int i;int *d=new intnumVertex; for(i=0;inumVertex;i+)di=0; /数组初始化for(i=0;inext!=NULL)dp-next-position+; /计算每个点的入度 p=p-next;int top=-1,m=0,j,k;for(i=0;inumVertex;i+)if(di=0)di=top; /找到第一个入度为0的点 top=i;while(top!=-1) j=top; top=dtop; coutnodenext!=NULL) k=p-next-positio
7、n; dk-; /当起点被删除,时后面的点的入度-1 if(dk=0)dk=top; top=k; p=p-next; coutendl; if(mnumVertex) /输出点的个数小于输入点的个数,不能完全遍历 cout网络存在回路endl; delete d;int main() int n,m;cout请输入节点的个数和边的个数nm;Graph G(n,m); G.pushVertex();G.pushEdge();G.topsort ();system(pause); return 0;四、调试分析 略。 五、测试结果 本实验的测试结果截图如下:注:此处由于不会用文件流输入和输出,故
8、在命令提示符上直接进行输入。六、用户使用说明(可选) 1 、本程序的运行环境为windows 操作系统,执行文件为Untitled1.exe 2 、运行程序时 提示输入数据 并且输入数据然后回车就可以继续输入相应数据,最后即可得到结果。七、实验心得(可选) 1、 本实验是在图的遍历问题的基础上做的,图的构建大部分是采用图的遍历问题中的代码(不过要将结点类中的char改为string型),自己另外写了topsort函数,就完成了整个程序。2、 topsort函数中一开始采用的方法是找到一个入度为0的点,完成相应的操作后,重新进行搜索,后来改进代码,先搜索入度为0的点后面连接的点,这样减少了算法复
9、杂度。附录(实验代码): #include#includeusing namespace std;class Node/结点类public: string node; int position; /位置 Node* next; bool visit; /是否被访问 Node()visit=false;next=NULL;position=0;node= ;class Line /线性表类public:int num;Node* head;Node* rear;Node* fence;Line()num=0;head=fence=rear=new Node(); void insert(int
10、v,string ch) /插入元素Node* current=new Node();current-node=ch;current-position=v;fence-next=current;fence=current;num+;class Graph /图类private:int numVertex;int numEdge;Line* line;public:Graph(int v,int e)numVertex=v;numEdge=e;line =new Linev;void pushVertex() /读入点string ch;for(int i=0;inumVertex;i+)cou
11、t请输入顶点i+1ch;linei.head-node=ch;linei.head-position=i;void pushEdge() /读入边string ch1,ch2;int pos1,pos2;for(int i=0;inumEdge;i+)cout请输入边i+1ch1ch2;for(int j=0;jnode=ch1)pos1=j; /找到该字母对应的位置if(linej.head-node=ch2)pos2=linej.head-position;break;linepos1.insert(pos2,ch2); void topsort() /拓扑排序int i;int *d=n
12、ew intnumVertex; for(i=0;inumVertex;i+)di=0; /数组初始化for(i=0;inext!=NULL)dp-next-position+; /计算每个点的入度 p=p-next;int top=-1,m=0,j,k;for(i=0;inumVertex;i+)if(di=0)di=top; /找到第一个入度为0的点 top=i;while(top!=-1) j=top; top=dtop; coutnodenext!=NULL) k=p-next-position; dk-; /当起点被删除,时后面的点的入度-1 if(dk=0)dk=top; top=k; p=p-next; cou
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024至2030年十孔蚕丝枕项目投资价值分析报告
- 2024至2030年乙硫苯威项目投资价值分析报告
- 陕西铁路工程职业技术学院《化学教学论》2023-2024学年第一学期期末试卷
- 2024年防反光漆喷涂料项目可行性研究报告
- 陕西师范大学《传播学质化研究方法》2023-2024学年第一学期期末试卷
- 养猪设备采购合同范例
- 冲贷借款合同范例
- 物料制造合同范例
- 2024年无糖黑提子酒项目可行性研究报告
- 2024年工业用氢氧化钠项目可行性研究报告
- 【政治】期末复习测试卷-2024-2025学年统编版道德与法治七年级上册
- 王维《山居秋暝》诗歌鉴赏与意境探究教学设计
- 社区妇联2024工作计划
- 跨学科实践活动7+垃圾的分类与回收利用(教学设计)九年级化学下册同步高效课堂(人教版2024)
- 中建深基坑工程土方开挖专项施工方案
- 2024年世界职业院校技能大赛中职组“水利工程制图与应用组”赛项考试题库(含答案)
- 常见的氨基酸的分类特点及理化性质
- 广东省广州市越秀区2023-2024学年八年级上学期期末语文试题(解析版)
- 【碳足迹报告】新乡市锦源化工对位脂产品碳足迹报告
- 2024年高尔夫球车项目可行性研究报告
- 民事陪审员培训课件
评论
0/150
提交评论