logo资料库

拓扑排序------打印输出计算机本科专业4年每学期的课表_数据结构与算法设计课程设计格式.doc

第1页 / 共12页
第2页 / 共12页
第3页 / 共12页
第4页 / 共12页
第5页 / 共12页
第6页 / 共12页
第7页 / 共12页
第8页 / 共12页
资料共12页,剩余部分请下载后查看
数据结构与算法分析课程设计报告
数据结构与算法分析课程设计报告 课题名称: 拓扑排序 打印输出计算机本科专业 4 年每学期的课表 提交文档学生姓名: 提交文档学生学号: 同组 成 员 名 单: 指导 教 师 姓 名: 指导教师评阅成绩: 指导教师评阅意见: . . 提交报告时间:2012 年 月 日
1. 实验题目: 拓扑排序------打印输出计算机本科专业 4 年每学期的课表 2. 实验的目的和要求: 1.采用 C++实现; 2.熟练掌握图的应用; 3.熟练掌握图的邻接表存储结构以及拓扑排序的基本思想。 4.上机调试程序,掌握查错、排错使程序能正确运行 3. 实验的环境: 1.硬件环境: CPU : Inter (R) Core (TM) i5-3210M 2.50GHz 内存: 8GB 硬盘: 1TB 显卡: Inter (R) HD Graphics 4000 NVIDIAGeForce GT 645M 2.软件环境: Windows 7 旗舰版 sp1 64 位 Microsoft Visual C++ 6.0 DEV C++ Microsoft Visio 2010 文本文档 QQ 截屏软件 WPS 文字 WPS 表格 WPS 演示 4. 算法描述:  程序流程图
 类的层次结构(UML 图)
 测试程序说明 输出的文件必须和程序源文件在同一个文件目录下,否则要求输入文件名的绝对路 径,才能正确运行。输入学期时必须按提示输入。对应数字为相应的学期。 提示如下: 大一(上,下)(11,12),大二(上,下)(21,22) 大三(上,下)(31,32),大四(上,下)(41,42) 5. 源程序清单: #include #include #include #include usingnamespacestd; //数据域 typedefstructnode{ int adjvex; structnode*next; }edgenode; //边结点 typedefstructvnode{ //顶点 //入度 int id; edgenode*link; }vnode,adjlist[100]; typedefadjlist lgraph; typedefstructsnode { //栈结点 int data; structsnode *next; // 指针 //数据域 }link_stack; link_stack*top,*s; structinformation{ //含课程名与序号的结构 string course_name;//课程名 int course_num; //课程序号 }; //函数域 voidpush(link_stack**top,int x)//入栈 { s=(link_stack*)malloc(sizeof(link_stack));//建立新结点 s->data=x; s->next=(*top)->next;
(*top)->next=s; } //出栈,取得栈顶元素 voidgettop(link_stack**top,int *x) { s=(*top)->next; *x=s->data; (*top)->next=s->next; free(s); //释放指针 } //从文件中读内容存到动态数组中 vectorreadfile() { charfile[20]; cout<<"请输入文件名:"; cin>>file; ifstream get(file); if(!get.is_open()) { cout<<"该文件打开失败!!!" <vInFo; while(getline(get,line)) { if(step++%2==0) { //读取课程名 info.course_name= line; } else { //读取课程序号 info.course_num=(int)atof(line.c_str()); vInFo.push_back(info); } } cout<<"读入成功!"<表示边,ve,ed 分别表示总结点与总边数
if((m>=0)&&(m<=ve)&&(n>=0)&&(n<=ve)&&(n!=m)) { //验证m,n 合法则输入,以建立邻接表 p=(edgenode*)malloc(sizeof(edgenode)); p->adjvex=n; //顶点 p->next=gl[m].link; gl[m].link=p; gl[n].id++;//顶点n 入度+1 //在相应位置插入邻接表 } else {cout<<"原图有环!!!";} } //创建图 int creatGraph(lgraphgl) { //表示边,ve,ed 分别表示总结点与总边数 int m,n,ve=0,ed=0,i=0; edgenode*p; vectorauto_arry; auto_arry=readfile(); ve=auto_arry.size()-9; //后面9 名功课不由电脑指定。 for(i=1;i<=ve;i++) { //初始化邻接表 gl[i].link=NULL; gl[i].id=0; } for(i=6;i<11;i++) { //插入边 m=3;n=auto_arry[i].course_num; insertEdge(m,n,ve,p,gl); } insertEdge(3,18,ve,p,gl); for(i=19;i<29;i++) { m=3;n=auto_arry[i].course_num; insertEdge(m,n,ve,p,gl); } insertEdge(1,2,ve,p,gl); insertEdge(2,3,ve,p,gl); insertEdge(3,5,ve,p,gl); insertEdge(1,4,ve,p,gl); insertEdge(4,5,ve,p,gl); insertEdge(6,17,ve,p,gl); insertEdge(12,14,ve,p,gl); insertEdge(12,15,ve,p,gl); return ve; } //拓扑排序 vectortuopusort(lgraph g,int n)
{ //定义数组用来存放排序好的课程序号。 int i,j,m=0,k=0; informationkeXu; vectorxuHao; edgenode*p; top=(link_stack*)malloc(sizeof(link_stack)); top->next=NULL; for(i=1;i<=n;i++) if(g[i].id==0) push(&top,i); //入度(id)为零则入栈 while(top->next!=NULL) { //获得排好的课程序号。 gettop(&top,&i); keXu.course_num=i; xuHao.push_back(keXu);//并存入数组中。 m++; p=g[i].link; while(p) { // 以p 为起点的边的尾点入度-1 j=p->adjvex; g[j].id--; if(g[j].id==0) push(&top,j); //入度(id)为零则入栈 p=p->next; //否则下一条边 } } if(mnumber; vectorgetCourse; lgraphgl; number=tuopusort(gl,creatGraph(gl)); cout<<"请再次输入!"<
cin>>term; switch(term) { case11: cout<<"大一上学期的课表为:"<
分享到:
收藏