全国铁路运输网最佳经由问题数据结构课程设计1
数据结构关于物流配送路径最优问题的课程设计报告

“数据结构”课程设计报告物流配送中的最优路径规划模拟软件学生姓名:指导教师:所在系:电子信息系所学专业:计算机科学与技术年级:2011级计算机( 2 )班2013年6月13日摘要:通过对路径寻优问题的探讨分析,合理选取城市物流配送模式,结合物流配送的一般实际情况,确定较好的解决城市物流配送的路径寻优问题的最为关键一步就是解决末级配送中心的最优配送路线问题;然后深入剖析了影响配送的各种因素,建立基于费用成本,时间最少,距离最近为一体的最优配送路径的配送系统数学模型。
关键词:物流配送路径最优数学模型目录目录 (3)第一章需求分析 (4)第二章概要分析 (5)1、最短路径分析 (5)2、最短时间分析 (6)3、最少费用分析 (6)第三章系统代码 (7)第四章系统调试 (20)1、查看城市 (20)2、最短路径查询 (20)3、最短时间查询 (21)4、最少费用查询 (21)5、退出系统 (22)第五章系统分析与运行环境 (23)第六章实验小结 (24)参考文献 (25)随着市场经济的发展和物流技术专业化水平的提高,物流配送业得到了迅猛发展。
配送路径的选择是否合理,对加快配送速度、提高服务质量、降低配送成本及增加经济效益都有较大影响。
配送路径的优化问题是物流配送系统的一个主要问题,物流配送路径的优化就是以最低的运营成本、最快捷的响应速度、最短的配送运输时间,把货物运至用户手中。
物流车装载当日需要配送的货品从仓库出发,按照事先规划好的最优配送路径为每一个客户进行配送。
IT系统在配送之前需要根据客户的配送地址间线路间距、经验路况做分析计算出一条最优配送路径。
本题要求利用c语言设计一套模拟软件,使物流公司可以按照最短路程、最短时间及最少费用的策略生成配送方案,并在软件界面上模拟车辆的行进。
1、最短路径分析图12、最短时间分析图2 3、最少费用分析第三章系统代码/*物流配送路径最优程序模拟*/#include"string.h"#include"stdio.h"#include "math.h"typedef struct ArcCell{int adj;//相邻接的城市序号}ArcCell;//定义边的类型typedef struct vertextype{int number;//城市序号char *city;//城市名称}VertexType;//定义顶点的类型typedef struct{VertexType vex[12];//图中的顶点,即为城市ArcCell arcs[12][12];//图中的边,即为城市的距离ArcCell prices[12][12];//图中的第二边,即为城市的费用ArcCell times[12][12];//图中的第三边,即为城市的时间int vexnum,arcnum,pricenum,timenum;}MGraph;//定义图的类型MGraph G;//把图定义为全局变量int P[12][12];long int D[12];void CreateUDN1(v,p)//造图函数int v,p;{int m,n;G.vexnum=v;G.pricenum=p;for(m=0;m<G.vexnum;++m)G.vex[m].number=m;//下边是城市名G.vex[0].city="芜湖";G.vex[1].city="巢湖";G.vex[2].city="宿州";G.vex[3].city="合肥";G.vex[4].city="铜陵";G.vex[5].city="淮北";G.vex[6].city="亳州";G.vex[7].city="蚌埠";G.vex[8].city="滁州";G.vex[9].city="淮南";G.vex[10].city="阜阳";G.vex[11].city="池州";//这里把所有的边假定为20000,含义是城市间不可到达for(m=0;m<G.vexnum;++m)for(n=0;n<G.vexnum;++n)G.prices[m][n].adj=20000;//下边是可直接到达的城市间的费用,由于两个城市间的费用是相互的,所以要对图中对称的边同时赋值G.prices[0][1].adj=G.prices[1][0].adj=13;G.prices[0][2].adj=G.prices[2][0].adj=54;G.prices[0][3].adj=G.prices[3][0].adj=24;G.prices[0][4].adj=G.prices[4][0].adj=7;G.prices[0][5].adj=G.prices[5][0].adj=36;G.prices[0][6].adj=G.prices[6][0].adj=62;G.prices[0][7].adj=G.prices[7][0].adj=47;G.prices[0][8].adj=G.prices[8][0].adj=29;G.prices[0][9].adj=G.prices[9][0].adj=38;G.prices[0][10].adj=G.prices[10][0].adj=54;G.prices[0][11].adj=G.prices[11][0].adj=23;G.prices[1][2].adj=G.prices[2][1].adj=44;G.prices[1][3].adj=G.prices[3][1].adj=13;G.prices[1][4].adj=G.prices[4][1].adj=14;G.prices[1][5].adj=G.prices[5][1].adj=29;G.prices[1][6].adj=G.prices[6][1].adj=55;G.prices[1][7].adj=G.prices[7][1].adj=30;G.prices[1][8].adj=G.prices[8][1].adj=42;G.prices[1][9].adj=G.prices[9][1].adj=24;G.prices[1][10].adj=G.prices[10][1].adj=44;G.prices[1][11].adj=G.prices[11][1].adj=19;G.prices[2][3].adj=G.prices[3][2].adj=38;G.prices[2][4].adj=G.prices[4][2].adj=42;G.prices[2][5].adj=G.prices[5][2].adj=12;G.prices[2][6].adj=G.prices[6][2].adj=26;G.prices[2][7].adj=G.prices[7][2].adj=15;G.prices[2][8].adj=G.prices[8][2].adj=33;G.prices[2][9].adj=G.prices[9][2].adj=30;G.prices[2][10].adj=G.prices[10][2].adj=15;G.prices[2][11].adj=G.prices[11][2].adj=50;G.prices[3][4].adj=G.prices[4][3].adj=19;G.prices[3][5].adj=G.prices[5][3].adj=42;G.prices[3][6].adj=G.prices[6][3].adj=25;G.prices[3][7].adj=G.prices[7][3].adj=22;G.prices[3][8].adj=G.prices[8][3].adj=64;G.prices[3][9].adj=G.prices[9][3].adj=16;G.prices[3][10].adj=G.prices[10][3].adj=38;G.prices[3][11].adj=G.prices[11][3].adj=24;G.prices[4][5].adj=G.prices[5][4].adj=50; G.prices[4][6].adj=G.prices[6][4].adj=74; G.prices[4][7].adj=G.prices[7][4].adj=22; G.prices[4][8].adj=G.prices[8][4].adj=55; G.prices[4][9].adj=G.prices[9][4].adj=22; G.prices[4][10].adj=G.prices[10][4].adj=37;G.prices[4][11].adj=G.prices[11][4].adj=6; G.prices[5][6].adj=G.prices[6][5].adj=15; G.prices[5][7].adj=G.prices[7][5].adj=22; G.prices[5][8].adj=G.prices[8][5].adj=42; G.prices[5][9].adj=G.prices[9][5].adj=44; G.prices[5][10].adj=G.prices[10][5].adj=25;G.prices[5][11].adj=G.prices[11][5].adj=36;G.prices[6][7].adj=G.prices[7][6].adj=47; G.prices[6][8].adj=G.prices[8][6].adj=65; G.prices[6][9].adj=G.prices[9][6].adj=38; G.prices[6][10].adj=G.prices[10][6].adj=17;G.prices[6][11].adj=G.prices[11][6].adj=42;G.prices[7][8].adj=G.prices[8][7].adj=20; G.prices[7][9].adj=G.prices[9][7].adj=15; G.prices[7][10].adj=G.prices[10][7].adj=33;G.prices[7][11].adj=G.prices[11][7].adj=42;G.prices[8][9].adj=G.prices[9][8].adj=33; G.prices[8][10].adj=G.prices[10][8].adj=47;G.prices[8][11].adj=G.prices[11][8].adj=89;G.prices[9][10].adj=G.prices[10][9].adj=10;G.prices[9][11].adj=G.prices[11][9].adj=54;G.prices[10][11].adj=G.prices[11][10].adj=72; }void CreateUDN2(v,t)//造图函数int v,t;{int m,n;G.vexnum=v;G.pricenum=t;for(m=0;m<G.vexnum;++m)G.vex[m].number=m;//下边是城市名G.vex[0].city="芜湖";G.vex[1].city="巢湖";G.vex[2].city="宿州";G.vex[3].city="合肥";G.vex[4].city="铜陵";G.vex[5].city="淮北";G.vex[6].city="亳州";G.vex[7].city="蚌埠";G.vex[8].city="滁州";G.vex[9].city="淮南";G.vex[10].city="阜阳";G.vex[11].city="池州";//这里把所有的边假定为20000,含义是城市间不可到达for(m=0;m<G.vexnum;++m)for(n=0;n<G.vexnum;++n)G.times[m][n].adj=20000;//下边是可直接到达的城市间的时间,由于两个城市间的时间是相互的,所以要对图中对称的边同时赋值G.times[0][1].adj=G.times[1][0].adj=54;G.times[0][2].adj=G.times[2][0].adj=314;G.times[0][3].adj=G.times[3][0].adj=114;G.times[0][4].adj=G.times[4][0].adj=81;G.times[0][5].adj=G.times[5][0].adj=494;G.times[0][6].adj=G.times[6][0].adj=391;G.times[0][7].adj=G.times[7][0].adj=246;G.times[0][8].adj=G.times[8][0].adj=159;G.times[0][9].adj=G.times[9][0].adj=205;G.times[0][10].adj=G.times[10][0].adj=309;G.times[0][11].adj=G.times[11][0].adj=120;G.times[1][2].adj=G.times[2][1].adj=285;G.times[1][3].adj=G.times[3][1].adj=88;G.times[1][4].adj=G.times[4][1].adj=176;G.times[1][5].adj=G.times[5][1].adj=349;G.times[1][6].adj=G.times[6][1].adj=332;G.times[1][7].adj=G.times[7][1].adj=187;G.times[1][8].adj=G.times[8][1].adj=273;G.times[1][9].adj=G.times[9][1].adj=171;G.times[1][10].adj=G.times[10][1].adj=288;G.times[1][11].adj=G.times[11][1].adj=228;G.times[2][3].adj=G.times[3][2].adj=224;G.times[2][4].adj=G.times[4][2].adj=298;G.times[2][5].adj=G.times[5][2].adj=50;G.times[2][6].adj=G.times[6][2].adj=255;G.times[2][7].adj=G.times[7][2].adj=60;G.times[2][8].adj=G.times[8][2].adj=152;G.times[2][9].adj=G.times[9][2].adj=182;G.times[2][10].adj=G.times[10][2].adj=173;G.times[2][11].adj=G.times[11][2].adj=350;G.times[3][4].adj=G.times[4][3].adj=229;G.times[3][5].adj=G.times[5][3].adj=283;G.times[3][6].adj=G.times[6][3].adj=240;G.times[3][7].adj=G.times[7][3].adj=109;G.times[3][8].adj=G.times[8][3].adj=73;G.times[3][9].adj=G.times[9][3].adj=71;G.times[3][10].adj=G.times[10][3].adj=165;G.times[3][11].adj=G.times[11][3].adj=251;G.times[4][5].adj=G.times[5][4].adj=416; G.times[4][6].adj=G.times[6][4].adj=453; G.times[4][7].adj=G.times[7][4].adj=380; G.times[4][8].adj=G.times[8][4].adj=240; G.times[4][9].adj=G.times[9][4].adj=331; G.times[4][10].adj=G.times[10][4].adj=424;G.times[4][11].adj=G.times[11][4].adj=56; G.times[5][6].adj=G.times[6][5].adj=205; G.times[5][7].adj=G.times[7][5].adj=125; G.times[5][8].adj=G.times[8][5].adj=231; G.times[5][9].adj=G.times[9][5].adj=245; G.times[5][10].adj=G.times[10][5].adj=145;G.times[5][11].adj=G.times[11][5].adj=515;G.times[6][7].adj=G.times[7][6].adj=271; G.times[6][8].adj=G.times[8][6].adj=369; G.times[6][9].adj=G.times[9][6].adj=174; G.times[6][10].adj=G.times[10][6].adj=68; G.times[6][11].adj=G.times[11][6].adj=515;G.times[7][8].adj=G.times[8][7].adj=33;G.times[7][9].adj=G.times[9][7].adj=99;G.times[7][10].adj=G.times[10][7].adj=192;G.times[7][11].adj=G.times[11][7].adj=331;G.times[8][9].adj=G.times[9][8].adj=201; G.times[8][10].adj=G.times[10][8].adj=321;G.times[8][11].adj=G.times[11][8].adj=265;G.times[9][10].adj=G.times[10][9].adj=89; G.times[9][11].adj=G.times[11][9].adj=382;G.times[10][11].adj=G.times[11][10].adj=485; }void CreateUDN(v,a)//造图函数int v,a;{int i,j;G.vexnum=v;G.arcnum=a;for(i=0;i<G.vexnum;++i)G.vex[i].number=i;//下边是城市名G.vex[0].city="芜湖";G.vex[1].city="巢湖";G.vex[2].city="宿州";G.vex[3].city="合肥";G.vex[4].city="铜陵";G.vex[6].city="亳州";G.vex[7].city="蚌埠";G.vex[8].city="滁州";G.vex[9].city="淮南";G.vex[10].city="阜阳";G.vex[11].city="池州";//这里把所有的边假定为20000,含义是城市间不可到达for(i=0;i<G.vexnum;++i)for(j=0;j<G.vexnum;++j)G.arcs[i][j].adj=20000;//下边是可直接到达的城市间的距离,由于两个城市间的距离是相互的,所以要对图中对称的边同时赋值G.arcs[0][1].adj=G.arcs[1][0].adj=77;G.arcs[0][2].adj=G.arcs[2][0].adj=399;G.arcs[0][3].adj=G.arcs[3][0].adj=141;G.arcs[0][4].adj=G.arcs[4][0].adj=78;G.arcs[0][5].adj=G.arcs[5][0].adj=523;G.arcs[0][6].adj=G.arcs[6][0].adj=466;G.arcs[0][7].adj=G.arcs[7][0].adj=309;G.arcs[0][8].adj=G.arcs[8][0].adj=182;G.arcs[0][9].adj=G.arcs[9][0].adj=236;G.arcs[0][10].adj=G.arcs[10][0].adj=362;G.arcs[0][11].adj=G.arcs[11][0].adj=135;G.arcs[1][2].adj=G.arcs[2][1].adj=285;G.arcs[1][3].adj=G.arcs[3][1].adj=64;G.arcs[1][4].adj=G.arcs[4][1].adj=155;G.arcs[1][5].adj=G.arcs[5][1].adj=446;G.arcs[1][6].adj=G.arcs[6][1].adj=389;G.arcs[1][7].adj=G.arcs[7][1].adj=195;G.arcs[1][8].adj=G.arcs[8][1].adj=258;G.arcs[1][9].adj=G.arcs[9][1].adj=159;G.arcs[1][10].adj=G.arcs[10][1].adj=285;G.arcs[1][11].adj=G.arcs[11][1].adj=212;G.arcs[2][3].adj=G.arcs[3][2].adj=221;G.arcs[2][4].adj=G.arcs[4][2].adj=440;G.arcs[2][5].adj=G.arcs[5][2].adj=52;G.arcs[2][6].adj=G.arcs[6][2].adj=289;G.arcs[2][7].adj=G.arcs[7][2].adj=90;G.arcs[2][8].adj=G.arcs[8][2].adj=217;G.arcs[2][9].adj=G.arcs[9][2].adj=176;G.arcs[2][10].adj=G.arcs[10][2].adj=185;G.arcs[2][11].adj=G.arcs[11][2].adj=497;G.arcs[3][4].adj=G.arcs[4][3].adj=219;G.arcs[3][5].adj=G.arcs[5][3].adj=382;G.arcs[3][6].adj=G.arcs[6][3].adj=325;G.arcs[3][8].adj=G.arcs[8][3].adj=213;G.arcs[3][9].adj=G.arcs[9][3].adj=95;G.arcs[3][10].adj=G.arcs[10][3].adj=221;G.arcs[3][11].adj=G.arcs[11][3].adj=276;G.arcs[4][5].adj=G.arcs[5][4].adj=492;G.arcs[4][6].adj=G.arcs[6][4].adj=544;G.arcs[4][7].adj=G.arcs[7][4].adj=350;G.arcs[4][8].adj=G.arcs[8][4].adj=234;G.arcs[4][9].adj=G.arcs[9][4].adj=314;G.arcs[4][10].adj=G.arcs[10][4].adj=440;G.arcs[4][11].adj=G.arcs[11][4].adj=57;G.arcs[5][6].adj=G.arcs[6][5].adj=265;G.arcs[5][7].adj=G.arcs[7][5].adj=142;G.arcs[5][8].adj=G.arcs[8][5].adj=269;G.arcs[5][9].adj=G.arcs[9][5].adj=287;G.arcs[5][10].adj=G.arcs[10][5].adj=161;G.arcs[5][11].adj=G.arcs[11][5].adj=549;G.arcs[6][7].adj=G.arcs[7][6].adj=316;G.arcs[6][8].adj=G.arcs[8][6].adj=443;G.arcs[6][9].adj=G.arcs[9][6].adj=230;G.arcs[6][10].adj=G.arcs[10][6].adj=104;G.arcs[6][11].adj=G.arcs[11][6].adj=601;G.arcs[7][8].adj=G.arcs[8][7].adj=127;G.arcs[7][9].adj=G.arcs[9][7].adj=86;G.arcs[7][10].adj=G.arcs[10][7].adj=212;G.arcs[7][11].adj=G.arcs[11][7].adj=407;G.arcs[8][9].adj=G.arcs[9][8].adj=737;G.arcs[8][10].adj=G.arcs[10][8].adj=399;G.arcs[8][11].adj=G.arcs[11][8].adj=281;G.arcs[9][10].adj=G.arcs[10][9].adj=126;G.arcs[9][11].adj=G.arcs[11][9].adj=299;G.arcs[10][11].adj=G.arcs[11][10].adj=497;}void narrate()//说明函数{int i,k=0;//printf("\n********************欢迎使用最优路径程序!********************\n"); printf("\n城市列表如下:\n\n");for(i=0;i<12;i++){printf("(%2d)%-10s",i,G.vex[i].city);//输出城市列表k=k+1;if(k%4==0)printf("\n");}}int Num;{int v,w,i,t;int final[12];int min;for(v=0;v<12;++v){final[v]=0;D[v]=G.prices[Num][v].adj;for(w=0;w<12;++w)P[v][w]=0;if(D[v]<20000){P[v][Num]=1;P[v][v]=1;}}D[Num]=0;final[Num]=1;for(i=0;i<12;++i){min=20000;for(w=0;w<12;++w)if(!final[w])if(D[w]<min){v=w;min=D[w];}final[v]=1;for(w=0;w<12;++w)if(!final[w]&&((min+G.prices[v][w].adj)<D[w])){D[w]=min+G.prices[v][w].adj;for(t=0;t<12;t++)P[w][t]=P[v][t];P[w][w]=1;}}}void output1(city1,city2)//输出函数int city1;int city2;{int a,b,c,d,q=0;a=city2;if(a!=city1){printf("\n 从%s到%s的最少费用路径是",G.vex[city1].city,G.vex[city2].city); printf("(最少费用为%dRMB.)\n\t",D[a]);printf("%s",G.vex[city1].city);d=city1;for(c=0;c<12;++c){gate:;/*标号,可以作为goto语句跳转的位置*/P[a][city1]=0;for(b=0;b<12;b++)if(G.prices[d][b].adj<20000&&P[a][b]){printf("-->%s",G.vex[b].city);q=q+1;P[a][b]=0;d=b;if(q%8==0)printf("\n");goto gate;}}}}}void ShortestTime(Number)//最短时间函数int Number;{int v,w,i,t;int final[12];int min;for(v=0;v<12;++v){final[v]=0;D[v]=G.times[Number][v].adj; for(w=0;w<12;++w)P[v][w]=0;if(D[v]<20000){P[v][Number]=1;P[v][v]=1;} }D[Number]=0;final[Number]=1;for(i=0;i<12;++i){min=20000;for(w=0;w<12;++w)if(!final[w])if(D[w]<min){v=w;min=D[w];}final[v]=1;for(w=0;w<12;++w)if(!final[w]&&((min+G.times[v][w].adj)<D[w])) {D[w]=min+G.times[v][w].adj;for(t=0;t<12;t++)P[w][t]=P[v][t];P[w][w]=1;}}}void output2(city1,city2)//输出函数int city1;int city2;{int a,b,c,d,q=0;a=city2;if(a!=city1)printf("\n 从%s到%s的最少时间路径是",G.vex[city1].city,G.vex[city2].city); if(D[a]/60==0)printf("(最少时间为%dminutes.)\n\t",D[a]);//if(D[a]/60!=0)elseprintf("(最少时间为%dh %dmin.)\n\t",D[a]/60,D[a]%60);printf("%s",G.vex[city1].city);d=city1;for(c=0;c<12;++c){gate:;/*标号,可以作为goto语句跳转的位置*/P[a][city1]=0;for(b=0;b<12;b++){if(G.times[d][b].adj<20000&&P[a][b]){printf("-->%s",G.vex[b].city);q=q+1;P[a][b]=0;d=b;if(q%8==0)printf("\n");goto gate;}}}}}void ShortestPath(num)//最短路径函数int num;{int v,w,i,t;int final[12];int min;for(v=0;v<12;++v){final[v]=0;D[v]=G.arcs[num][v].adj;for(w=0;w<12;++w)P[v][w]=0;if(D[v]<20000){P[v][num]=1;P[v][v]=1;}}D[num]=0;final[num]=1;for(i=0;i<12;++i){min=20000;for(w=0;w<12;++w)if(!final[w])if(D[w]<min){v=w;min=D[w];}final[v]=1;for(w=0;w<12;++w){D[w]=min+G.arcs[v][w].adj;for(t=0;t<12;t++)P[w][t]=P[v][t];P[w][w]=1;}}}void output(city1,city2)//输出函数int city1;int city2;{int a,b,c,d,q=0;a=city2;if(a!=city1){printf("\n 从%s到%s的最短路径是",G.vex[city1].city,G.vex[city2].city); printf("(最短路径为%dkm.)\n\t",D[a]);printf("%s",G.vex[city1].city);d=city1;for(c=0;c<12;++c){gate:;/*标号,可以作为goto语句跳转的位置*/P[a][city1]=0;for(b=0;b<12;b++){if(G.arcs[d][b].adj<20000&&P[a][b]){printf("-->%s",G.vex[b].city);q=q+1;P[a][b]=0;d=b;if(q%8==0)printf("\n");goto gate;}}}}}int main()/*主函数*/{int v0,v1;int a;int type ;int run = 1;CreateUDN(12,66);CreateUDN1(12,66);CreateUDN2(12,66);printf(" 最优路径解决方法:\n");printf("***************************************\n"" 1.查看城市\n"" 3.按最短时间查询\n"" 4.按最少费用查询\n"" 5.退出系统\n""***************************************\n" ); do{printf("请输入您需要服务的项目:");scanf("%d", &type);switch(type){case 1:narrate();break;case 2:printf("\n\n请选择起点城市(0~11):");scanf("%d",&v0);printf("\n");printf("\n\n请选择终点城市(0~11):");scanf("%d",&v1);printf("\n");ShortestPath(v0); /*计算两个城市之间的最短路径*/output(v0,v1); /*输出结果*/printf("\n");break;case 3:printf("\n\n请选择起点城市(0~11):");scanf("%d",&v0);printf("\n");printf("\n\n请选择终点城市(0~11):");scanf("%d",&v1);printf("\n");ShortestTime(v0); /*计算两个城市之间的最短时间*/ output2(v0,v1); /*输出结果*/printf("\n");break;case 4:printf("\n\n请选择起点城市(0~11):");scanf("%d",&v0);printf("\n");printf("\n\n请选择终点城市(0~11):");scanf("%d",&v1);printf("\n");ShortestPrice(v0); /*计算两个城市之间的最少费用*/ output1(v0,v1); /*输出结果*/printf("\n");break;case 5:getchar();printf("你确定退出吗?(y/n)");a = getchar();switch(a){case 'y':run = 0;break;case 'n':run = 1;break;default:break;}if((a == 'y') || (a == 'n')) break; } break;getchar();}}while(run);return 0;}第四章系统调试1、查看城市图4 查看城市2、最短路径查询图5 最短路径查询3、最短时间查询图6 最短时间查询4、最少费用查询图7 最少费用查询5、退出系统图8 退出系统第五章系统分析与运行环境物流配送路径最优系统专注于商品的发货、运输、到货等作业的计划、控制和反馈过程的信息搜集、汇总、查询和分析,达到提高物流配送效率,降低物流配送成本的目的。
数据结构课程设计—城市道路交通咨询系统【范本模板】

