数据结构课程设计——校园导游图
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
景德镇陶瓷学院
信息工程学院
班级:11计科(2)班
学号:************
*名:**
指导老师:李娟、徐星
时间:2013年6月27号
题目:13*:图(校园导游图)
7 :建立二叉树,层序、先序遍历
14 :拓扑排序
题目一:图(校园导游图)
1.1、需求分析:
需求:
(1)将导游图看作一张带权无向图,顶点表示公园的各个景点,边表示各景点之间的道路,边上的权值表示距离。
为此图选择适当的数据结构。
(2)把各种路径都显示给游客,由游客自己选择游览路线。
(3)画出景点分布图于屏幕上。
分析:
完成对整个导游图系统的功能实现,需要对的每一项功能都有清楚的设想和认识,了解并明确每一项功能的实现需要解决的问题,选择正确并且高效的算法把问题逐个解决,最终实现程序的正确调试运行。
有以下设计思路:(1).结合本校的实际情况,选出10个景点;
(2).人为手工为选出的10个景点赋上相关信息(名称、代号、简介信息、以及路权等等);
(3).根据选出来的10个景点用邻接矩阵存储校园图。
(4).依照景点的相关信息创建校园图。
(5).把纸质上的内容,利用C++编程语言编写查找景点相关信息的程序。
(6).根据人为赋值的路权,迪杰斯特拉算法计算任意两点之间的最短路径。
(7).综上所诉,用一个主函数把这些板块合成,生产一个菜单界面呈现在用户面前。
1.2、设计与实现:
选出本校10个景点
结合景德镇陶瓷学院实际情况,我选出以下10个景点,从1到10编号:
图的初始化
由于邻接矩阵特殊的存储方式,它非常便于快速的查找两个顶点之间的边上
的权值。
所以,图采用带权的邻接矩阵存储。
决定了图的存储方式后,以华南农业大学10个景点的游览地图作为蓝本,把校园地图抽象化成顶点与边构成的图形式,如图2.2所示,途中数字代表线的权值。
1.3、模块的划分
含有四个模块:(1)陶院地图信息
(2)陶院景点信息
(3)查找两点间最短路径
(4)退出
模板功能
(1)将陶院的地图显示在程序运用上;
(2)输入一个景点,运用程序上能够显示该景点的信息;
(3)可以给游客提供两个景点的最短路径;
(4)给游客提供方便。
1.4、代码和实现界面
实现界面:
陶院目录图陶院地图显示陶院景点信息
查找两点最短路径
退出界面
代码:
#define N 10
#define MAX 25
#define MAXedg 30
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <conio.h>
void clrscr()
{
system("cls");
}
typedef int AdjMatrix[MAX][MAX];
typedef struct
{
int vexs[MAX];
AdjMatrix arcs;
}Matrix_Graph;
typedef struct
{
char name[10];
char information[100];
struct edgenode *link;
}vexnode;
typedef struct edgenode
{
int adjvex;
int length;
char info[10];
char info2[100];
struct edgenode *next;
}edgenode, *Node ;
typedef struct Edge
{
int lengh;
int ivex, jvex;
struct Edge *next;
} EdgeType;
typedef struct
{
int num;
char name[10];
} vertex;
typedef struct
{
vertex vexs[MAX];
int edges[MAX][MAX];
}adjmax;
void Name(int i)
{
switch(i)
{
case 1:
printf("1:校门口\n\n");break;
case 2:
printf("2:A系列楼\n\n");break;
case 3:
printf("3:B系列楼\n\n");break;
case 4:
printf("4:翠湖\n\n");break;
case 5:
printf("5:体育馆\n\n");break;
case 6:
printf("6:主教楼\n\n");break;
case 7:
printf("7:图书馆\n\n");break;
case 8:
printf("8:田径场\n\n");break;
case 9:
printf("9:二食堂\n\n");break;
case 10:
printf("10:一食堂\n\n");break;
default:
printf("景点编号输入错误!请输入1-10的数字编号!\n\n"); break;
}
}
void Information(int i)/*景点介绍*/
{
switch(i)
{
case 1:
printf("校门口:学校的进门处,宏达雄伟。
\n\n");break;
case 2:
printf("A系列楼:包括行政楼,A1,A2,A3,还包括一些教室。
\n\n");break;
case 3:
printf("B系列楼:包括B1,B2,B3,主要是信息工程学院的办公处。
\n\n");break;
case 4:
printf("翠湖:学校内最大的淡水湖,夏天清爽,是情侣约会的最佳场所。
\n\n");break;
case 5:
printf("体育馆:学校最大的设备场所,是体育系学生主要的锻炼之地。
\n\n");break;
case 6:
printf("主教楼:全校学生主要的上课楼系,也是校园最高的楼。
\n\n");break;
case 7:
printf("图书馆:学生平时学习和复习以及借阅资料的楼系。
\n\n");break;
case 8:
printf("田径场:露天的场所,是学生,老师最重要的跑步以及锻炼的场所。
\n\n");break;
case 9:
printf("二食堂:私人所办的食堂,里面食物极其好吃,但是价格方面比较贵,但也受广大学生喜好。
\n\n\n");break;
case 10:
printf("一食堂:学校所办的食堂,主要优点是价格方面很是优惠。
\n\n");break;
default:
printf("景点编号输入错误!请输入1->10的数字编号!\n\n"); break;
}
}
void travgraph(vexnode g[],int n,adjmax adj) //查找指定景点信息
{
int i = 1,flag = 1,len;
char ch;
printf("\t\t\t请输入您要查询的景点序号:、\n\n");
printf("\t\t\t1.校门口2.A系列楼3.B系列楼4.翠湖 5.体育馆\n");
printf("\t\t\t6.主教楼7.图书馆8.田径场9.二食堂10.一食堂\n");
printf("你的选择是");
scanf("%d",&len);
getchar();
printf("此景点的名称是:");
Name(len);
printf("此景点的介绍是:");
Information(len);
do{
printf("\t\t是否继续? Y/N \n");
printf("\t\t你的选择是:");
scanf("%c",&ch);
getchar();
if(ch == 'Y' || ch == 'y')
{
clrscr();
flag = 1;
i = 1;
printf("\t\t\t请再次输入您要查询的景点序号:\n\n");
printf("\t\t\t1.校门口2.A系列楼3.B系列楼4.翠湖 5.体育馆\n");
printf("\t\t\t6.主教楼7.图书馆8.田径场9.二食堂10.一食堂\n");
printf("你的选择是");
scanf("%d",&len);
getchar();
printf("此景点的名称是:");
Name(len);
printf("此景点的介绍是:");
Information(len);
continue ;
}
else
{ flag = 0;
printf("\t\t请再次按回车键或者任意键加回车键返回至主菜单");
}
break;
}while(1);
}
void creat(Matrix_Graph *G)
{
int i,j;
for(i=1;i<=N;i++) G->vexs[i]=i;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++) G->arcs[i][j]=0;
G->arcs[1][2]=50; G->arcs[1][3]=40; G->arcs[1][4]=30; G->arcs[1][5]=40;
G->arcs[2][1]=50; G->arcs[2][3]=10; G->arcs[2][6]=10;
G->arcs[3][1]=40; G->arcs[3][2]=10; G->arcs[3][4]=10;
G->arcs[3][6]=10; G->arcs[3][7]=20;
G->arcs[4][1]=30; G->arcs[4][3]=10; G->arcs[4][5]=10; G->arcs[4][7]=10;
G->arcs[5][1]=40; G->arcs[5][4]=10; G->arcs[5][7]=30;
G->arcs[5][8]=20;
G->arcs[6][2]=10; G->arcs[6][3]=10; G->arcs[6][7]=30;
G->arcs[6][9]=50;
G->arcs[7][3]=20; G->arcs[7][4]=10; G->arcs[7][5]=30;
G->arcs[7][6]=30; G->arcs[7][8]=20; G->arcs[7][9]=40; G->arcs[7][10]=30;
G->arcs[8][5]=20; G->arcs[8][7]=20; G->arcs[8][10]=20;
G->arcs[9][7]=50; G->arcs[9][8]=40; G->arcs[9][10]=80;
G->arcs[10][7]=30; G->arcs[10][8]=20; G->arcs[10][9]=80;
for(i=1;i<=N;i++)
for(j=1;j<=N;j++)
if(G->arcs[i][j]==0) G->arcs[i][j]=MAX;
}
void path(Matrix_Graph *G,int s,int e)
{
int i,j,u,c=1,t,v;
int r[N+1][N+1];
int T[N],flag[N],d[N];
for(i=0;i<=N;i++)
for(j=0;j<=N;j++) r[i][j]=0;
for(i=1;i<=N;i++)
{
T[i]=-1;
flag[i]=1;
d[i]=MAX;
}
flag[s]=0;
while(c<=N)
{
t=MAX;
for(i=1;i<=N;i++)
if(flag[i]&&G->arcs[s][i]<t)
{
t=G->arcs[s][i];v=i;r[v][1]=v;}
for(i=1;i<=c;i++)
for(j=1;j<=N;j++)
if(flag[j]&&d[i]+G->arcs[T[i]][j]<t)
{
t=d[i]+G->arcs[T[i]][j];v=j;
if(r[v][0]!=-1)
{
u=1;
while(r[T[i]][u]!=0)
{
r[v][u]=r[T[i]][u];u++;}
}
r[v][u]=v;
}
r[v][0]=-1;
T[c]=v;
flag[v]=0;
d[c]=t;
c++;
}
printf("\n最短路径是以下这条:\n(%d)",s);
j=1;
while(r[e][j]!=0)
{
printf("-->(%d)",r[e][j]);j++;}
printf("\n\n");
}
int main()
{
int i,j;
Matrix_Graph G;
creat(&G);
int n = 0;
vexnode g[MAX];
EdgeType e[MAXedg];
adjmax adj;
char choice = 'x';
while(1)
{
clrscr();
printf("\n\n\t\t\t ***校-园-导-游***");
printf("\n\t\t--------------------------------------\n\n");
printf("\t\t\t1. 陶院校园地图:\n\n");
printf("\t\t\t2. 陶院景点信息:\n\n");
printf("\t\t\t3. 查找两点间最短路径:\n\n");
printf("\t\t\t0. 退出\n\n");
printf("\n\t\t--------------------------------------\n\n");
printf("\t\t景德镇陶瓷学院校训:崇德尚学陶冶成器\n");
printf("\n\t\t--------------------------------------\n\n");
printf("\t\t请输入你的选择(0-3): ");
choice = getchar();
switch(choice)
{
case '1':
clrscr();
printf("\t\t -----陶-----院-----地-----图-----\n\n");
printf(" .<2.A系列楼>. \n");
printf(" . . . \n");
printf(" . . .<6.主教楼>. \n");
printf(" . . . . . \n");
printf(" . .<3.B系列楼>. . . \n");
printf(" . . . . . .<9.二食堂> \n");
printf(" . . . . . . . \n");
printf(" . . . . . . . \n");
printf(" . . . . . . . \n");
printf(" <1.校门口>. . . . .<4.翠湖>. . . .<7.图书馆> . . \n");
printf(" . . . . . . \n ");
printf(" . . . . . . \n ");
printf(" . . . . .<10.一食堂> \n ");
printf(" . . . . . \n ");
printf(" . . . . . \n ");
printf(" .<5.体育馆>. . . . <8.田径场>. \n\n");
printf("\t\t输入任意键返回菜单");
getchar();
getchar();
break;
case '2':
clrscr();
travgraph(g,n,adj);
getchar();
break;
case '3':
clrscr();
printf("\t\t -----陶-----院-----地-----图-----\n\n");
printf(" .<2.A系列楼>. \n");
printf(" . . . \n");
printf(" . . .<6.主教楼>. \n");
printf(" . . . . . \n");
printf(" . .<3.B系列楼>. . . \n");
printf(" . . . . . .<9.二食堂> \n");
printf(" . . . . . . . \n");
printf(" . . . . . . . \n");
printf(" . . . . . . . \n");
printf(" <1.校门口>. . . . .<4.翠湖>. . . .<7.图书馆> . . \n");
printf(" . . . . . . \n ");
printf(" . . . . . . \n ");
printf(" . . . . .<10.一食堂> \n ");
printf(" . . . . . \n ");
printf(" . . . . . \n ");
printf(" .<5.体育馆>. . . . <8.田径场>. \n\n");
printf("\2你现在的位置是(请输入1-10):\n");
printf("\t\t\t1.校门口2.A系列楼3.B系列楼4.翠湖 5.体育馆\n");
printf("\t\t\t6.主教楼7.图书馆8.田径场9.二食堂10.一食堂\n");
printf("\t你的输入是:");
scanf("%d",&i);
getchar();
printf("\2你想要去的地方是(请输入1-10):\n");
printf("\t\t\t1.校门口2.A系列楼3.B系列楼4.翠湖 5.体育馆\n");
printf("\t\t\t6.主教楼7.图书馆8.田径场9.二食堂10.一食堂\n");
printf("\t你的输入是:");
scanf("%d",&j);
getchar();
path(&G,i,j);
getchar();
creat(&G);
do{
printf("是否继续查询啊? Y/N");
char ch;
int flag=1;
scanf("%c",&ch);
getchar();
if(ch == 'Y' || ch == 'y')
{
flag = 1;
i = 1;
printf("\2你现在的位置是(请输入1-10):\n");
scanf("%d",&i);
getchar();
printf("\2你想要去的地方是(请输入1-10):\n");
scanf("%d",&j);
getchar();
path(&G,i,j);
getchar();
creat(&G);
continue ;
}
else
flag = 0;
break;
}while(1);
break;
case '0':
clrscr();
printf("\n\t\t--------按任意键退出!--------\n\n");
printf("\n\t\t--------谢谢您的使用!--------\n");
getchar();
exit(0);
break;
default:
printf("\n输入错误,请重新输入0-3之间的数字:\n");
getchar();
break;
}
}
getchar();
}
题目二:建立二叉树,层序、先序遍历
需求:在上交资料中请写明:存储结构、基本算法(可以使用程序流程图)、源程序、测试数据和结果、算法的时间复杂度、另外可以提出算法的改进方法。
分析:。