全国交通资讯模拟数据结构课程设计报告.docx
- 文档编号:3357078
- 上传时间:2022-11-22
- 格式:DOCX
- 页数:36
- 大小:233.79KB
全国交通资讯模拟数据结构课程设计报告.docx
《全国交通资讯模拟数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《全国交通资讯模拟数据结构课程设计报告.docx(36页珍藏版)》请在冰豆网上搜索。
全国交通资讯模拟数据结构课程设计报告
全国交通咨询模拟系统的设计与实现
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<<"****************------------------------*****************"< cout<<"1: 继续更改城市时间"<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 全国 交通 资讯 模拟 数据结构 课程设计 报告