(2)用户根据自己设置的城市个数和路径数,具体输入每个路径的起始点以及每条路径的长度。
(3)进入菜单选择界面
(4)选择2,系统为用户进行提供任意城市的交通查询,即查询任意两个城市之间的一条最短路径。
基本思想:设G(V,E)是一个带权有向图,把图中的顶点集合V分成两组,第一组为已经求出的最短路径的顶点集合(用S表示,初始时S中只有一个原点,以后每求得一条最短路径就加入的集合S中,知道全部顶点都加入到集合中),第二组,为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点就如S中。如果两个顶点之间有权值,并且各个路径的权值不同,就把最小的作为顶点与顶点的最短距离.
3.定义一个Floyd函数
void Floyd(MGraph*G,int n);
2
图2—2
邻接矩阵构造图结构函数
数据类型定义:
typedef struct
{
VertexTypevexs[MAX];
Adjmatrix arcs[MAX][MAX];
}MGraph;
void CreateMGraph(MGraph *G,int n,int e)//邻接矩阵构成有向图
这次在应用中,我发现了自己的很多不足,在编写城市交通咨询系统的过程中,自己C语言方面的只是掌握太少,很多功能需求只能退而求其次,一次又一次的更改,一次又一次的失败,也终于是在最后也完成了自己的要求,同时我也知道了平时用功学习的重要性。尤其是在日常学习之中,对于单一的只是点也许掌握的还不错,但是自己动手太少,实践经验严重不足,且面临课程设计之时,要求多方面的只是结和编码,对于我而言还是有很大的难度的。如此次对于邻接矩阵的存储于读取,以及最短路径算法的实现,两个及其重要的算法,狄克斯特拉算法和佛洛依德算法,在具体的应用上还是有很多不足。
数据结构课程设计_____全国交通咨询系统

