《数据结构课程设计》
课程题目 | 广东海洋大学导航系统 |
课程编号 | j1620102 |
学生姓名 | 郑群务 |
所在专业 | 信息管理与信息系统 |
所在班级 | 1131班 |
任课老师 | 易学明 |
实习时间 | 2015.01.05—2015.01.11 |
设计成绩 |
|
老师评语 |
|
一. 问题描述
根据学校的平面图,寻找一些重要的场所,画出学校的平面图(场所可以根据其重要性适当减少),根据实际画出不同点间的路径,并估算每两个场所间的路径长。设计数据结构并编程,当给出一个出发点和要到达另外一个场所的信息时,给出最佳路径,并输出路径相关信息。
二. 问题分析
设计一个校园导游程序,为来访的客人提供各种信息查询服务。为来访客人提供图中任意景点相关信息的查询。为来访客人提供图中任意景点相关信息的查询。
三. 逻辑结构和存储结构设计
结构体的定义:
typedefstruct VertexType{
int number;
char *sight;
}VertexType;
typedefstruct{
VertexType vex[NUM];
int arcs[NUM][NUM];
int vexnum;
}MGraph;
常量的定义:
#define Max 32767
#define NUM 1
各个函数的定义:
void CreateMGraph(int v) //创建图的函数,其中v表示图中的顶点数
void Map() //地图展示函数,用于输出广东海洋大学的平面简略图
char Menu() //主菜单显示于操作界面
void Info() //资料介绍函数,用于当用户选择查询地点资料时输出地点的资料信息
void Dijkstra(int num) //迪杰斯特拉函数
void Display(int sight1,int sight2) //地图展示函数
void main() //主函数的定义
四. 算法设计
求最短路径算法流程图 :
五. 时间复杂度和空间复杂度分析
(1) VoidCreateMGraph(int v)
其中为顶点赋值用了一次for循环,为邻接矩阵赋值用了两次for循环且相互嵌套,故时间复杂度为O( + )
(2)voidDijkstra(int num)
其中为置空初始值用了两次for循环且相互嵌套,更新路径长度用了四次for循环且相互嵌套,故其时间复杂度为O( )
(3) VoidDisplay(int sight1,int sight2)
其中输出最短路径用了两次for循环且相互嵌套,故时间复杂度为O( )
六. 源代码
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define Max 32767
#define NUM 15
typedef struct VertexType{
int number;
char *sight;
}VertexType;
typedef struct{
VertexTypevex[NUM];
intarcs[NUM][NUM];
int vexnum;
}MGraph;
MGraph G;
int P[NUM][NUM];
long int D[NUM];//
void CreateMGraph(int v)//创建图的函数
{
int i,j;
G.vexnum=v;
for(i=1;i<G.vexnum;++i)
G.vex[i].number=i;
G.vex[0].sight="各个地点名字";
G.vex[1].sight="广东海洋大学校大门";
G.vex[2].sight="水生博物馆";
G.vex[3].sight="教工饭堂";
G.vex[4].sight="第一饭堂";
G.vex[5].sight="足球场";
G.vex[6].sight="第二饭堂";
G.vex[7].sight="主楼";
G.vex[8].sight="科技楼";
G.vex[9].sight="图书馆";
G.vex[10].sight="钟海楼";
G.vex[11].sight="第三饭堂";
G.vex[12].sight="艺院剧场";
G.vex[13].sight="新实验楼";
G.vex[14].sight="第四饭堂";
for(i=1;i<G.vexnum;++i)
{
for(j=1;j<G.vexnum;++j)
G.arcs[i][j]=Max;
}
G.arcs[1][2]=G.arcs[2][1]=200;
G.arcs[1][4]=G.arcs[4][1]=385;
G.arcs[2][3]=G.arcs[3][2]=150;
G.arcs[3][7]=G.arcs[7][3]=100;
G.arcs[3][10]=G.arcs[10][3]=300;
G.arcs[7][10]=G.arcs[10][7]=65;
G.arcs[7][9]=G.arcs[9][7]=80;
G.arcs[10][13]=G.arcs[13][10]=150;
G.arcs[10][8]=G.arcs[8][10]=110;
G.arcs[8][11]=G.arcs[11][8]=80;
G.arcs[8][11]=G.arcs[11][8]=80;
G.arcs[10][9]=G.arcs[9][10]=180;
G.arcs[9][6]=G.arcs[6][9]=670;
G.arcs[6][5]=G.arcs[5][6]=50;
G.arcs[11][12]=G.arcs[12][11]=200;
G.arcs[12][14]=G.arcs[14][12]=200;
G.arcs[4][5]=G.arcs[5][4]=600;
G.arcs[4][7]=G.arcs[7][4]=80;
G.arcs[4][9]=G.arcs[9][4]=80;
G.arcs[1][12]=G.arcs[12][1]=1300;
}
void Map()//地图展示函数
{
printf("\t ————————广东海洋大学地图导航系统————————— \n");
printf(" \n");
printf(" \n");
printf(" 14 第四饭堂 \n");
printf(" | —— 13 新实验楼 \n");
printf(" | | \n");
printf("12中歌艺术学院——11第三饭堂————— ——8科技楼 \n");
printf(" | | \n");
printf(" | 10钟海楼——————9图书馆——6第二饭堂\n");
printf(" | | | | \n");
printf(" | | | | \n");
printf(" | ————7主楼——— | \n");
printf(" | | | | \n");
printf(" | 3教工饭堂 4第一饭堂—— 5足球场\n");
printf(" | | | \n");
printf(" | 2水生博物馆 | \n");
printf(" | | | \n");
printf(" | | | \n");
printf(" ————————————————— ——— 1校门 ——— \n");
}
void Dijkstra(int num)//迪杰斯特拉算法最短路径
{
int v,w,i,t;
int final[NUM];
int min;
for(v=1;v<NUM;v++)
{
final[v]=0;
D[v]=G.arcs[num][v];
for(w=1;w<NUM;w++)
P[v][w]=0;
if(D[v]<Max)
{
P[v][num]=1;
P[v][v]=1;
}
}
D[num]=0;
final[num]=1;
for(i=1;i<NUM;++i)
{
min=Max;
for(w=1;w<NUM;++w)
if(!final[w])
if(D[w]<min)
{
v=w;
min=D[w];
}
final[v]=1;
for(w=1;w<NUM;++w)
if(!final[w]&&((min+G.arcs[v][w])<D[w]))
{
D[w]=min+G.arcs[v][w];
for(t=0;t<NUM;t++)
P[w][t]=P[v][t];
P[w][w]=1;
}
}
}
char Menu()//主菜单
{
char c;
int flag;
do{
system("cls");
flag=1;
Map();
printf("\t\t欢迎使用广东海洋大学导航图系统\n");
printf("\t\t1.查询地点之间最短路径\n");
printf("\t\te.退出\n");
printf("\t\t\t请输入您的选择:");
scanf("%c",&c);
if(c=='1'||c=='2'||c=='e')
flag=0;
}while(flag);
return c;
}
void Display(int sight1,int sight2)//输出函数
{
int a,b,c,d,q=0;
a=sight2;
if(a!=sight1)
{
printf("\n\t从%s到%s的最短路径是",G.vex[sight1].sight,G.vex[sight2].sight);
printf("\t(最短距离为%dm.)\n\n\t",D[a]);
printf("\t%s",G.vex[sight1].sight);
d=sight1;
for(c=0;c<NUM;++c)
{
P[a][sight1]=0;
for(b=0;b<NUM;b++)
{
if(G.arcs[d][b]<Max&&P[a][b])
{
printf("-->%s",G.vex[b].sight);
q=q+1;
P[a][b]=0;
d=b;
if(q%8==0)printf("\n");
}
}
}
}
}
void main()//主函数
{
int v0,v1;
char e;
char ck;
CreateMGraph(NUM);
do
{
system("cls");
ck=Menu();
switch(ck)
{
case '1':
gate:
system("cls");
Map();
do
{
printf("\n\n\t\t\t请选择出发地序号(1~14):");
scanf("%d",&v0);
if(v0<1||v0>14)
printf("\n\n\t\t\t\t输入错误!\n");
}while(v0<1||v0>14);
do
{
printf("\t\t\t请选择目的地序号(1~14):");
scanf("%d",&v1);
if(v1<1||v1>14||v1==v0)
printf("\n\n\t\t\t\t输入错误!\n");
}while(v1<1||v1>14||v1==v0);
Dijkstra(v0);
Display(v0,v1);
printf("\n\n\t\t\t\t按回车键继续,按e退回首页\n");
getchar();
scanf("%c",&e);
if(e=='e')
break;
gotogate;
};
}while(ck!='e');
}
七. 程序运行结果
八. 心得
数据结构程序设计是基于数据结构的一项实验设计,而作为数据结构这一门课程之言,他并非独立存在,而是对计算机的研究与应用有着巨大的基础性作用,当然越是重要的东西,就更难学了,因此数据结构程序是及其可以考察操作人的掌握基础知识和应用能力。通过这一门实验设计,个人感觉自己还存在很多不足,比如一些基础知识并非掌握牢固,有待提高、巩固。
参考文献:
1.《数据结构》
2.《数据结构学习辅导与实验指导》