全国交通资讯模拟数据结构课程设计报告.docx
《全国交通资讯模拟数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《全国交通资讯模拟数据结构课程设计报告.docx(42页珍藏版)》请在冰豆网上搜索。
全国交通资讯模拟数据结构课程设计报告
全国交通咨询模拟系统的设计与实现
1.问题描述
出于不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
2.需求分析
(1)提供对城市信息进行编辑(如:
添加或删除)的功能。
(2)城市之间有两种交通工具:
火车和飞机。
(3)提供两种最优决策:
最快到达或最省钱到达。
全程只考虑一种交通工具。
(4)旅途中耗费的总时间应该包括中转站的等候时间。
(5)咨询以用户和计算机的对话方式进行。
由用户输入起始站、终点站、最优决策原则和交通工具,输出信息:
最快需要多长时间才能到达或者最少需要多少旅费才能到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
3.概要设计
因为全国交通咨询模拟中有众多城市之间的连接关系,为实现全国交通咨询系统的开发,采用图类型与邻接表类型来存储城市之间的信息。
下面给出他们的ADT的定义。
3.1抽象数据类型定义如下:
typedefstructunDiGraph
{
intnumVerts;//结点
costAdjcost;//邻接矩阵
}unDiGraph,*UNG;
基本操作:
unDiGraph*CreateCostG()
操作结果:
构造带权(费用)图。
unDiGraph*CreateTimeG()
操作结果:
构造带权(时间)图。
构造飞机带权(费用)图。
PathMat*Floyed(unDiGraph*D)
操作结果:
Floyed函数求任意两点的最短路径。
3.2系统功能模块设计
全国交通咨询模拟系统由4个功能模块组成:
添加城市、删除程序、采用火车出行、采用飞机出行
下面给出功能模块图,如图3-1所示。
图3-1全国交通咨询模拟功能模块图
3.3主要函数调用关系图
(给出ADT内基本操作的那些函数之间的函数调用关系图)
如图3-2所示。
图3-2系统函数调用关系图
3.4主界面设计
为了实现全国交通咨询模拟系统,需要设计一个含有多菜单项的主控菜单子程序,以链接系统中各个子项目的调用,为了方便用户使用本系统,本系统主控菜单的运行界面如图3-3所示。
4.详细设计
实现全国交通咨询模拟系统的开发,采用图结构类型存储城市的信息。
其中,各城市间的邻接关系用图的邻接矩阵类型存储;城市信息用结构体数组存储,其中每个数组元素是一个结构体变量,包含时间和费用三个分量;图的顶点的个数和边的个数由变量费用、时间大小表示,它们是整型数据。
4.1数据类型定义
数据存储:
有向图、邻接表
函数调用:
#include
#include
#include
#include
#include
#include//引用的文本件
#defineINF65535//定义一个最大数定为无穷值
#defineMAX13
typedefintcostAdj[MAX+1][MAX+1];//图邻接矩阵从1开始记数
intPath[MAX+1][MAX+1];//图邻接矩阵从1开始记数
into[13],h;
typedefstructunDiGraph
{
intnumVerts;//结点
costAdjcost;//邻接矩阵
}unDiGraph,*UNG;//图的定义
costAdjB,L;
voidpr(inti)//选择城市
voidpri()//输出城市
unDiGraph*CreateCostG()//构造带权(费用)图返回首地址G:
unDiGraph*CreateTimeG()//构造带权(时间)图返回首地址G:
unDiGraph*CreateFlyG()//飞机的相关信息
voidFloyed(unDiGraph*D,unDiGraph*M)//Floyed函数求任意两点的最短路径:
:
voidprn_pass(inti,intj)//为了求从i到j的最短路径,只需要调用如下的过程
voidtime()//求最少时间路径。
。
voidmoney()//求最少花费路径
voidadministrator()//管理员功能
voidmain()//main函数
4.2系统子程序详细设计
4.2.1求最小路径
VoidShortPath_DIJ(AMGraphG,intv0,PathMatrix&P,ShortpathTable&D)
{
For(v=0;v{
Final[v]=FALSE;
D[v]=G.arce[v0][v];
For(w=0;w{
P[v][w]=FALSE;
}
If(D[v]{//如果有直接互通的两个顶点,直接将这个路径赋值到数组P[V].
P[v][v0]=TRUE;
P[v][v]=TRUE;
}
}
D[v0]=0;final[v]=TRUE;
//*下面开始主循环,每次求得v0到某个v顶点的最短路径,同时刷新之前的最短路径。
*/
{
//对于除了v0之外的顶点(这个循环仅仅限制次数,i的值不用。
Min=INFINITY;//假定初始的”最小值”为无穷大。
For(w=0;w{
If(!
final[w])//w定点在V-S中,及还未确定的顶点。
If(D[w]{
v=w;
min=D[w];//随着循环进行,依与v0的距离大小,从小到达取的顶点v,并标记进final。
}
}
Final[v]=TRUE;//标记已经找到
For(w=0;w{
//更新路径
If(!
final[w]&&(min+G.arcs[v][w]))
{
D[w]=min+G.arcs[v][w];
P[w]=P[w];//把一行都给赋值
P[w][w]=TRUE;
}
}
}
}
4.2.2利用邻接表输出结果
//邻接表中表对应的链表的特点。
TypedefstructENode
{
Intivex;//该边所指向的顶点的位置。
StructENode*next_edge;//指向下一条弧的指针。
}ENode,*PENode;
//邻接表中表的顶点
TypedefstructVNode
{
Chardata;//顶点信息
ENode*first_edge;//指向第一条依附该顶点的弧
}VNode;
//邻接表
TypedefstructLGraph
{
Intvexnum;//图的顶点数目
Intedgnum;//图的边的数目
VNodevexs[max];
}LGraph
5.编码实现
详见:
源程序清单。
6.系统测试
本程序在DOS操作系统下运行
(1查看城市
(2选择最短时间路线的两种方式
(3选择以火车的方式出行
(4坐火车从石家庄到上海的最短时间路线与所花费的金额
(5从成都到天津的最少花费与时间
(6管理员成语
(7增添新城市沧州
(8增添石家庄到沧州的火车费用
(9增添石家庄到沧州的火车时间
(10坐火车从石家庄到沧州的最短时间
(11采用飞机从北京到石家庄
7.结果分析
1.构造带权图CreateFlyGCreateCostG和CreateTimeG:
T(MAX)=O((MAX)2)
2.Floyed函数Floyed:
T(n)=O(n2+n3)
3.显示路径函数prn_pass:
T(n)=O(n)
4.本程序的空间复杂度均为S(n)=(n2);即存放n2个节点数据辅助空间。
8.学习体会
通过此次课程设计大大加深了我对数据结构这门课程的理解,而且尤其对图这章的理解,可以说有一个大的进步。
学习能力也大大提高。
当然通过此次课设也为我以后的道路奠定了一定的基础,认识到了基础的重要。
实现全国交通咨询模拟系统的开发,采用图结构类型存储城市的信息。
其中,各城市间的邻接关系用图的邻接矩阵类型存储;城市信息用结构体数组存储,其中每个数组元素是一个结构体变量,包含时间和费用三个分量;图的顶点的个数和边的个数由变量费用、时间大小表示,它们是整型数据。
让我对计算机有了更深的认识,对他产生了更加浓厚的兴趣。
9.源程序清单
#include
#include
#include
#include
#include
#include
#defineINF65535//定义一个最大数定为无穷值
#defineMAX23
staticintc_number=13;
staticintk=0;
staticintv=0,z=0,r=0,t=0;
typedefstructjl
{
intc_cost;
intc_time;
intf_cost;
intf_time;
}jl;
jlm[20],x[20],n[20];
typedefintcostAdj[MAX+1][MAX+1];//图邻接矩阵从1开始记数
intPath[MAX+1][MAX+1];//图邻接矩阵从1开始记数
typedefstructunDiGraph
{
intnumVerts;//结点
costAdjcost;//邻接矩阵
}unDiGraph,*UNG;//图的定义
typedefstructc_edit
{
chara[10];
}c_edit;
c_editadd[10];
costAdjB,L;
intpr(inti,intj)
{
inth=0;
if(j==0){
h=i;
}
elseif(j==1)
{
cin>>add[i].a;
}
switch(h)//运用switch语句。
{
case(0):
cout<<"";
break;
case
(1):
cout<<"成都";
break;
case
(2):
cout<<"兰州";
break;
case(3):
cout<<"石家庄";
break;
case(4):
cout<<"郑州";
break;
case(5):
cout<<"武汉";
break;
case(6):
cout<<"贵阳";
break;
case(7):
cout<<"长沙";
break;
case(8):
cout<<"广州";
break;
case(9):
cout<<"南宁";
break;
case(10):
cout<<"济南";
break;
case(11):
cout<<"北京";
break;
case(12):
cout<<"天津";
break;
case(13):
cout<<"上海";
break;
default:
cout<}
return1;
}
//输出城市列表及相应代码
voidpri()
{
inti;
cout<<"城市及其代码"<cout<<"*********************************************************"<for(i=1;i<=c_number;i++)
{
cout<
pr(i,0);
}
cout<}
//构造带权(费用)图返回首地址G:
unDiGraph*CreateCostG(into)//火车的花费的存贮和编辑功能
{
unDiGraph*G;
inti,j;
inta=0,b=0,f,h=1;
if(!
(G=(unDiGraph*)malloc(sizeof(unDiGraph))))//为G分配存储空间。
{
return(NULL);
}
for(i=1;i{
for(j=1;j{
G->cost[i][j]=INF;//初始化使G->cost[i][j]为无穷。
}
}
G->numVerts=c_number;
G->cost[1][6]=G->cost[6][1]=96;
G->cost[1][2]=G->cost[2][1]=84;
G->cost[2][3]=G->cost[3][2]=51;
G->cost[3][4]=G->cost[4][3]=53;
G->cost[4][5]=G->cost[5][4]=40;
G->cost[5][6]=G->cost[6][5]=90;
G->cost[5][8]=G->cost[8][5]=67;
G->cost[5][7]=G->cost[7][5]=67;
G->cost[6][7]=G->cost[7][6]=60;
G->cost[7][9]=G->cost[9][7]=25;
G->cost[3][11]=G->cost[11][3]=69;
G->cost[11][12]=G->cost[12][11]=13;
G->cost[12][10]=G->cost[10][12]=67;
G->cost[3][10]=G->cost[10][3]=34;
G->cost[13][10]=G->cost[10][13]=65;
G->cost[13][5]=G->cost[5][13]=118;
if(o){
while(h==1)
{
v=v+1;
pri();
cout<<"火车花费查询"<cout<<"请输入开始城市的数字代码"<cin>>a;
cout<<"请输入结尾城市的数字代码"<cin>>b;
cout<<"请输入你预算的两地花费金额"<cin>>m[v].c_cost;
n[v].c_cost=a;
x[v].c_cost=b;
cout<<"请选择"<cout<<"****************---------------------********************"<cout<<"1:
继续更改城市费用"<cout<<"0:
返回上一级菜单"<cout<<"****************---------------------********************"<cin>>h;
switch(h){
case1:
h=1;
break;
case0:
h=0;
break;
default:
{
cout<<"选择出错"<}
}
}
}
f=v+1;
while(v--){
G->cost[n[v].c_cost][x[v].c_cost]=m[v].c_cost;
}
v=f;
return(G);
}
//构造带权(时间)图返回首地址G:
unDiGraph*CreateTimeG(into)//火车的时间的存贮和编辑功能
{
unDiGraph*G;
inti,j;
inta=0,b=0,f,h=1;
if(!
(G=(unDiGraph*)malloc(sizeof(unDiGraph))))//为G分配存储空间。
{
return(NULL);
}
for(i=1;i{
for(j=1;j{
G->cost[i][j]=INF;//初始化使G->cost[i][j]为无穷。
}
}
G->numVerts=c_number;
G->cost[1][6]=G->cost[6][1]=9;
G->cost[1][2]=G->cost[2][1]=8;
G->cost[2][3]=G->cost[3][2]=5;
G->cost[3][4]=G->cost[4][3]=5;
G->cost[4][5]=G->cost[5][4]=4;
G->cost[5][6]=G->cost[6][5]=9;
G->cost[5][7]=G->cost[7][5]=6;
G->cost[5][8]=G->cost[8][5]=6;
G->cost[6][7]=G->cost[7][6]=6;
G->cost[7][9]=G->cost[9][7]=2;
G->cost[3][11]=G->cost[11][3]=6;
G->cost[11][12]=G->cost[12][11]=1;
G->cost[12][10]=G->cost[10][12]=6;
G->cost[3][10]=G->cost[10][3]=3;
G->cost[13][10]=G->cost[10][13]=6;
G->cost[13][5]=G->cost[5][13]=11;
if(o){
while(h==1)
{
z=z+1;
pri();
cout<<"火车时间预算编辑"<cout<<"请输入开始城市的数字代码"<cin>>a;
cout<<"请输入结尾城市的数字代码"<cin>>b;
cout<<"请输入你的两地时间"<cin>>m[z].c_time;
n[z].c_time=a;
x[z].c_time=b;
cout<<"请选择"<cout<<"****************---------------------********************"<cout<<"1:
继续更改城市时间"<cout<<"0:
返回上一级菜单"<cout<<"****************---------------------********************"<cin>>h;
switch(h){
case1:
h=1;
break;
case0:
h=0;
break;
default:
{
cout<<"选择出现BUG!
!
!
"<}
}
}
}
f=z+1;
while(z--){
G->cost[n[z].c_time][x[z].c_time]=m[z].c_time;
}
z=f;
return(G);
}
unDiGraph*CreateTimeF(into)//飞机的时间的存贮和编辑功能
{
unDiGraph*G;
inti,j;
inta=0,b=0,f,h=1;
if(!
(G=(unDiGraph*)malloc(sizeof(unDiGraph))))//为G分配存储空间。
{
return(NULL);
}
for(i=1;i{
for(j=1;j{
G->cost[i][j]=INF;//初始化使G->cost[i][j]为无穷。
}
}
G->numVerts=c_number;
G->cost[1][6]=G->cost[6][1]=3;
G->cost[1][2]=G->cost[2][1]=2;
G->cost[2][3]=G->cost[3][2]=1;
G->cost[3][4]=G->cost[4][3]=2;
G->cost[4][5]=G->cost[5][4]=4;
G->cost[5][6]=G->cost[6][5]=3;
G->cost[5][7]=G->cost[7][5]=6;
G->cost[5][8]=G->cost[8][5]=6;
G->cost[6][7]=G->cost[7][6]=6;
G->cost[7][9]=G->cost[9][7]=2;
G->cost[3][11]=G->cost[11][3]=6;
G->cost[11][12]=G->cost[12][11]=1;
G->cost[12][10]=G->cost[10][12]=2;
G->cost[3][10]=G->cost[10][3]=3;
G->cost[13][10]=G->cost[10][13]=6;
G->cost[13][5]=G->cost[5][13]=1;
if(o){
while(h==1)
{
t=t+1;
pri();
cout<<"飞机时间编辑"<cout<<"请输入开始城市的数字代码"<cin>>a;
cout<<"请输入结尾城市的数字代码"<cin>>b;
cout<<"请输入你的两地时间"<cin>>m[t].f_time;
n[t].f_time=a;
x[t].f_time=b;
cout<<"请选择"<cout<<"****************------------------