太原工业学院计算机工程系数据结构课程设计设计题目:全国交通网络咨询系统1班级:计算机科学与技术学号:**********名:**指导教师:***年月日目录一、课程设计题目 (1)二、需求分析 (1)三、测试数据 (2)四、概要设计 (2)五、调用关系图 (3)六、程序代码 (3)七、测试结果 (14)八、心得体会及总结 (14)数据结构课程设计一、课程设计题目全国交通网络咨询系统二、需求分析1、实现功能对城市信息(城市名、城市间的里程)进行编辑:具备添加、修改、删除功能;对城市间的交通工具:火车。
对列车时刻表进行编辑:里程、和列车班次的添加、修改、删除;提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具,可以不考虑回程;咨询以用户和计算机对话方式进行,要注意人机交互的屏幕界面。
由用户选择最优决策原则和交通工具,输入起始站、终点站、出发时间,输出信息:最快需要多长时间才能到达及旅费,或者最少需要多少旅费才能到达及时间,并详细说明依次于何时何地乘坐哪一趟列车何时到达何地。
2、设计思路(1) 数据存储。
城市信息(城市名、代码)、交通信息(城市间的里程、各航班和列车时刻)存储于磁盘文件。
在实验中本想用文本储存数据,但操作不熟悉,而是改用图的邻接矩阵储存原始信息,而后用数组进行添加删改(2) 数据的逻辑结构。
根据设计任务的描述,其城市之间的旅游交通问题是典型的图结构,可看作为无向图,图的顶点是城市,边是城市之间所耗费的时间(要包括中转站的时间)或旅费。
(3) 数据的存储结构。
采用邻接表和邻接矩阵都可作为数据的存储结构,这里建议采用邻接矩阵作为数据的存储结构。
(4) 用不同的功能模块对城市信息和交通信息进行编辑。
添加、修改、删除功能可用菜单方式或命令提示方式。
只要能方便的对城市信息和交通信息进行管理即可,但要注意人机界面,具体实现由学生自行设计,也可参考有关程序(届时在网上提供)。
这些工作有不小的工作量。
数据结构课程设计全国交通咨询系统方案

