全国交通资讯模拟数据结构课程设计报告.docx

上传人:b****3 文档编号:27460198 上传时间:2023-07-01 格式:DOCX 页数:42 大小:233.82KB
下载 相关 举报
全国交通资讯模拟数据结构课程设计报告.docx_第1页
第1页 / 共42页
全国交通资讯模拟数据结构课程设计报告.docx_第2页
第2页 / 共42页
全国交通资讯模拟数据结构课程设计报告.docx_第3页
第3页 / 共42页
全国交通资讯模拟数据结构课程设计报告.docx_第4页
第4页 / 共42页
全国交通资讯模拟数据结构课程设计报告.docx_第5页
第5页 / 共42页
点击查看更多>>
下载资源
资源描述

全国交通资讯模拟数据结构课程设计报告.docx

《全国交通资讯模拟数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《全国交通资讯模拟数据结构课程设计报告.docx(42页珍藏版)》请在冰豆网上搜索。

全国交通资讯模拟数据结构课程设计报告.docx

全国交通资讯模拟数据结构课程设计报告

全国交通咨询模拟系统的设计与实现

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<<"****************------------------

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 工程科技 > 交通运输

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1