一、课程设计目的令狐采学本课程设计的目标就是要达到理论与实际应用相结合,提高学生组织数据及编写大型程序的能力,并培养基本的、良好的程序设计技能以及合作能力。
设计中要求综合运用所学知识,上机解决一些与实际应用结合紧密的、规模较大的问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握数据结构和算法设计技术,掌握分析、解决实际问题的能力。
通过这次设计,要求在数据结构的逻辑特性和物理表示、数据结构的选择和应用、算法的设计及其实现等方面,加深对课程基本内容的理解。
同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
二、课程设计内容1)问题描述用无向网表示你所在学校的校园景点平面图,图中顶点表示主要景点,存放景点的编号、名称、简介等信息,图中的边表示景点间的道路,存放路径长度等信息。
要求能够回答有关景点介绍、游览路径等问题。
2)基本要求(1)查询各景点的相关信息;(2)查询图中任意两个景点间的最短路径。
(3)查询图中任意两个景点间的所有路径。
(4)增加、删除、更新有关景点和道路的信息三、课程设计过程1.需求分析(1)设计学校的校园平面图,选取出若干的具有代表性的景点构成一个抽象的无向带权图,顶点为景点,边的权值代表了景点间路径的长度。
(2)将景点的序号,名称,介绍存放起来准备查询。
(3)提供任意景点的信息;(4)提供任意经典的路径查询及其最优路线的查询(5)平面图景点的增加及删除,以及边和权值(长度)的改变2.概要设计1:第一点是主界面的设计,首先,为了该系统各个功能的管理,设计出含有多个菜单项的主菜单界面,可以更方便的使用该系统。
2:第二点是存储结构的设计,采取了图结构类型(mgraph)存储校园图的信息,景点信息用结构数组vexs存储,而且利用全局变量:visited[]数组用于存储顶点是否被访问标志;d[]数组用于存放权值和查找路径顶点的编号;campus是一个图结构的全局变量。
3:第三点是设计各个功能的实现,学校景点的介绍通过函数browsecompus()来实现;查询景点间的最段路径通过Floyd(弗洛伊德)算法实现;查询景点间的所有路径通过allpath函数和path 函数来实现;更改图的信息可以由主函数changegraph以及其他函数可以实现。
3.详细设计(1)主要的操作界面的显示以及无向网操作void initgraph(graph *ga){int i,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++)ga->edges[j][i]=ga->edges[i][j];}(2)确定顶点是否存在已经顶点是否已经被访问过来确定路径void Create_graph(graph *ga){int i,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++)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;}}void print(graph ga){int i,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");}}void visit(graph ga){int a;printf("请输入景点编号:");scanf("%d",&a);int i;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)得出景点间的最短路径void shortestpath_djst(graph ga){}void shortestpath_floyd(graph ga){int i,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)得到景点之间的所有路径void path(graph c,int m,int n,int k) {int s,x=0;int t;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++;}}}void allpath(graph c){int k,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)删除边int delarc(graph &ga) {int m,n,v0,v1;if(ga.e<=0){printf("图中已经无顶边,无法删除");return 1;}printf("\n请输入要删除的边的起点和终点的编号:"); scanf("%d %d",&v0,&v1);m=locatevex(ga,v0);if(m<0){printf("此顶点%d已删除",v0);return 1;}n=locatevex(ga,v1);if(n<0){printf("此顶点%d已删除",v1);return 1;}ga.edges[m][n]=1000;ga.edges[n][m]=1000;ga.e--;return 1;}int enarc(graph &ga){int m,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); return 1;}if(locatevex(ga,n)<0){printf("此节点%d已经删除",n); return 1;}ga.edges[m][n]=distance;ga.edges[n][m]=ga.edges[m][n]; return 1;}4.调试分析内容包括:a.调试过程中遇到的问题是如何解决的以及对设计与实现的回顾讨论和分析;b.算法的时空分析(包括基本操作和其他算法的时间复杂度和空间复杂度的分析)和改进设想;c.经验和体会等。