工业应用技术学院课程设计任务书题目全国交通资询系统主要容:设计了一个方便用户查询交通咨询系统。
该系统所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。
该系统可以进行城市,列车车次和飞机航班的编辑的基本信息输入操作。
程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。
基本要求:1、掌握C语言的变量及函数的灵活使用;2、熟练掌握图的深度、广度优先遍历算法思想及其程序实现;3、掌握C语言中文件的基本操作;4、掌握VC++6.0软件的熟练使用。
主要参考资料:[1] 春葆.数据结构程序设计[M].:清华大学,2002,03[2] 王黎,袁永康战略[M].:清华大学,2002,01[3] 谭浩强.C程序设计第二版[M].:清华大学,2003,03[4] 任哲.MFC Windows程序设计[M].:清华大学,2004,06完成期限:2016.12.05—2017.01.05指导教师签名:课程负责人签名:随着高科技的飞速发展,列车、飞机、动车、高铁的出现极大的减少了人们花在旅途上的时间。
对于城市间错综复杂交通网的管理,是一项庞大而复杂的工作。
在此基础上,如何实现交通网智能化的管理达到帮助乘客选择经济高效的交通工具是目前仍处空白。
尤其乘客交通工具的择优选择是一个令人懊恼的工作,一个原因就是各种交通工具的查询十分分散和繁琐。
即使有互联网的帮忙,但是没有一个统一的归类、没有一个精细的算法、系统的软件帮助,人们仍然无法获得最优方式。
为此开发一个交通择优系统是十分必要的。
采用计算机对城市间的交通工具进行系统录入和管理,进一步提高了交通部门针对城市间客运网络的管理效率,实现交通运营网络的系统化、规化和自动化。
全国交通运输网最佳经由问题经典源代码

