数据结构课程设计
2015-01-11 21:05
323 查看
一. 问题描述
根据学校的平面图,寻找一些重要的场所,画出学校的平面图(场所可以根据其重要性适当减少),根据实际画出不同点间的路径,并估算每两个场所间的路径长。设计数据结构并编程,当给出一个出发点和要到达另外一个场所的信息时,给出最佳路径,并输出路径相关信息。
二. 问题分析
设计一个校园导游程序,为来访的客人提供各种信息查询服务。为来访客人提供图中任意景点相关信息的查询。为来访客人提供图中任意景点相关信息的查询。
三. 逻辑结构和存储结构设计
结构体的定义:
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>
#defineMax 32767
#defineNUM 15
typedefstruct VertexType{
int number;
char *sight;
}VertexType;
typedefstruct{
VertexType vex[NUM];
int arcs[NUM][NUM];
int vexnum;
}MGraph;
MGraphG;
intP[NUM][NUM];
longint D[NUM];//
voidCreateMGraph(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;
}
voidMap()//地图展示函数
{
printf("\t ————————广东海洋大学地图导航系统————————— \n");
printf("
4000
\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");
}
voidDijkstra(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;
}
}
}
charMenu()//主菜单
{
char c;
int flag;
do{
system("cls");
flag=1;
Map();
printf("\t\t欢迎使用广东海洋大学导航图系统\n");
printf("\t\t 1.查询地点之间最短路径\n");
printf("\t\t 2.广东海洋大学景点介绍\n");
printf("\t\t e.退出 \n");
printf("\t\t\t请输入您的选择:");
scanf("%c",&c);
if(c=='1'||c=='2'||c=='e')
flag=0;
}while(flag);
return c;
}
voidInfo()//资料介绍函数
{
printf("1 广东海洋大学校大门:这里有学校的建筑,有一个有特色的蝴蝶湖\n");
printf("2 水生博物馆: \n");
printf("3 教工饭堂: \n");
printf("4 第一饭堂:\n");
printf("5 足球场:\n");
printf("6 第二饭堂:\n");
printf("7 主楼:\n");
printf("8 科技楼: \n");
printf("9 图书馆: \n");
printf("10 钟海楼: \n");
printf("11 第三饭堂: \n");
printf("12 中歌艺术学院: \n");
printf("13 新实验楼: \n");
printf("14 第四饭堂: \n");
}
voidDisplay(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");
}
}
}
}
}
voidmain()//主函数
{
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;
goto gate;
case'2':
system("cls");
Info();
printf("\n\n\t\t\t\t按回车键返回首页...\n");
getchar();
getchar();
break;
};
}while(ck!='e');
}
七. 程序运行结果
八. 心得
经过本次的课程设计,巩固了在数据结构的课程知识,加深了对知识的了解,在做地图系统的过程中,运用了图的数据结构,这是自己以前的薄弱之处。在做本设计的过程中,发现自己仍然在语言方面存在很大的欠缺,在本寒假的过程中我将会复习以往学过的C++语言。
参考文献:
1.《数据结构》
2.《数据结构学习辅导与实验指导》
![](https://img-blog.csdn.net/20150111210543617?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Vhbjg3NDI4ODc1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20150111210543718?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Vhbjg3NDI4ODc1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
![](https://img-blog.csdn.net/20150111210621494?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZ3Vhbjg3NDI4ODc1Mg==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
根据学校的平面图,寻找一些重要的场所,画出学校的平面图(场所可以根据其重要性适当减少),根据实际画出不同点间的路径,并估算每两个场所间的路径长。设计数据结构并编程,当给出一个出发点和要到达另外一个场所的信息时,给出最佳路径,并输出路径相关信息。
二. 问题分析
设计一个校园导游程序,为来访的客人提供各种信息查询服务。为来访客人提供图中任意景点相关信息的查询。为来访客人提供图中任意景点相关信息的查询。
三. 逻辑结构和存储结构设计
结构体的定义:
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>
#defineMax 32767
#defineNUM 15
typedefstruct VertexType{
int number;
char *sight;
}VertexType;
typedefstruct{
VertexType vex[NUM];
int arcs[NUM][NUM];
int vexnum;
}MGraph;
MGraphG;
intP[NUM][NUM];
longint D[NUM];//
voidCreateMGraph(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;
}
voidMap()//地图展示函数
{
printf("\t ————————广东海洋大学地图导航系统————————— \n");
printf("
4000
\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");
}
voidDijkstra(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;
}
}
}
charMenu()//主菜单
{
char c;
int flag;
do{
system("cls");
flag=1;
Map();
printf("\t\t欢迎使用广东海洋大学导航图系统\n");
printf("\t\t 1.查询地点之间最短路径\n");
printf("\t\t 2.广东海洋大学景点介绍\n");
printf("\t\t e.退出 \n");
printf("\t\t\t请输入您的选择:");
scanf("%c",&c);
if(c=='1'||c=='2'||c=='e')
flag=0;
}while(flag);
return c;
}
voidInfo()//资料介绍函数
{
printf("1 广东海洋大学校大门:这里有学校的建筑,有一个有特色的蝴蝶湖\n");
printf("2 水生博物馆: \n");
printf("3 教工饭堂: \n");
printf("4 第一饭堂:\n");
printf("5 足球场:\n");
printf("6 第二饭堂:\n");
printf("7 主楼:\n");
printf("8 科技楼: \n");
printf("9 图书馆: \n");
printf("10 钟海楼: \n");
printf("11 第三饭堂: \n");
printf("12 中歌艺术学院: \n");
printf("13 新实验楼: \n");
printf("14 第四饭堂: \n");
}
voidDisplay(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");
}
}
}
}
}
voidmain()//主函数
{
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;
goto gate;
case'2':
system("cls");
Info();
printf("\n\n\t\t\t\t按回车键返回首页...\n");
getchar();
getchar();
break;
};
}while(ck!='e');
}
七. 程序运行结果
八. 心得
经过本次的课程设计,巩固了在数据结构的课程知识,加深了对知识的了解,在做地图系统的过程中,运用了图的数据结构,这是自己以前的薄弱之处。在做本设计的过程中,发现自己仍然在语言方面存在很大的欠缺,在本寒假的过程中我将会复习以往学过的C++语言。
参考文献:
1.《数据结构》
2.《数据结构学习辅导与实验指导》
相关文章推荐
- 四则运算实现(c 语言 数据结构课程设计题)
- 浅说代码风格 - 数据结构课程设计
- 数据结构课程设计---最长公共子串
- 数据结构课程设计---学生信息管理系统
- 数据结构课程设计(C++语言)
- 数组应用[数据结构课程设计]
- 数据结构课程设计---最长公共子串
- 重言式判别 (数据结构课程设计)
- 数据结构课程设计:括号匹配问题(实现检验匹配并输出不匹配的位置)
- 数据结构课程设计
- 数据结构课程设计题目
- 数据结构课程设计-校园导游系统-带注释
- 数据结构课程设计---学生信息管理系统
- 校园导航-_数据结构课程设计
- 数据结构课程设计(2)
- 数据结构课程设计-----用C#实现双向链表
- 数据结构课程设计--航空客运订票系统
- 数据结构课程设计---教学任务安排系统
- 个人帐簿管理系统设计[数据结构课程设计]
- 数据结构课程设计----基数排序