数据结构课程设计校园导航_第1页
数据结构课程设计校园导航_第2页
数据结构课程设计校园导航_第3页
数据结构课程设计校园导航_第4页
数据结构课程设计校园导航_第5页
已阅读5页,还剩22页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据结构课程设计校园导航数据结构课程设计校园导航数据结构课程设计校园导航数据结构课程设计校园导航编制仅供参考审核批准生效日期地址:电话:传真:邮编:一、课程设计目的本课程设计的目标就是要达到理论与实际应用相结合,提高学生组织数据及编写大型程序的能力,并培养基本的、良好的程序设计技能以及合作能力。设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。课程设计内容1)问题描述用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。要求能够回答有关景点介绍、游览路径等问题。2)基本要求(1)查询各景点的相关信息;(2)查询图中任意两个景点间的最短路径。(3)查询图中任意两个景点间的所有路径。增加、删除、更新有关景点和道路的信息三、课程设计过程1.需求分析(1)设计学校的校园平面图,选取出若干的具有代表性的景点构成一个抽象的无向带权图,顶点为景点,边的权值代表了景点间路径的长度。(2)将景点的序号,名称,介绍存放起来准备查询。(3)提供任意景点的信息;(4)提供任意经典的路径查询及其最优路线的查询(5)平面图景点的增加及删除,以及边和权值(长度)的改变2.概要设计1:第一点是主界面的设计,首先,为了该系统各个功能的管理,设计出含有多个菜单项的主菜单界面,可以更方便的使用该系统。2:第二点是存储结构的设计,采取了图结构类型(mgraph)存储校园图的信息,景点信息用结构数组vexs存储,而且利用全局变量:visited[]数组用于存储顶点是否被访问标志;d[]数组用于存放权值和查找路径顶点的编号;campus是一个图结构的全局变量。3:第三点是设计各个功能的实现,学校景点的介绍通过函数browsecompus()来实现;查询景点间的最段路径通过Floyd(弗洛伊德)算法实现;查询景点间的所有路径通过allpath函数和path函数来实现;更改图的信息可以由主函数changegraph以及其他函数可以实现。详细设计(1)主要的操作界面的显示以及无向网操作voidinitgraph(graph*ga){ inti,j; ga->n=9; ga->e=11;for(i=0;i<ga->n;i++){ ga->vexs[i].num=i;}strcpy(ga->vexs[0].name,"西门"); strcpy(ga->vexs[0].introduce,"学校的正大门,设有公交站"); strcpy(ga->vexs[1].name,"风雨篮球场"); strcpy(ga->vexs[1].introduce,""); strcpy(ga->vexs[2].name,"田径场"); strcpy(ga->vexs[2].introduce,"举办运动会,平时体育跑步锻炼等"); strcpy(ga->vexs[3].name,"京元食堂"); strcpy(ga->vexs[3].introduce,"新食堂"); strcpy(ga->vexs[4].name,"苍霞湖畔"); strcpy(ga->vexs[4].introduce,"戏称“分手湖”,景色宜人"); strcpy(ga->vexs[5].name,"思源楼"); strcpy(ga->vexs[5].introduce,"学校王牌土木的教学区"); strcpy(ga->vexs[6].name,"图书馆"); strcpy(ga->vexs[6].introduce,"是大学城最高的标志性建筑"); strcpy(ga->vexs[7].name,"北教区"); strcpy(ga->vexs[7].introduce,"北校区集中的教学楼"); strcpy(ga->vexs[8].name,"禾堂餐厅"); strcpy(ga->vexs[8].introduce,"旧食堂");for(i=0;i<ga->n;i++) for(j=0;j<ga->n;j++) ga->edges[i][j]=1000; ga->edges[0][1]=1; ga->edges[1][2]=2; ga->edges[1][3]=5; ga->edges[2][4]=4; ga->edges[3][4]=9; ga->edges[4][5]=1; ga->edges[4][8]=1; ga->edges[5][6]=5; ga->edges[5][7]=7; ga->edges[7][8]=1; ga->edges[6][7]=9;for(i=0;i<ga->n;i++) for(j=0;j<ga->n;j++) ga->edges[j][i]=ga->edges[i][j];}(2)确定顶点是否存在已经顶点是否已经被访问过来确定路径voidCreate_graph(graph*ga){ inti,j,k,w; printf("请输入顶点数和边数:\n"); scanf("%d%d",&(ga->n),&(ga->e)); printf("请输入景点编号,景点名字,景点介绍,建立信息表:\n"); for(i=0;i<ga->n;i++) { scanf("%d",&(ga->vexs[i].num)); gets(ga->vexs[i].name); gets(ga->vexs[i].introduce); } for(i=0;i<ga->n;i++) for(j=0;j<=ga->n;j++) ga->edges[i][j]=1000; for(k=0;k<ga->e;k++) { printf("请输入%d条边的景点序号i,j和长度:",k+1); scanf("%d%d%d",&i,&j,&w);ga->edges[i][j]=w; ga->edges[j][i]=w; }}voidprint(graphga){inti,j;for(i=0;i<ga.n;i++) for(j=0;j<ga.n;j++) { printf("%d",ga.edges[i][j]);if(j+1==ga.n) printf("\n"); }}voidvisit(graphga){ inta; printf("请输入景点编号:"); scanf("%d",&a);inti; for(i=0;i<ga.n;i++){ if(a==ga.vexs[i].num) { printf("景点编号为%d\n",ga.vexs[i].num); printf("景点名称为"); puts(ga.vexs[i].name); printf("景点介绍为"); puts(ga.vexs[i].introduce); break; }}if(i==ga.n)printf("无此点\n");}(3)得出景点间的最短路径voidshortestpath_djst(graphga){}voidshortestpath_floyd(graphga){inti,j,k,v,u,w,d[35][35],p[35][35][35]; for(v=0;v<ga.n;v++) { for(w=0;w<ga.n;w++) { d[v][w]=ga.edges[v][w]; for(u=0;u<ga.n;u++) { p[v][w][u]=0; } if(d[v][w]<1000) { p[v][w][v]=1; p[v][w][w]=1; } } }for(u=0;u<ga.n;u++) { for(v=0;v<ga.n;v++) for(w=0;w<ga.n;w++) if(d[v][u]+d[u][w]<d[v][w]) { d[v][w]=d[v][u]+d[u][w]; for(i=0;i<ga.n;i++) p[v][w][i]=p[v][u][i]||p[u][w][i]; } } printf("\n请输入出发点和目的地编号:"); scanf("%d%d",&k,&j); printf("\n\n"); while(k<0||k>ga.n||j<0||j>ga.n) {printf("\n输入的编号不存在"); printf("\n请重新输入编号:\n\n"); scanf("%d%d",&k,&j); printf("\n\n"); } printf("%s",ga.vexs[k].name); for(u=0;u<ga.n;u++) if(p[k][j][u]&&k!=u&&j!=u) printf("--->%s",ga.vexs[u].name); printf("--->%s",ga.vexs[j].name); printf("\n\n\n总长度为%d千米\n\n\n",d[k][j]);}(4)得到景点之间的所有路径voidpath(graphc,intm,intn,intk){ ints,x=0; intt; t=k+1; if(d[k]==n&&k<8) { for(s=0;s<k;s++) { printf("%s--->",c.vexs[d[s]].name); } printf("%s\n\n",c.vexs[d[s]].name); } else { s=0; while(s<c.n) { if((c.edges[d[k]][s]<1000)&&(visited[s]==0)) { visited[s]=1; d[k+1]=s; path(c,m,n,t); visited[s]=0; } s++; } }}voidallpath(graphc){intk,i,j,m,n; printf("\n\n请输入您要查询的两个景点的编号:\n\n"); scanf("%d%d",&i,&j); printf("\n\n"); m=locatevex(c,i); n=locatevex(c,j); d[0]=m; for(k=0;k<c.n;k++) visited[k]=0; visited[m]=1; path(c,m,n,0);}(5)删除边intdelarc(graph&ga){ intm,n,v0,v1; if(ga.e<=0) { printf("图中已经无顶边,无法删除"); return1; } printf("\n请输入要删除的边的起点和终点的编号:"); scanf("%d%d",&v0,&v1);m=locatevex(ga,v0); if(m<0) { printf("此顶点%d已删除",v0); return1; } n=locatevex(ga,v1); if(n<0) { printf("此顶点%d已删除",v1); return1; } ga.edges[m][n]=1000; ga.edges[n][m]=1000; ga.e--; return1;}intenarc(graph&ga){ intm,n,distance; printf("请输入边的起点和终点编号,权值:"); scanf("%d%d%d",&m,&n,&distance); while(m<0||m>ga.n||n<0||n>ga.n){ printf("输入错误,请重新输入:"); scanf("%d%d",&m,&n);}if(locatevex(ga,m)<0){ printf("此节点%d已经删除",m); return1;}if(locatevex(ga,n)<0){ printf("此节点%d已经删除",n); return1;}ga.edges[m][n]=distance;ga.edges[n][m]=ga.edges[m][n];return1;}4.调试分析内容包括:a.调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;b.算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想;c.经验和体会等。用户使用说明通过主菜单提示,选择出你所想要知道的信息,然后通过输入节点来代替景点,从而得到景点间的所有路径,最短路径等其他信息。测试结果(1)操作的主界面学校景点的介绍学校景点从西门的禾堂餐厅的所有路径所有路径(4)学校景点从西门的禾堂餐厅的所有路径最短路径图的更改的界面(6)边的删除界面展示附录#defineMAX100//数据类型的定义#include<string>#include<iostream>usingnamespacestd;intvisited[35];intd[35];structviews{intnum; charname[10]; charintroduce[100];};typedefviewsdatatype;typedefstruct{datatypevexs[MAX];intedges[MAX][MAX];intn,e;}graph;voidinitgraph(graph*ga)//主要的操作界面的显示以及无向网操作{ inti,j; ga->n=9; ga->e=11;for(i=0;i<ga->n;i++){ ga->vexs[i].num=i;}strcpy(ga->vexs[0].name,"西门"); strcpy(ga->vexs[0].introduce,"学校的正大门,设有公交站"); strcpy(ga->vexs[1].name,"风雨篮球场"); strcpy(ga->vexs[1].introduce,""); strcpy(ga->vexs[2].name,"田径场"); strcpy(ga->vexs[2].introduce,"举办运动会,平时体育跑步锻炼等"); strcpy(ga->vexs[3].name,"京元食堂"); strcpy(ga->vexs[3].introduce,"新食堂"); strcpy(ga->vexs[4].name,"苍霞湖畔"); strcpy(ga->vexs[4].introduce,"戏称“分手湖”,景色宜人"); strcpy(ga->vexs[5].name,"思源楼"); strcpy(ga->vexs[5].introduce,"学校王牌土木的教学区"); strcpy(ga->vexs[6].name,"图书馆"); strcpy(ga->vexs[6].introduce,"是大学城最高的标志性建筑"); strcpy(ga->vexs[7].name,"北教区"); strcpy(ga->vexs[7].introduce,"北校区集中的教学楼"); strcpy(ga->vexs[8].name,"禾堂餐厅"); strcpy(ga->vexs[8].introduce,"旧食堂");for(i=0;i<ga->n;i++) for(j=0;j<ga->n;j++) ga->edges[i][j]=1000; ga->edges[0][1]=1; ga->edges[1][2]=2; ga->edges[1][3]=5; ga->edges[2][4]=4; ga->edges[3][4]=9; ga->edges[4][5]=1; ga->edges[4][8]=1; ga->edges[5][6]=5; ga->edges[5][7]=7; ga->edges[7][8]=1; ga->edges[6][7]=9;for(i=0;i<ga->n;i++) for(j=0;j<ga->n;j++) ga->edges[j][i]=ga->edges[i][j];}intlocatevex(graphga,intv)//查找景点在图中的序号{ inti; for(i=0;i<ga.n;i++) if(v==ga.vexs[i].num)returni; return-1;}voidCreate_graph(graph*ga){ inti,j,k,w; printf("请输入顶点数和边数:\n"); scanf("%d%d",&(ga->n),&(ga->e)); printf("请输入景点编号,景点名字,景点介绍,建立信息表:\n"); for(i=0;i<ga->n;i++) { scanf("%d",&(ga->vexs[i].num)); gets(ga->vexs[i].name); gets(ga->vexs[i].introduce); } for(i=0;i<ga->n;i++) for(j=0;j<=ga->n;j++) ga->edges[i][j]=1000; for(k=0;k<ga->e;k++) { printf("请输入%d条边的景点序号i,j和长度:",k+1); scanf("%d%d%d",&i,&j,&w);ga->edges[i][j]=w; ga->edges[j][i]=w; }}voidprint(graphga){inti,j;for(i=0;i<ga.n;i++) for(j=0;j<ga.n;j++) { printf("%d",ga.edges[i][j]);if(j+1==ga.n) printf("\n"); }}voidvisit(graphga){ inta; printf("请输入景点编号:"); scanf("%d",&a);inti; for(i=0;i<ga.n;i++){ if(a==ga.vexs[i].num) { printf("景点编号为%d\n",ga.vexs[i].num); printf("景点名称为"); puts(ga.vexs[i].name); printf("景点介绍为"); puts(ga.vexs[i].introduce); break; }}if(i==ga.n)printf("无此点\n");}voidshortestpath_djst(graphga){}voidshortestpath_floyd(graphga){inti,j,k,v,u,w,d[35][35],p[35][35][35]; for(v=0;v<ga.n;v++) { for(w=0;w<ga.n;w++) { d[v][w]=ga.edges[v][w]; for(u=0;u<ga.n;u++) { p[v][w][u]=0; } if(d[v][w]<1000) { p[v][w][v]=1; p[v][w][w]=1; } } }for(u=0;u<ga.n;u++) { for(v=0;v<ga.n;v++) for(w=0;w<ga.n;w++) if(d[v][u]+d[u][w]<d[v][w]) { d[v][w]=d[v][u]+d[u][w]; for(i=0;i<ga.n;i++) p[v][w][i]=p[v][u][i]||p[u][w][i]; } } printf("\n请输入出发点和目的地编号:"); scanf("%d%d",&k,&j); printf("\n\n"); while(k<0||k>ga.n||j<0||j>ga.n) {printf("\n输入的编号不存在"); printf("\n请重新输入编号:\n\n"); scanf("%d%d",&k,&j); printf("\n\n"); } printf("%s",ga.vexs[k].name); for(u=0;u<ga.n;u++) if(p[k][j][u]&&k!=u&&j!=u) printf("--->%s",ga.vexs[u].name); printf("--->%s",ga.vexs[j].name); printf("\n\n\n总长度为%d千米\n\n\n",d[k][j]);}voidpath(graphc,intm,intn,intk){ ints,x=0; intt; t=k+1; if(d[k]==n&&k<8) { for(s=0;s<k;s++) { printf("%s--->",c.vexs[d[s]].name); } printf("%s\n\n",c.vexs[d[s]].name); } else { s=0; while(s<c.n) { if((c.edges[d[k]][s]<1000)&&(visited[s]==0)) { visited[s]=1; d[k+1]=s; path(c,m,n,t); visited[s]=0; } s++; } }}voidallpath(graphc){intk,i,j,m,n; printf("\n\n请输入您要查询的两个景点的编号:\n\n"); scanf("%d%d",&i,&j); printf("\n\n"); m=locatevex(c,i); n=locatevex(c,j); d[0]=m; for(k=0;k<c.n;k++) visited[k]=0; visited[m]=1; path(c,m,n,0);}voidnewgraph(graph&ga){ intchangenum; inti,m,n,t,distance,v0,v1; printf("\n请输入要修改景点的个数:\n"); scanf("%d",&changenum); while(changenum<0||changenum>ga.n) { printf("\n输入错误!请重新输入"); scanf("%d",&changenum); } for(i=0;i<changenum;i++) { printf("\n请输入景点的编号:"); scanf("%d,&m"); t=locatevex(ga,m); printf("\n请输入景点的名称:"); scanf("%s",ga.vexs[t].name); printf("\n请输入景点简介:"); scanf("%s",ga.vexs[t].introduce); } printf("\n请输入您要更新的边数"); scanf("%d",&changenum); while(changenum<0||changenum>ga.n) { printf("输入错误,请重新输入:"); scanf("%d",&changenum); } printf("\n请输入更新边的信息:\n"); for(i=1;i<=changenum;i++) { printf("\n修改的第%d条边的起点终点长度为:",i); scanf("%d%d%d",&v0,&v1,&distance); m=locatevex(ga,v0); n=locatevex(ga,v1); if(m>=0&&n>=0) { ga.edges[m][n]=distance; ga.edges[n][m]=ga.edges[m][n]; } } }intdelvex(graph&ga)//删除顶点{ inti=0,j; intm,v; if(ga.n<=0) { printf("图中已经无顶点"); return1; } printf("\n请输入要删除的景点编号:"); scanf("%d",&v); while(v<0||v>ga.n) {printf("\n输入错误,请重新输入");scanf("%d",&v); } m=locatevex(ga,v); if(m<0) { printf("此顶点%d已删除",v); return1; } for(i=m;i<ga.n-1;i++) { strcpy(ga.vexs[i].name,ga.vexs[i+1].name); strcpy(ga.vexs[i].introduce,ga.vexs[i+1].introduce); } for(i=m;i<ga.n-1;i++) for(j=0;j<ga.n;j++) ga.edges[i][j]=ga.edges[i+1][j]; for(i=m;i<ga.n-1;i++) for(j=0;j<ga.n;j++) ga.edges[j][i]=ga.edges[j][i+1]; ga.n--; return1;}intdelarc(graph&ga)//删除边{ intm,n,v0,v1; if(ga.e<=0) { printf("图中已经无顶边,无法删除"); return1; } printf("\n请输入要删除的边的起点和终点的编号:"); scanf("%d%d",&v0,&v1);m=locatevex(ga,v0); if(m<0) { printf("此顶点%d已删除",v0); return1; } n=locatevex(ga,v1); if(n<0) { printf("此顶点%d已删除",v1); return1; } ga.edges[m][n]=1000; ga.edges[n][m]=1000; ga.e--; return1;}intenarc(graph&ga){ intm,n,distance; printf("请输入边的起点和终点编号,权值:"); scanf("%d%d%d",&m,&n,&distance); while(m<0||m>ga.n||n<0||n>ga.n){ printf("输入错误,请重新输入:"); scanf("%d%d",&m,&n);}if(locatevex(ga,m)<0){ printf("此节点%d已经删除",m); return1;}if(locatevex(ga,n)<0){ printf("此节点%d已经删除",n); return1;}ga.edges[m][n]=distance;ga.edges[n][m]=ga.edges[m][n];return1;}intenvex(graph&ga)//增加节点{ inti; printf("请输入增加节点的信息:"); printf("\n编号:"); scanf("%d",&ga.vexs[ga.n].num); printf("名称:"); scanf("%s",ga.vexs[ga.n].name); printf("简介:"); scanf("%s",ga.vexs[ga.n].introduce); ga.n++; for(i=0;i<ga.n;i++) { ga.edges[ga.n-1][i]=1000; ga.edges[i][ga.n-1]=1000; }return1;}intchangegraph(graph&ga){ intyourchoice; printf("\n请选择\n\n(1)删除结点(2)删除边\n"); printf("\n(3)增加结点(4)增加边\n"); printf("\n(5)更新信息(6)返回\n\n"); scanf("%d",&yourchoice); printf("\n\n"); while(!(yourchoice==1||yourchoice==2||yourchoice==3||yourchoice==4||yourchoice==5||yourchoice==6) printf("请重新输入:"); scanf("%d",&yourchoice); } while(1) { switch(yourchoice) { case1:delvex(ga);break; case2:delarc(ga);break; case3:envex(ga);break; case4:enarc(ga);break; case5:newgraph(ga);break;case6:return1; } printf("\n请选择\n\n(1)删除结点(2)删除边\n"); printf("\n(3)增加结点(4)增加边\n"); printf("\n(5)更新信息(6)返回\n\n"); scanf("%d",&yourchoice);printf("\n\n"); while(!(yourchoice==1||yourchoice==2||yourchoice==3||yourchoice==4||yourchoice==5|

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论