{
int *base; // 在栈构造之前和销毁之后,base的值为NULL
int *top; // 栈顶指针
int stacksize; // 当前已分配的存储空间,以元素为单位
}; // 顺序栈
(4)基本操作的实现
goto text;
}
else
{
for(i=0;i<G.vexnum;i++)
{
fprintf(fp,"%s ",G.vex[i]);
}
}
for(m=0;m<3;m++)
for(i=0;i<G.vexnum;i++)
if(strcmp(ch,"11B")==0)
{
i=LocateVex(G,va);
j=LocateVex(G,vb);
G.arcs[0][i][j].adj=w;
strcpy(G.arcs[0][i][j].info,ch);
G.arcs[1][i][j].adj=w;
G.arcs[0][i][j].adj=w;
strcpy(G.arcs[0][i][j].info,ch);
}
else if(strcmp(ch,"01B")==0)
{
i=LocateVex(G,va);
j=LocateVex(G,vb);
{
G.arcs[m][i][j].adj=INFINITY;
strcpy(G.arcs[m][i][j].info,"His");
数据结构课程设计全国交通模拟

数据结构课程设计报告班级:191113学号:20111000611姓名:黄建钊指导老师:朱晓莲日期:2013年3月7.全国交通咨询模拟出于不同目的的旅客对交通工具有不同的要求。
例如,因公出差的旅客希望在旅途中的时间尽可能短,出门旅游的游客则期望旅费尽可能省,而老年旅客则要求中转次数最少。
编制一个全国城市间的交通咨询程序,为旅客提供两种或三种最优决策的交通咨询。
要求:(1)提供对城市信息进行编辑(如添加或删除)的功能。
(2)城市之间有两种交通工具:火车和飞机。
提供对列车时刻表和飞机航班进行编辑(增设或删除)的功能。
(3)提供两种最优决策:最快到达或最省钱到达。
全程只考虑一种交通工具。
(4)旅途中耗费的总时间应该包括中转站的等候时间。
(5)咨询以用户和计算机的对话方式进行。
1.需求分析1、设计最短路径的算法及其需要信息的存储:本设计中最短路径的算法利用迪杰斯特拉算法,存储方法利用邻接矩阵存储。
2、该程序所做的工作的是模拟全国交通咨询,为旅客提供种最优决策的交通咨询。
此程序规定:在程序中输入城市名称时,需输入10个字母以内的字母串;输入列车或飞机编号时需输入一个字符串类型;输入列车或飞机的费用时需输入一个实型数据;输入列车或飞机开始时间和到达时间时均需输入一个整型数据,在选择功能时,应输入与所选功能对应的一个整型数据。
程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,说明在途中经过的城市名称;程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供两种最优决策:最快到达、最省钱到达。
2.设计2.1设计思想本系统整体上分为存储系统和求最短路径两部分,存储系统运用到数组和结构体。
该系统分别存储火车列次,航班,出发点与目的地以及所需要走的路程和所用费用。
最短路径使用迪杰斯特拉算法编程求算得出最近或最便宜路径。
该算法主要分为三步:1、起始点(V0)与其相邻点的权值(即当前最短路径)。
2004《数据结构》课程设计题目及基本要求如下:

2004《数据结构》课程设计题目及基本要求如下:一、试设计一个航空客运定票系统。
基本要求如下:1、每条航线所涉及的信息有:终点站名、航班号、飞机号、飞机周日(星期几)、乘员定额、余票量、订定票的客户名单(包括姓名、订票量、舱位等级1,2或3)以及等候替补的客户名单(包括姓名、所需数量)。
2、系统能实现的操作和功能如下:1)查询航线:根据客户提出的终点站名输出如下信息:航班号、飞机号、星期几飞行,最近一天航班的日期和余票额;2)承办订票业务:根据客户提出的要求(航班号、订票数额)查询该航班票额情况,若有余票,则为客户办理订票手续,输出座位号;若已满员或余票少余订票额,则需重新询问客户要求。
若需要,可登记排队候补;3)承办退票业务:根据客户提出的情况(日期、航班号),为客户办理退票手续,然后查询该航班是否有人排队候补,首先询问排在第一的客户,若所退票额能满足他的要求,则为他办理订票手续,否则依次询问其它排队候补的客户。
3、实现提示:两个客户名单可分别由线性表和队列实现。
为查找方便,已订票客户的线性表应按客户姓名有序,并且,为了插入和删除方便,应以链表作为存储结构。
由于预约人数无法预计,队列也应以链表作为存储结构。
二、校园导游咨询(为来访的客人提供各种信息服务)1、基本要求:1)设计下沙校园平面图,在校园景点选10个左右景点。
以图中顶点表示校园内各景点,存放景点名称、代号、简介等信息;以边表示路径,存放路径长度等有关信息。
2)为来访客人提供图中任意景点相关信息的查询。
3)为来访客人提供任意景点的问路查询,即查询任意两个景点之间的一条最短路径。
2、实现提示:一般情况下,校园的道路是双向通行的,可设计校园平面图是一个无向网。
顶点和边均含有相关信息。
三、停车场管理问题[问题描述]设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。
车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。
数据结构课程设计报告--交通咨询系统

