-
题号:第七题
题目:校园导航问题
1
,需求分析:
设计你的学校的平面图,至少包括
10
个以上的景点(场所
),每两个景点间可以有不
同的路,且路长也可能不同,找出从任意景点到达另一景点的
最佳路径(最短路径)。
要求:
<
/p>
(
1
)以图中顶点表示校园内各景点,存
放景点名称、代号、简介等信息;以边表示路
径,存放路径长度等有关信息。
(
2
)为来访客人提供
图中任意景点相关信息的查询。
(
3
)
为来访客人提供任意景点的问路查询
,
即查询任意两个景点之间的一条最短路径。
(
4
)修改景点信息。
实现提示:
一般情况下,校园的道路
是双向通行的,可设计校园平面图是一个无向网。顶点和边均
含有相关信息。
选做内容:
(
1
)提供图的编辑功能:增、删景点;增、删道路;修改已有信息等。
(
2
)校园
导游图的仿真界面。
2
,设计:
2.1
设计思想:
<1>
< br>,数据结构设计
:
(
1
)图。采用邻接矩阵存储,其中图所用到的
结构体为:
typedef struct
{
SeqList vertices;
//
表示图中的顶点
int Edge[MaxVertices][MaxVertices];
//
表示图中的边
int numOfEdge;
//
表示图中边的数目
}AdjMGraph;
(
2
)景点。用顺序表存储。所用到的结构体为:
typedef struct
{
char name[20];
//
顶点名称
int
code;
//
顶点代号
char introduction[50];
//
顶点信息简介
}DataType;
1
p>
(
3
)景点之间的连接描述,所用到的结构
体为:
typedef struct
{
int row;
int
col;
int weight;
}RowColWeight; <
/p>
用图来存放所提供的所有景点,
然后用线性表来存放每一个景点的
信息,
其
中包括景点的名称,
代号,信
息简介,以及其它的一些信息。
这样就将对景点的
操作,变成对
图中各顶点的操作
。
<2>
,算法设计:
关于本课题的算法,很大部分来源于这学期数据结构课程的学
习,其中包括:
图的创建,线性表
的一些操作。对于具体的问题实现,都有不同的算法,在下面的分析中,
我将详细说明<
/p>
2.2
设计表示:
<1>,
函数调用关系及函数说明
:
首先,
main()
函数调用
< br>Creat()
函数,用来创建图,
然后调用
menu()
函数来选择用户所要
进行的操作。其
中
menu()
函数就是一个菜单供使用者来选择他所要进行的
相关操作,比如
信息的查询,最短路径查询之类。
main()
Creat()
menu()
对于要
求
1
:以图中顶点表示校园内各景点,存放景点名称、代号、简
介等信
息;以边表示路径,存放路径长度等有关信息。图的创
建设计流程图为:
main()
Creat()
Creat()
函数原型为:
void Creat(AdjMGraph *G
,
DataType v[], RowColWeight E[], int n,int e)
其中,
G
为所创建的图结构体对象,
v[]
为所有顶点的集合,它是
DataType
型,
这个类型前面已经介绍过;
E[]
存放着各顶点之间的连接关系,
它是
R
owColWeight
型,
前面也介绍过;
< br>n
表示顶点的个数;
e
表示边数
。
Creat()
函数的功能就是实
现图的创建,
将已知的景点的一些信息,
转换成图的
信息,并进行存储。
对于要求
2
:为来访客人提供图中任意
景点相关信息的查询。流程图为:
menu()
Information1()
Information()
menu()
函数的原型为:
2
void menu()
他就是一个菜单,供用户选择他们所要进行的操作。
Information1()
函数
原型为:
void
Information1()
它
的功能就是输入查询景点的信息,并调用
Information()
Information()
函数原
型为:
void Information(AdjMGraph
G
, char scenery[])
G
依然是所创建的图的结构
体对象,后面所有的
G
都是表示这个意思;
scenery[]
是在
Information1()
中输入的景点的
名称。此函数的功能
就是根据输入的景点的名称来查询其相关的信息。
对于要求
3
:为来访客人提供任意景点的问路查询,即查询任意两个景点之间的一条
最短路径。流程图为:
Path1()
Path()
Floyd()
menu()
Path1()
函数原型为:
void
Path1()
它的功能就是输入查询景点的名称,并调用
Path()
Path ()
函数原型为:
v
oid
Path(AdjMGraph G
,char
sceneryname[], char sceneryname1[])
其中
sceneryname[],
sceneryname1[]
就是在
Path1()
函数中所输入的景点的名称,
这
个函数的功能就是通过这两个景点的名称找到它们在线性表中的位置,然后
调用
Floyd()
函数,查找出它们的最短路径,并输出所要的信息。
Floyd()
函数原型为:
void
Floyd (int
cost[][ MaxVertices],int n,int
weight[][MaxVertices],int path[][MaxVertices])
其中参数
cost[][ MaxVertices]
即是图中边的邻接存储矩阵,
weight[][MaxVertice
s]
用来存放经
此算法后的各顶点间
的最短路径的值,
path[][MaxVertices]
就
是每两个顶点之间最短路径中
到达目的顶点的前一个顶点的位
置。
Path()
函数中的输出信息就是据此而来。
p>
对于要求
4
:修改景点信息。流程图为:<
/p>
menu()
Modify()
Modify()
函数原型为:
void
Modify()
它不带任何参数,功能是通过手动输入景点名称,然后找到景点的
存储空间,
然后在修改相应的信息。
对于选做要求:增加景点。其工作流程图为:
menu()
AddVertic()
ListInsert()
AddVertic()
函数原型为:
void
AddVertic()
他不带任何参数,该函数的功能是在这个函数里面输入景点的
信
息,然后调用
ListInsert()
函数,将所要增加的顶点信息插入到线性表中。
p>
ListInsert()
函数原型为:
void
ListInsert(SeqList *L, int i, DataType
x)
参数
L
表示顶点存储的线性表,
i
表示
要插
入的位置
,x
表示要插入的景点的信息。
同时我在插入顶点时也将他与其他顶点之间的距
离设置为
Ma
xWeight
,这样做主要是为了方便在
Floyd
函数里面求最短路径
对于选做要求:删除景点。其工作流程图为
menu()
DeleteVertic()
ListDelete ()
3
p>
DeleteVertic()
函数原型为:
void DeleteVertic()
他不带任何参数,
该函数的功能就是在函数体里面输入要删除的景
点的名称,然后根据名称找到该景点在线性表中的存储位置,然后调用线性表中的
ListDelete
()
函数进行相应顶点的删除。
ListDelete
()
函数原型为:
ListDelete(SeqList *L, int i, DataType
*x)
其中参数
L
为存放顶点信息的线性表,
i
表示
要删除顶点在线性表中的存放位置,
,x
就是要删除的那一
个景点。
它的功能就是从线性表中
删除指定的顶点。
对于选做要求:增、删道路,流程图为:
menu()
AddRoad()
InsertEdge ()
DeleteRoad()
DeleteEdge ()
AddRoad()
和
DeleteRoad()
两函数原型为:
void
AddRoad()
和
void DeleteRoad()<
/p>
。这两个函数都不带参数,它们的功能就是在这两
个函数里面输入
要删除要增加或者的边连接的两个景点的名称,
然后在线性表中找到这两个
景点的相对存储空间,最后调用
InsertEdge
()
或者
DeleteEdge
()
函数。
InsertEdge
()
和
DeleteEdge
()
两函数原型为:
void
InsertEdge(AdjMGraph *G
, int v1, int
v2, int weight)
void
DeleteEdge(AdjMGraph
*G
,
int
v1,
int
v2)
这两个函数中同名参数所代表的意义
是相同的,其中
v1, v2
是所输入景点在线性表中的相对位
置;
weight
就是增加的边的权值
<2>
函数接口说明
我所设计整个程序就是一些子函数
的集合,每个功能都对应一个或者几个子函数,
他们之间可以没有任何限制,只要能保证
程序正确运行就可以调用,特别是
AdjMGraph.h
, AdjMGraph.h
和
Seq
List.h
头文件之中的函数,他们被很多函数调用过。这其中都没有任何
特殊类型的函数
2.3
详细设计:
根据题目分析,对于信息查询与修改功能,设计如下:
1
,输入景点名称
2
,从线性表头扫描到表尾,
if(
找到该景点
)
输出景点结构体信息
else
输出提示信息找不到该顶点
实现查找最短路径,设计如下:
1
,
景点名称
2
,根据输入的信息找到它们所在的线性表中的位置
3
,调用
Floyd
算法找出最短路径
4
,输出信息
实现增删景点功能,设计如下:
1
,增加或者删除景点的名称
2
,
if(
输入景点
)
,将景点信息保存在相应的结构体中,并插入到线性表尾;<
/p>
if(
删
除景点
)
,找到景点在线性表中所在的位置,
< br>然后将景点信息从线性表中删除
实现增删道路功能,设计如下:
1
,入增加或删除道路连接的两个景
点的名称;
4
2
,找到它们的相对位置;
3
,
p>
if(
删除道路
)
,将连接它们的边置为
MaxWeight
;
< br>
if(
增加道路
)
,将输入的边值赋给相应的邻接矩阵表;
3
,调试分析:
<1>
,调试过程中遇到的问题与解决方案:
1,
关于最短路径的输出问题。在进行最短路
径输出时,我刚开始时只能正序输出,
具体的描述为:
比如,我
要查寻从东区到东湖的最短路径,那么它能正确输出结果,他的形
式为:
东区
——
>
主楼
——
>
西体育馆
——
>
隧道
——
>
北大门
——
>
东湖。
但是,
当我逆
向输出时,
得到的结果却
有点问题,
经过分析调试后,找到了错误的所在。
在找最短路径
的
时候我用的是
Floyd
算法,在这
个算法中有三重循环,形式均为:
<
br>, <
br>if(weight[i][j]>weight[i][k]+weight[k][j])
for(k=0;k
它们
都是从零开始的,
所以在
顺序输出时没问题,
但是逆序的时候就需要进行一个判断,
正序
与
逆序循环输出是相反的。
2
,关于新增加景点后再找最短路径问题。比如我再新增一个景点,如北区食堂,并
输入相关信息,
然后插入到线性表尾,
当我再找从东
区到东湖的最短距离时,
输出的最短路
径将变为:东区
——
>
食堂
——
>
东湖。经过分析调试后,其原因
也是出在
Floyd
算法那,
在
Floyd
算法中,有这么一个判断
if(weight[i][j]>weight[i][k]+weight[k][j])
,
由于
我在输入新景点信息时并没有建
立它与其它景点之间的连接信息,
所以在图中,
该新景点与
p>
其它景点之间的边得连接信息是空的,
也就是说在邻接矩阵中,
p>
它的边得信息是空的,
那么
在
进
行
判
断
时
weight[
新
增
景
点
序
号
][
其它景点序号
]
的值将是一个很大的负数,所以
最短路径将会出错。解决这个问题的方
法就是在增加新景点时就将它与其它景点之间的边
(距离)设置为
MaxWeight
,这时如果再
用
Floyd
函数进行最短路径的求解时就不会再出
现问题了。
另外,
在做这个题时也还
出现过一些其他的小问题,
不过都比较容易解决,
这里我就
p>
不再列出了??
<2>,
算法的时空复杂度分析
p>
对应题目的要求,我总共提供了八个选项操作对于每一个操作的分析如下:
< br>
1
,相关信息的查询。在这个操作中允许使用
者输入一个景点名称,然后再根据景点名
称来或取其相关的信息,
这个操作要扫描线性表,
其时间复杂度为
o(n)
,
空间复杂度为
o(n)
;
2
,最短路径查询。实现这个功能
用到了
Floyd
算法,他用到了一个三重的
< br>for()
循环,
故其时间复杂度为
o(n^3)
,空间复杂度为
o(1)
;
3
,修改景点信息。要修改信
息,必须首先找到景点所在的存储位置,那么就需要扫描
线性表,其时间复杂度为
o(n)
,空间复杂度为
o(1)
;
4
,增加景点。增加
景点信息时,直接将此景点结构体信息插入到线性表表尾,而不需
要进行遍历,其时间复
杂度与空间复杂度均为
o(1)
;
p>
5
,
删除景点。
删
除景点时必须找到所要删除景点所在的位置,
这样就必须遍历线性表,
< br>除此之外,删除后线性表还要进行移动操作,其时间复杂度为
o(n)
,空间复杂度为
o(n1)
;
6
,增加道路。增加道路也要扫描线性表,找到要增加路的两景
点的存储位置,然后再
根据找到的存储位置去改变邻接矩阵的边的值,改变邻接矩阵的时
间复杂度为
o(1),
其总时
间消耗在
线性表的扫描上,故最终其时间复杂度为
o(n)
,空间复杂度
为
o(1)
;
7
,删除道路。删除道路和增加道路类似,
都是先找到存储位
置,然后再改变邻接矩阵,
它的时空复杂度分别为
o(n)
,
o(1)
;
5
8<
/p>
,浏览所有景点。浏览所有景点的实质就是从头到尾遍历线性表,然后输出遍历到的
节点的信息,其时间复杂度为
o(n)
,空间
复杂度为
o(1)
。
4
,用户手册:
使用说明:当用户将程序经过编译,连接后,点击运行,在
DOS
< br>环境里面将看到一个
选项菜单,菜单里面提供了
8
种操作,同时输出了一行提示信息:请选择您想进行的操作。
然后用户
可以输入一个
1
——
8
之间的数字进行选择性的操作,例如,您想进行信息的查询
操作,
您可以从键盘输入数字
‘
1
’
;
当然,
一般而言先应该进行
“浏览所有景点名称”
操作。
如果您选择了浏
览所有景点名称操作,在屏幕上将会显示出
10
个景点的名称,
这些景点是
事先加进去的,用户可以对这些景点进行任何程序所提供的操作。
下面,我将详细介绍本程序的使用方法:在浏览景点后,菜单将会继续显
示出来,为
您提供操作选择。
p>
如果
您想进行“相关信息的查询”操作,输入数字‘
1
’
,然后程序将会提醒您输入查
询景点的名称,在您输入景点名称后回车即可。
如果
您想进行“最短路径查询”操作
,首先输入数字‘
2
’
,然后程序将会
提醒您输入
查询的景点的名称,
您输入按要求输入所提供的两个
景点名称即可,
要注意的是景点名称间
以空格隔开,最后程序就
会告诉您最短的路径,以及最短路的长度。
如果
您想修改景点的信息,同样先输
入数字‘
3
’
,然后程序就会提醒您输
入所要修改
景点的名称,
您可以根据要求输入一个景点的名称,
然后回车,
之后屏幕上就会显示您所输
入的景点的所有信息,同时会有三个修改选项供用户选择,然后您可以输入
1
——
3
之间的
一个数字进
行选择性的修改。比如,您可以输入‘
1
’对景点名称进行修改
,修改完后又会
返回到菜单项继续选择。
如果
您想
进行“增加景点”操作,可以输入数字‘
4
’
< br>,然后程序就会提示您输入新增
加的景点的名称,代号,信息简介,各种输入之间
以空格隔开。当输入完毕后回车,景点也
就成功加入了,
然后用
户可以再次选择第八项操作浏览所有景点名称,
检测新输入的景点是
否已经成功添加。
如果
您想进行
“删除景点”操作,可以输入数字‘
5
’
,回车后系统将会提示您输入要
删除的景点的名称,
您可以输
入您想要删除的景点的名称,
然后回车,
这样删除景点的操作<
/p>
就已经完成,您同样可以选择第八项操作,检测是否成功删除了景点。
如果
您想进行“增加道路”操
作,您可以输入数字‘
6
’
,然后回车
,系统将会提示您
输入增加道路所连接的两个景点的名称,
输入
两景点名称后回车,
然后系统又会提示输入增
加道路的长度,<
/p>
输入后回车,
这时增加道路操作也就完了。
用户如果想要检查道路是否增加
成功可以进行“最短路径查询”操作。
如果
您想进行“删除道路”操作,您可以输入数字‘
7
’
,然后系统就会提示您输入删
p>
除道路所连接的两景点的名称,
输入名称后回车即可,
当然,
如果您想检测删除是否成功您
可以选择“最短
路径查询”操作。
备注:经过测试,本程序的所有操作都能正
常执行,您可以选择性的对他进行操作,
同时也可以混合着操作,混合操作是检测错误的
最好的一个方法。
6
5
,测试数据及测试结果:
菜单显示为:
***
*************
菜单
*************
*********
1,
相关信息查询
2,
最短路径查询
3,
修改景点信息
4,
增加景点
5,
删除景点
6,
增加道路
7,
删除道路
8,
浏览所有景点名称
p>
*****************************************
**
请选择您想进行的操作:
8
东区
博物馆
主楼
图书馆
西体育馆
隧道
北综
北大门
东湖
请选择您想进行的操作:
1
请输入您所想要查询的景点的名称:
博物馆
您输入的景点的名称是:
博物馆
您输入的景点的代码为:
11
您输入的景点的相关信息有:
有各种化石
请选择您想进行的操作:
2
请输入你要查询的两景点的名称:
东区
东湖
最短路径为:
108
从
东区
点到
东湖
景点的最短路径为:
东区——
>
主楼——
>
西体育
馆——
>
隧道——
>
< br>北大门——
>
东湖
请选择您想进行的操作:
3
您想修改的景点的名称为:
隧道
您输入的景点的名称是:
隧道
您输入的景点的代码为:
15
您输入的景点的相关信息有:
自主修建
您想修改什么信息?
1
,名称;
2
,代号;
3
p>
,信息简介
:
1
请输入要修改的的景点的新名称:
地大隧道
请选择您想进行的操作:
8
东区
博物馆
主楼
图书馆
西体育馆
地大隧道
体育馆
北大门
东湖
请选择您想进行的操作:
4
北体育馆
北综
北
7
请输入增加节点的
名称,代号,信息简介
:
北一楼
34
教师办公室
请选择您想进行的操作:
1
请输入您所想要查询的景点的名称:
北一楼
您输入的景点的名称是:
北一楼
您输入的景点的代码为:
34
您输入的景点的相关信息有:
教师办公室
请选择您想进行的操作:
5
请输入您要删除景点的名称:
北一楼
请选择您想进行的操作:
8
东区
博物馆
主楼
图书馆
西体育馆
地大隧道
体育馆
北大门
东湖
请选择您想进行的操作:
6
输入您要增加的道路链接的两个景点名称:
东区
北综
输入您要增加的道路的长度
:
50
请选择您想进行的操作:
2
请输入你要查询的两景点的名称:
东区
北综
最短路径为:
50
从
东区
点到
北综
景点的最短路径为:
东区
——
>
北综
请选择您想进行的操作:
7
输入您要删除的道路链接的两个景点名称:
东区
北综
请选择您想进行的操作:
2
请输入你要查询的两景点的名称:
东区
北综
最短路径为:
103
从
东区
点到
北综
景点的最短路径为:
东区——
>
主楼——
>
西体育
馆——
>
地大隧道——
>
北大门——
>
北综
北综
北
8
-
-
-
-
-
-
-
-
-
上一篇:疫情面前教育的责任和担当依然在心中
下一篇:3dmax修改器详解