全国交通资讯模拟数据结构课程设计报告Word下载.docx
《全国交通资讯模拟数据结构课程设计报告Word下载.docx》由会员分享,可在线阅读,更多相关《全国交通资讯模拟数据结构课程设计报告Word下载.docx(36页珍藏版)》请在冰豆网上搜索。
添加城市、删除程序、采用火车出行、采用飞机出行
下面给出功能模块图,如图3-1所示。
图3-1全国交通咨询模拟功能模块图
3.3主要函数调用关系图
(给出ADT内基本操作的那些函数之间的函数调用关系图)
如图3-2所示。
图3-2系统函数调用关系图
3.4主界面设计
为了实现全国交通咨询模拟系统,需要设计一个含有多菜单项的主控菜单子程序,以链接系统中各个子项目的调用,为了方便用户使用本系统,本系统主控菜单的运行界面如图3-3所示。
4.详细设计
实现全国交通咨询模拟系统的开发,采用图结构类型存储城市的信息。
其中,各城市间的邻接关系用图的邻接矩阵类型存储;
城市信息用结构体数组存储,其中每个数组元素是一个结构体变量,包含时间和费用三个分量;
图的顶点的个数和边的个数由变量费用、时间大小表示,它们是整型数据。
4.1数据类型定义
数据存储:
有向图、邻接表
函数调用:
#include<
windows.h>
stdio.h>
crtdbg.h>
string.h>
#include<
iostream.h>
malloc.h>
//引用的文本件
#defineINF65535//定义一个最大数定为无穷值
#defineMAX13
typedefintcostAdj[MAX+1][MAX+1];
//图邻接矩阵从1开始记数
intPath[MAX+1][MAX+1];
into[13],h;
//图的定义
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<
G.vexnum;
++v)
Final[v]=FALSE;
D[v]=G.arce[v0][v];
For(w=0;
w<
G.vexnum;
++w)
P[v][w]=FALSE;
}
If(D[v]<
INFINITY)
{//如果有直接互通的两个顶点,直接将这个路径赋值到数组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;
{
If(!
final[w])//w定点在V-S中,及还未确定的顶点。
If(D[w]<
min)
v=w;
min=D[w];
//随着循环进行,依与v0的距离大小,从小到达取的顶点v,并标记进final。
Final[v]=TRUE;
//标记已经找到
For(w=0;
w++)
{
//更新路径
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.源程序清单
#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];
typedefstructc_edit
chara[10];
}c_edit;
c_editadd[10];
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<
成都"
case
(2):
兰州"
break;
case(3):
石家庄"
case(4):
郑州"
case(5):
武汉"
case(6):
贵阳"
case(7):
长沙"
case(8):
广州"
case(9):
南宁"
case(10):
济南"
case(11):
北京"
case(12):
天津"
case(13):
上海"
default:
cout<
add[i-13].a;
}
return1;
//输出城市列表及相应代码
voidpri()
inti;
城市及其代码"
endl<
endl;
*********************************************************"
for(i=1;
i<
=c_number;
i++)
."
pr(i,0);
}
//构造带权(费用)图返回首地址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;
c_number+1;
for(j=1;
j<
j++)
{
G->
cost[i][j]=INF;
//初始化使G->
cost[i][j]为无穷。
}
G->
numVerts=c_number;
cost[1][6]=G->
cost[6][1]=96;
cost[1][2]=G->
cost[2][1]=84;
cost[2][3]=G->
cost[3][2]=51;
cost[3][4]=G->
cost[4][3]=53;
cost[4][5]=G->
cost[5][4]=40;
cost[5][6]=G->
cost[6][5]=90;
cost[5][8]=G->
cost[8][5]=67;
cost[5][7]=G->
cost[7][5]=67;
cost[6][7]=G->
cost[7][6]=60;
cost[7][9]=G->
cost[9][7]=25;
cost[3][11]=G->
cost[11][3]=69;
cost[11][12]=G->
cost[12][11]=13;
cost[12][10]=G->
cost[10][12]=67;
cost[3][10]=G->
cost[10][3]=34;
cost[13][10]=G->
cost[10][13]=65;
cost[13][5]=G->
cost[5][13]=118;
if(o){
while(h==1)
v=v+1;
pri();
cout<
火车花费查询"
请输入开始城市的数字代码"
cin>
a;
请输入结尾城市的数字代码"
b;
请输入你预算的两地花费金额"
m[v].c_cost;
n[v].c_cost=a;
x[v].c_cost=b;
请选择"
****************---------------------********************"
1:
继续更改城市费用"
0:
返回上一级菜单"
h;
switch(h){
case1:
h=1;
break;
case0:
h=0;
default:
cout<
选择出错"
f=v+1;
while(v--){
cost[n[v].c_cost][x[v].c_cost]=m[v].c_cost;
v=f;
return(G);
//构造带权(时间)图返回首地址G:
unDiGraph*CreateTimeG(into)//火车的时间的存贮和编辑功能
inta=0,b=0,f,h=1;
//初始化使G->
cost[6][1]=9;
cost[2][1]=8;
cost[3][2]=5;
cost[4][3]=5;
cost[5][4]=4;
cost[6][5]=9;
cost[7][5]=6;
cost[8][5]=6;
cost[7][6]=6;
cost[9][7]=2;
cost[11][3]=6;
cost[12][11]=1;
cost[10][12]=6;
cost[10][3]=3;
cost[10][13]=6;
cost[5][13]=11;
if(o){
z=z+1;
火车时间预算编辑"
请输入你的两地时间"
m[z].c_time;
n[z].c_time=a;
x[z].c_time=b;
继续更改城市时间"
选择出现BUG!
!
f=z+1;
while(z--){
cost[n[z].c_time][x[z].c_time]=m[z].c_time;
z=f;
unDiGraph*CreateTimeF(into)//飞机的时间的存贮和编辑功能
cost[6][1]=3;
cost[2][1]=2;
cost[3][2]=1;
cost[4][3]=2;
cost[6][5]=3;
cost[10][12]=2;
cost[5][13]=1;
t=t+1;
飞机时间编辑"
m[t].f_time;
n[t].f_time=a;
x[t].f_time=b;
****************------------------