数据结构设计报告姓名:专业:指导教师:目录摘要 (3)第1章概述 (4)1.1系统实现的目标 (4)1.2系统实现方案 (4)1.3系统实现环境 (4)1.4具体的开发方法 (4)第2章系统设计 (5)2.1系统功能设计 (5)2.2数据设计 (5)2.3界面的设计 (5)第3章系统实现 (9)参考文献 (15)摘要设计、实现一个全国大城市间的交通咨询程序,为旅客提供三种最优决策方案:一是建立交通网络图的存储结构,二实现两个城市间的最短路经问题。
程序所具有的功能特色本程序主要目的是为了给用户提供路径咨询。
实现了帮助用户了解全国各大城市间往来的最短路径问题,第二,可以提供用户查询各大城市的相关信息。
本程序最大的特点是支持用户自己添加城市信息及城市,或添加城市的路径,既就有可扩展性该程序所做的工作的是模拟全国交通咨询,为旅客提供三种最优决策的交通咨询。
此程序规定:(1)在程序中输入城市名称时,需输入10个字母以内的字母串;输入列车或飞机编号时需输入一个整型数据;输入列车或飞机的费用时需输入一个实型数据;输入列车或飞机开始时间和到达时间时均需输入两个整型数据(以hh:mm的形式);在选择功能时,应输入与所选功能对应的一个整型数据。
(2)程序的输出信息主要是:最快需要多少时间才能到达,或最少需要多少旅费才能到达,或最少需要多少次中转到达,并详细说明依次于何时乘坐哪一趟列车或哪一次班机到何地。
(3)程序的功能包括:提供对城市信息的编辑,提供列车时刻表和飞机航班表的编辑,提供三种最优决策:最快到达、最省钱到达、最少中转次数到达。
第1章概述1.1 系统实现的目标通过进行课程设计,了解并初步掌握设计、实现较大系统的完整过程,包括:系统分析、编码设计、系统集成、以及调试分析,熟练掌握数据结构的选择、设计、实现以及操作方法,为进一步的应用开发打好基础。
应用所学数据结构知识,独立完成问题分析,结合数据结构理论知识,编写程序求解指定问题。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数据结构课程设计报告题目:全国铁路运输网最佳经由问题目录一、需求分析1.问题描述2.基本要求二、概要设计1. 程序流程图2. 数据结构设计三、详细设计1.程序设计思想2.软件模块结构图3.源程序四、调试分析1.测试数据2.时间复杂度分析3.上机遇到的问题及解决方案4.算法的改进设想五、用户使用手册六、心得体会一、需求分析1.问题描述该题目采用我国铁路运输网的数据进行编程和运行验证。
详细可在网上搜索《全国铁路局管辖线路示意图》,只要全国的主干线就可以了。
铁路运输网络中由铁路线和火车站的两个主要概念,譬如:1号铁路线表示京广线,2号铁路线表示京沪线等。
铁路线对象包括铁路线编号,铁路线名称,起始站编号,终点站编号,该铁路线长度,通行标志(00B客货运禁行,01B货运通行专线,10B客运通行专线,11B 客货运通行)。
火车站对象包括所属铁路线编号,车站代码,车站名,车站简称,离该铁路线起点站路程及终点站路程。
2.基本要求(1)查询某站所属的铁路线(2)要求具备新增铁路线的管理功能(3)要求具备新增车站的管理功能(4)针对客运,货运情况能计算任何一个起始车站到任何一个终点站之间的最短路径。
并且要求能够显示出该最短路径的各个火车站的经由顺序二、概要设计1. 程序流程图(我负责的为除弗洛伊德算法外的设计)在这里简单介绍弗洛伊德算法的核心思想:从图的带权邻接矩阵开始,假设从Vi到Vj有弧,则从Vi到Vj存在一条长度为arcs[i] [j]的路径,该路径不一定是最小路径,尚需进行n次试探。
首先考虑路径(Vi,V0,Vj)是否存在。
如果存在,则比较(Vi,Vj)和(Vi,V0,Vj)的路径长度取长度较短者为从Vi 到Vj的中间顶点的序号不大于0的最短路径。
假如在路径上再增加一个顶点V1,如果(Vi,….,V1)和(V1,….,Vj)分别是当前找到的中间顶点的序号不大于0的最短路径,那么(Vi,…V1,…,Vj)就有可能是从Vi到Vj的中间顶点的序号不大于1的最短路径。
将它和已经得到的Vi到Vj的中间顶点的序号不大于0的最短路径相比较,从中选出中间顶点的序号不大于1的最短路径之后,再增加一个V2继续试探,以此类推,经过n次比较后,即可求出从Vi到Vj的最短路径。
2.数据结构设计存储结构:本程序部分函数采用的是文件进行数据的存储,所以采用的是顺序存储结构,如要添加数据,直接在文件里面进行操作就行了。
弗洛伊德算法中采用的存储结构是图的邻接矩阵。
A.如下为抽象数据类型定义的模板以及抽象数据类型线性表的定义:ADT List{数据对象:D={ai| ai ∈ElemSet,i=1,2,3……,n,n≥0}数据关系:R1={<ai-1,ai>| ai-1,ai ∈D,i=1,2,3,……,n}基本操作:void readviews()初始条件:views.txt已经存在。
操作结果:将 views.txt里面的数据一次存入数组views[SIZE_view]里,并将数组里面的存储数据的个数赋值给全局变量view_count;void readways()初始条件:ways.txt已经存在。
操作结果:将 ways.txt里面的数据一次存入数组ways[SIZE_way]里,并将数组里面的存储数据的个数赋值给全局变量way_count;void readlines()初始条件:lines.txt已经存在。
操作结果:将 lines.txt里面的数据一次存入数组lines[SIZE_line]里,并将数组里面的存储数据的个数赋值给全局变量line_count;void search();初始条件:views[SIZE_view]存在,且里面放有相关信息。
操作结果:根据用户输入的车站名查找该车站的相关信息并输出;void addview()初始条件:views.txt已经存在。
操作结果:将 views.txt里面的数据一次存入数组views[SIZE_view]里,并将数组里面的存储数据的个数赋值给全局变量view_count;void addway()初始条件:ways.txt已经存在。
操作结果:将 ways.txt里面的数据一次存入数组ways[SIZE_way]里,并将数组里面的存储数据的个数赋值给全局变量way_count;void addline()初始条件:lines.txt已经存在。
操作结果:将 lines.txt里面的数据一次存入数组lines[SIZE_line]里,并将数组里面的存储数据的个数赋值给全局变量line_count;void floyed()初始条件: views[SIZE_view]、ways[SIZE_way]、lines[SIZE_line]已经存在并且存有相关信息。
操作结果:把每个车站到各个车站的最短经由路径及此路径的距离存储在path_info、path_list[SIZE_view][SIZE_view]数组里;void shortest_path()初始条件:path_info、path_list[SIZE_view][SIZE_view]存储相关的数据;操作结果:输出输入的两个站的最短距离及经过的所有站;void addadta(int menu)初始条件:views.txt、ways.txt、lines.txt已经存在。
操作结果:如果menu=1,则添加车站数据,如果menu=2,则添加路线数据;B.弗洛伊德算法中,数据结构所用到的思想为图的思想,所以数据结构的设计主要的目的为便于图的操作的设计。
因此我们用了下面这些数据定义。
struct view_info /*城市信息结构*/{int id;char name[20];int code;char shortname[20];char LName[100];//经过此站的铁路线名称}views[SIZE_view];struct line_info//铁路线信息结构{int Lid;char LName[20];int start_id; //始发站int end_id; //终点站int dist; //铁路线长char sign[5]; //通行标志}lines[SIZE_line];struct way_info //铁路度的信息结构{int station1;int station2;int dist;}ways[SIZE_way];struct path_info //用于最短路径的查询{int count;int path[SIZE_view];};三、详细设计1.程序设计思想设计思路:核心问题:求最短路径(弗洛伊德算法)数据模型(逻辑结构):带权有向图输入输出:初始数据是从views.txt、lines.txt、way.txt三个文件中读入,在读入数据后,用户可以根据选项选择相应的功能,不同的功能有不同的数据输入/输出,比如:查询的功能是要求输入要查询的站的名称,然后输出是该站的相关信息;查询最短路径的功能则是输入起点站、终点站的名称,输出则是该段路线距离和经由站等。
程序的输入:(1)铁路线信息的输入:依次输入“铁路线代码,铁路线名称,起始站代码, 终点站代码,该铁路线长度、通行标志” ,并且中间以空格隔开。
(2)火车站信息的输入:依次输入“车站代码,车站名,车站编号、车站简称,所属铁路线编号” ,并且中间以空格隔开。
程序的输出格式:(1)当显示铁路线或者火车站的信息时,与输入时的格式完全一致;(2)输出最短路径的长度,以及最短路径的经由顺序;按照程序功能要求,设计了一下各个功能模块:(1)、文件读取模块文件读取模块包括读取车站信息模块readviews、路段权值信息读取模块readlines、铁路线信息读取模块readlines。
这些模块的主要功能为从文件中读取所需的信息。
(2)、添加信息模块adddata添加信息模块又包括以下子功能模块:A、添加站点信息模块addview。
B、添加路段权值模块addway。
C、添加铁路线信息模块addline。
(3)查询模块根据用户需求,查询站点信息(4)最短路径查询模块该模块为本软件设计的核心部分。
根据该模块可以很方便的找出两个城市的最短路径。
该最短路径的算法为常用的弗洛伊德算法。
(5)操作菜单模块该模块主要用于与用户的交互,一个界面友好的菜单可以提高软件的人机交互体验。
2. 软件模块结构图(1)主程序模块,其中主函数为:void main() { 新增火车站;新增铁路线;查询火车站的信息;针对客运、货运情况,求两站之间的最短路径及其经由顺寻;退出界面 }(2) 文件模块为:void readways(); void readviews(); void readlines()(3)图模块为:Void short_path();void floyed()(4)查询函数和添加函数void search();void adddata(in menu); void addway(); void addline();void addview()函数的调用:进入主函数,调用文件模块各函数以读取数据;选择1或2,则调用void adddata(in menu),其中若选择1,则调用void addview()函数,若选择2,则调用void addline()和void addway()函数;选择3,调用void search()函数进行查询;选择4,调用void short_path()和void floyed()函数以得到最短路径。
3.源程序(见附录)四、调试分析1.测试数据数据读取如下:操作界面如下:功能测试截图:输入1,增加车站信息如下:输入2,增加铁路线信息如下:输入3,查询车站信息如下:输入4,查询最短路径如下:输入5,退出界面如下;2.时间复杂度分析程序中图的存储结构为带权邻接矩阵,其中对邻接矩阵的初始化的时间复杂度为O(n*n); 在求最短路径的时候,用的是弗洛伊德算法,时间复杂度主要在于求每一站到任意站的最短路径由是的for循环,那有三个for循环,所以时间复杂度为O(n3)。
3.上机过程中出现的问题及其解决方案(1)刚刚看到题目要求的时候就想到了弗洛伊德算法,但是不知道如何去做,在网站搜索到类似代码,经过修改后,最终得出了源程序。
(2)源程序可以运行的时候,忘记添加相关文本文件,所以运行文件的时候会提示文件打开失败,无法进行接下来的功能使用,这时候才想起来要自行添加相关的文本文档,接着问题就解决了。
(3)在way.text文本文档中添加各站权值的时候,一开始不知道如何添加,经过思考和查询课本后,明白了添加权值时是以各站编码代表各站,由于是有向图,所以需要添加两站往返权值。