数据结构与算法大作业.docx
《数据结构与算法大作业.docx》由会员分享,可在线阅读,更多相关《数据结构与算法大作业.docx(67页珍藏版)》请在冰豆网上搜索。
![数据结构与算法大作业.docx](https://file1.bdocx.com/fileroot1/2023-2/4/a13c85d5-152a-4b9a-855f-1f6a2a405f99/a13c85d5-152a-4b9a-855f-1f6a2a405f991.gif)
数据结构与算法大作业
课程设计说明书
课程名称:
数据结构与算法
设计题目:
校园导游程序
院系:
计算机科学与信息工程学院
学生姓名:
丁守亮
学号:
201003030007
专业班级:
10级软件工程一班
指导教师:
闫怀平
2012年6月15日
课程设计任务书
设计题目
校园导游程序
学生姓名
丁守亮
所在院系
计算机科学与信息工程学院
专业、年级、班
10级软件工程一班
设计要求:
应用无向网表示学校的校园景点平面图
(1)建图
以图中顶点表示主要景点,并存放景点的编号、名称、简介等信息;
图中的边表示景点间的道路,存放路径长度等信息。
(2)查询
该系统可以查询景点的信息;
查询图中任意两个景点间的最短路径;
查询图中任意两个景点间的所有路径。
(3)更新
可以进行景点的更新,如去除、增添景点和路径,
可以随时对景点间路径长度的更新。
学生应完成的工作:
根据设计要求,我们需完成如下工作:
程序编写方面:
(1)建立无向图,保存景点信息和路径信息;
(2)景点相关信息查询函数;
(3)查询图中任意两个景点间最短路径函数;
(4)查询图中任意两个景点间的所有路径函数;
(5)更新景点信息函数,需要完成对以下函数的调用
1)增加景点的信息函数;
2)增加道路的信息函数;
3)删除景点的信息函数;
4)删除道路的信息函数;
5)更新道路权值的信息函数。
(6)建立校园景点平面图;
(7)对
(2)、(3)、(4)、(5)、(6)功能函数调用函数。
其他方面:
(1)对编写完成的程序进行上机调试;
(2)运行程序;
(3)对运行结果进行分析;
(4)撰写课程设计说明书
(5)完成设计答辩。
参考文献阅读:
[1]严蔚敏、吴伟民.据结构(c语言版).北京:
清华大学出版社.2009
[2]谭浩强.C程序设计(第四版).北京:
清华大学出版社.2010
[3]严蔚敏、吴伟民.据结构题集.北京:
清华大学出版社.2009
工作计划:
本次课程设计时间为2011—2012学年度第二学期的第17、18周
1、第一周的第一天:
小组布置设计题目;说明进度安排。
2、第一周的第二天:
小组审题,查阅资料,进行设计前的必要资料准备。
3、第一周的第三天、第四天、第五天:
程序编写、上机调试
4、第二周的第一天至第三天:
上机调试程序、结果分析。
5、第二周的第四天:
撰写设计报告。
6、第二周的第五天:
设计答辩及成绩评定。
任务下达日期:
2012年6月4日
任务完成日期:
2012年6月15日
指导教师(签名):
学生(签名):
校园导游程序
摘要:
随着现代旅游业的快速发展,图文声像导游方式和实地口语导游方式都已经不能满足现阶段旅游者的需求,信息化的飞速发展造就了地理信息系统(GIS)和全球定位系统(GPS),促使消费者更多的选择自助游和自驾游等方式出行。
而近年来高等院校的发展使得高校也成为了一个景点。
如何让游客以最短的时间到达旅游目的地就是本文所寻求解决的问题。
文章通过最短路径算法,并结合实际情况以高等院校为例采集所需要的数据,理论上使得游客可以轻松的寻找到最适合自己的旅游线路,并以此为依据合理安排自己的行程。
关键词:
数据结构图结点边权景点路径距离
1.设计背景…………………………………………………………1
1.1课程设计目的……………………………………………1
1.2题目要求…………………………………………………1
2.设计方案………………………………………………………2
2.1功能构思…………………………………………………2
2.2方法实现…………………………………………………3
3.方案实施………………………………………………………4
3.1基本操作…………………………………………………4
3.2各步操作函数模块………………………………………4
4.结果和结论……………………………………………………17
4.1运行结果…………………………………………………17
4.2结论………………………………………………………25
5.收获和致谢……………………………………………………26
6.参考文献………………………………………………………27
7.附件……………………………………………………………28
1.设计背景
1.1课程设计目的
数据结构是计算机程序设计的重要理论技术基础,它不仅是计算机科学的核心课程,而且已成为其他理工专业的热门选修课。
从课程性质上讲,数据结构是一门专业技术基础课。
它的教学要求是:
学会分析研究计算机加工的数据结构的特性,以便为应用涉及的数据选择适当地逻辑结构,存储结构和其相应的算法,并初步掌握算法的时间分析和空间分析的技术。
另一方面,本课程的学习也是复杂程序的设计的训练过程,要求学生编写的程序结构清楚和正确易读,符合软件工程的规范。
如果说高级语言程序设计的训练过程,要进行结构化的程序设计的初步训练的话,那么数据结构就要培养我们的数据抽象能力。
本次课程设计的目的就是培养学生运用数据结构中基本算法进行处理现实中的问题的能力。
通过本次课程设计,可以让学生更好地掌握数据结构中的各类基本算法,并运用C语言完成简单的编程,为以后更好的学习高级编程语言打下基础。
1.2题目要求
本次设计要求两人合作共同完成:
1.景点信息和路径信息保存在文本文件,景点个数不少于20个
2.查询各景点的相关信息;
3.查询图中任意两个景点间的最短路径。
4.查询图中任意两个景点间的所有路径。
5.增加、删除、更新有关景点和道路的信息。
2.设计方案
2.1功能构思
2.1.1问题的分析和结构的设计思路
1)在安阳工学院校内选取具有代表性的景点,把这些景点看作无向带权图的各个结点,景点间的路径看作无向图的边,两景点之间的距离以各对应边上的权值表示。
2)校园咨询程序要为用户提供最佳路径查询,根据用户提供的起始景点和终端景点输出最佳的路径,此时,可以运用弗洛伊德算法函数完成最短路径的输出。
3)校园咨询程序可以用迪杰斯特拉算法完成在游客只提供起始景点的情况下,告知游客到校园内其余景点的最短路径。
4)景点信息的更新则可以在无向图中以添加、删除结点,添加、删除边以及改变各边权值表示。
2.1.2校园导游咨询程序的算法思想及设计
1)由校园各景点建立起的无向带权图,采用邻接矩阵的形式进行存储,其中点信息的存储形式如“strcpy(c.vexs[0].name,"南门");strcpy(c.vexs[0].introduction,"安阳工学院正门")”所示,各边以及路径长度的则以c.arcs[i][j].adj=Infinity表示(其中i,j表示景点的编号)。
2)校园任意两景点间的最短路径问题则可以用弗洛伊德算法实现,
3)显示校园其中一个景点到其余各景点的最短路径的过程用迪杰斯特拉算法求一个结点到其余各结点的最短路径像似,因此我们可以采用迪杰斯特拉算法实现。
4)校园景点的更新,我们则可以在无向图中做出相应的表示。
2.1.3校园导游咨询程序的设计流程图:
校园导游程序
查询两景点间的所有路径
查找两景点间最短路径
创建校园平面图
初始化无向图
查询一个景点到其余各景点最短路径
图形更新
更新边的权值
插入和删除边
插入和删除结点
2.2方法实现
2.2.1基本操作函数实现
1.建立无向图的初始化
mgraphinitgraph()
2.查找景点在图中的序号
intlocatevex(mgraphc,intv)
3.求序号为m,n景点间的长度不超过8个景点的路径
voidpath(mgraphc,intm,intn,intk)
4.打印两景点间的景点个数不超过8的所有路径。
调用2
intallpath(mgraphc)
5.用迪杰斯特拉算法,求出一个景点到其他景点间的最短路径,并打印
voidshortestpath_dij(mgraphc)
6.构造图的邻接矩阵
intcreatgragh(mgraph&c)
7.建图、更新信息、删除、增加结点和边
intnewgraph(mgraph&c)//新建图
intenarc(mgraph&c)//增加边
intenvex(mgraph&c)//增加结点
intdelvex(mgraph&c)//删除结点
intdelarc(mgraph&c)//删除边
8.使用FLOYD算法查询两景点间的最短路径
voidshortestpath_floyd(mgraphc)
3.方案实施
3.1基本操作
3.1.1完成图的各个模块以及各模块之间的调用
Main()
Allpath()
Printmatrix()
Printfmap()
Changegraph()
shortestpath_dij()
browsecompus()
Seeabout()
shortestpath_floyd()
delvex
Creatgragh
newgraph
enarc
envex
delarc
3.2各步操作函数模块
3.2.1定义边、点、图结构体以及整形变量
typedefstructarcell{//边结构体
intadj;
}arcell,adjmatrix[MaxVertexNum][MaxVertexNum];
typedefstructvexsinfo{//点信息结构体
intposition;
charname[32];
charintroduction[256];
}vexsinfo;
typedefstructmgraph{//图结构体
vexsinfovexs[MaxVertexNum];
adjmatrixarcs;
intvexnum,arcnum;
}mgraph;
3.2.2无向图的邻接矩阵存储
mgraphinitgraph()//对图初始化
{
inti=0,j=0;
mgraphc;
c.vexnum=21;
c.arcnum=36;
for(i=0;ic.vexs[i].position=i;
strcpy(c.vexs[0].name,"南门");//依次输入顶点信息
strcpy(c.vexs[0].introduction,"安阳工学院正门");
strcpy(c.vexs[1].name,"报告厅");
strcpy(c.vexs[1].introduction,"学生聆听名人演讲的地方");
strcpy(c.vexs[2].name,"行政楼");
strcpy(c.vexs[2].introduction,"教务后勤办公处");
strcpy(c.vexs[3].name,"主教楼");
strcpy(c.vexs[3].introduction,"考研学生的自习室");
strcpy(c.vexs[4].name,"明德湖");
strcpy(c.vexs[4].introduction,"学生早读之处");
strcpy(c.vexs[5].name,"求索广场");
strcpy(c.vexs[5].introduction,"因有八卦图故名求索");
strcpy(c.vexs[6].name,"网球场");
strcpy(c.vexs[6].introduction,"网球运动绝佳圣地");
strcpy(c.vexs[7].name,"足球场");
strcpy(c.vexs[7].introduction,"每年大学生春季运动会在这里举办");
strcpy(c.vexs[8].name,"宿舍楼");
strcpy(c.vexs[8].introduction,"校内女生宿舍,离餐厅很近");
strcpy(c.vexs[9].name,"餐厅");
strcpy(c.vexs[9].introduction,"校内学生在这里就餐");
strcpy(c.vexs[10].name,"羽毛球场");
strcpy(c.vexs[10].introduction,"学生运动好去处");
strcpy(c.vexs[11].name,"工行取款机");
strcpy(c.vexs[11].introduction,"方便学生取钱的地方");
strcpy(c.vexs[12].name,"医务室");
strcpy(c.vexs[12].introduction,"小病,可以轻松治愈");
strcpy(c.vexs[13].name,"外语学院");
strcpy(c.vexs[13].introduction,"在这里你可以进行英语交流");
strcpy(c.vexs[14].name,"艺术楼");
strcpy(c.vexs[14].introduction,"每年都有书画展览");
strcpy(c.vexs[15].name,"卫东超市");
strcpy(c.vexs[15].introduction,"生活和学习用品销售");
strcpy(c.vexs[16].name,"至善湖");
strcpy(c.vexs[16].introduction,"充满灵性和流动");
strcpy(c.vexs[17].name,"乒乓球场");
strcpy(c.vexs[17].introduction,"休闲生活,运动至上");
strcpy(c.vexs[18].name,"计科学院");
strcpy(c.vexs[18].introduction,"软工、网工、计科学习之处");
strcpy(c.vexs[19].name,"篮球场");
strcpy(c.vexs[19].introduction,"男生的天堂");
strcpy(c.vexs[20].name,"图书馆");
strcpy(c.vexs[20].introduction,"图书馆大楼,高5层");
for(i=0;ifor(j=0;jc.arcs[i][j].adj=Infinity;//先初始化图的邻接矩阵
c.arcs[0][1].adj=100;c.arcs[0][2].adj=300;c.arcs[0][3].adj=500;c.arcs[0][4].adj=80;
c.arcs[1][7].adj=150;
c.arcs[2][3].adj=200;c.arcs[2][4].adj=200;c.arcs[2][5].adj=200;c.arcs[2][10].adj=200;
c.arcs[3][4].adj=200;c.arcs[3][5].adj=300;c.arcs[3][10].adj=200;
c.arcs[4][5].adj=150;c.arcs[4][9].adj=100;
c.arcs[5][10].adj=150;c.arcs[5][11].adj=100;
c.arcs[6][7].adj=50;c.arcs[6][8].adj=90;
c.arcs[7][8].adj=50;
c.arcs[8][9].adj=100;c.arcs[8][17].adj=150;
c.arcs[9][10].adj=150;c.arcs[9][15].adj=50;
c.arcs[10][11].adj=200;
c.arcs[11][12].adj=50;
c.arcs[12][13].adj=250;
c.arcs[13][14].adj=150;c.arcs[13][20].adj=500;
c.arcs[14][16].adj=90;c.arcs[14][20].adj=500;
c.arcs[15][16].adj=150;
c.arcs[16][18].adj=40;c.arcs[16][20].adj=300;
c.arcs[17][18].adj=100;
c.arcs[18][19].adj=100;
c.arcs[19][20].adj=300;
for(i=0;ifor(j=0;jc.arcs[j][i].adj=c.arcs[i][j].adj;
returnc;
}//initgraph
3.2.3迪杰斯特拉算法求一个景点到其余各景点的最短路径
//用迪杰斯特拉算法,求出一个景点到其他景点间的最短路径,并打印
voidshortestpath_dij(mgraphc)
{
intv,w,i,min,t=0,x,flag=1,v0;//vo为起始景点的编号
intfinal[35],d[35],p[35][35];
printf("请输入一个起始景点的编号:
");
scanf("%d",&v0);
while(v0<0||v0>c.vexnum)
{
printf("你所输入的景点编号不存在.\n");
printf("请重新输入:
");
scanf("%d",&v0);
}
for(v=0;v{
final[v]=0;//初始化各顶点访问标志
d[v]=c.arcs[v0][v].adj;//v0到各顶点v的权值赋值给d[v]
for(w=0;wp[v][w]=0;
if(d[v]{
p[v][v0]=1;
p[v][v]=1;//各顶点自己到自己要连通
}
}
d[v0]=0;//自己到自己的权值设为0
final[v0]=1;//v0的访问标志设为1,v属于s集
for(i=1;i{
min=Infinity;
for(w=0;wif(!
final[w])
if(d[w]{
v=w;
min=d[w];
}
final[v]=1;//v的访问标志设置为1,v属于s集
for(w=0;wif(!
final[w]&&(min+c.arcs[v][w].adj{
d[w]=min+c.arcs[v][w].adj;//修改v0到w的权值d[w]
for(x=0;xp[w][x]=p[v][x];
p[w][w]=1;
}
}
for(v=0;v{
if(v!
=v0)
printf("%s",c.vexs[v0].name);//输出景点v0的景点名
for(w=0;w{
if(p[v][w]&&w!
=v0&&w!
=v)//若w是且w不等于v0,则输出该景点
printf("--->%s",c.vexs[w].name);
}
printf("---->%s",c.vexs[v].name);
printf("\n总路线长为%d米\n",d[v]);
}
}
3.2.4实现景点的更新
//(6)构造图的邻接矩阵
intcreatgragh(mgraph&c)//建图。
以图的邻接矩阵存储图
{
inti,j,m,n;
intv0,v1;
intdistance;
printf("请输入图的顶点数和边数:
");
scanf("%d%d",&c.vexnum,&c.arcnum);
while(c.arcnum>(c.vexnum*(c.vexnum-1)/2))//无向网的边数最多为n*(n-1)/2,
{
printf("输入边数有误,请重新输入所建新图的边数:
");//输入边数过多时报错
scanf("%d",&c.arcnum);
}
printf("\n**********下面请输入景点的信息:
************\n");
for(i=0;i{
printf("\n请输入景点的名称:
");
scanf("%s",c.vexs[i].name);
printf("\n请输入景点的简介:
");
scanf("%s",c.vexs[i].introduction);
}
for(i=0;ifor(j=0;jc.arcs[i][j].adj=Infinity;
printf("\n************下面请输入图的边的信息:
***********\n");
for(i=1;i<=c.arcnum;i++)//构造邻接矩阵
{
printf("\n第%d条边的起点终点长度为:
",i);//输入一条边的起点、终点及权值
scanf("%d%d%d",&v0,&v1,&distance);