数据结构与算法分析课程设计报告
课题名称:
拓扑排序
打印输出计算机本科专业 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;
vector
xuHao;
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<<"大一上学期的课表为:"<