最近做数据结构的课程设计(交通咨询系统),小弟我下载了一段源代码,可是在TC调试的时候发现很多错误,由于小弟我学的不好,怎么也改不过来,想请各位师兄师姐帮我看看,小弟我无限感激。。。。
如果能调试运行成功还望能把正确的代码发到小弟邮箱里(snowfox_metal@sina.com),谢谢啦。。。。
设计思想
存储结构
struct Tra_Tool{
char* id;
char* start;
char* destination;
float time;/*旅途时间*/
float price;
};
主要算法的基本思想:
从题目上来分析我认为这是一个图的最短路径问题.因此决定用Dijkstra算法按路径长度递增的顺序逐步产生最短路径的方法:设置两个顶点的集合T和S,集合S中存放已找到的最短路径的顶点,集合T中存放当前还未找到的最短路径的顶点.初始状态时,集合S中只包含源点V0,然后不断从集合T中选取到顶点V0路径长度最短的顶点加入到集合S中,集合S中每加入一个新的顶点U,都要修改顶点V0到集合T中剩余顶点的最短路径长度值,集合T中各顶点新的最短路径长度值为原来的最短路径长度值与顶点U的最短路径长度只值中的较小的.此过程不断重复,直到集合T的顶点全部加入到集合S为止.
调试分析:
此程序结构体虽然简单,但是算法中的调用和实现并不简单,因此调试过程中还是花了不少心血,尤其是在多个城市间选择最短路径时,时常出错,权值总是输入与运算相差很远,但工夫不负有心人,终于调试成功.
源程序清单:
#include
#include
#include
const float max=FLT_MAX;/* */
struct Tra_Tool{
char* id;
char* start;
char* destination;
float time;/*旅途时间*/
float price;
};
int search(char citytable[][20],char* city,int cn)
{
/*在城市数组中查找某个城市*/
int i;
for(i=0;i if(strcmp(citytable,city)==0)
return i;
}
return -1;
}
/*最优线路*/
void short_path(struct Tra_Tool* timetable,char* start,char* dest,char city[][20],int tn,int cn,int choice)
{
/*start表示出发地,dest表示目的地,tn表示表示航班或车次的总次数,cn表示城市的总数*/
/*choice=0表示求最短时间路线,choice=1表示求最少花费路线*/
int i,j,k,st,et;
float min,t;
char pcity[10][20];
float edge[15][15],dist[15];
int path[15],s[15];
for(i=0;i for(j=0;j{
edge[j]=max;
}
for(i=0;i{
j=search(city,timetable.start,cn);
k=search(city,timetable.destination,cn);
if(choice==0)
{/*最短时间*/
t=timetable.time;
if(t }
else
{/*最少花费*/
t=timetable.price;
if(t }
}
st=search(city,start,cn);
et=search(city,dest,cn);
for(i=0;i dist=edge[st];
s=0;
if(i!=st&&dist else path=-1;
}
s[st]=1; dist[st]=0;
for(i=0;i min=max;
k=st;
for(j=0;j if(!s[j]&&dist[j]{k=j;min=dist[j];}
s[k]=1;
for(j=0;j if(!s[j]&&edge[k][j] printf("%s\t",pcity[j]);
printf("\n");
if(choice==0) printf("total time is:%5.1f\n",dist[et]);
else printf("total money is:%7.2f\n",dist[et]);
printf("\n");
}
void main(){
int i,j,k,m,n,cn=5,tn=6,fn=6;
char city[15][20]={"北京","上海","天津","武汉","广州"};//最多15个城市
struct Tra_Tool train[20]={{"T1","武汉","北京",10,90},{"T2","上海","北京",8,70},
{"T3","北京","天津",3,30},{"T4","广州","北京",25,200},{"T5","广州","武汉",14,120},
{"T6","武汉","上海",8,80}};
struct Tra_Tool flight[20]={{"F1","武汉","北京",3,500},{"F2","上海","北京",2.5,400},
{"F3","北京","天津",1,200},{"F4","广州","北京",6,1400},{"F5","广州","武汉",5,700},
{"F6","武汉","上海",3,450}};
label1:
printf("资料来源:天地格 请保留此信息,谢谢\n");
printf("系统功能:\n");
printf("1.编辑城市信息\n2.编辑火车时刻表\n3.编辑飞机航班表\n4.选择出游路线\n5.退出\n");
printf("请选择:");
scanf("%d",&i);
printf("\n");
switch(i)
{
case 1:{
label2:
printf("现有城市:\n");
for(j=0;j printf("%d.%s\t",j+1,city[j]);
printf("\n\n");
printf("功能:1.添加\n2.删除\n3.返回\n");
printf("请选择:");
scanf("%d",&j);
printf("\n");
if(j==1)
{
printf("请输入城市名:");
scanf("%s",city[cn]);
cn++;
goto label2;
}
if(j==2)
{
printf("请选择要删除的城市的编号:");
scanf("%d",&k);
if(k==cn) cn--;
else{
for(m=k-1;m strcpy(city[m],city[m+1]);
cn--;}
goto label2;}
else goto label1;}
case 2:{
label3:
printf("火车时刻表:\n");
printf("资料来源:\n");
printf(" 车次\n起点站\n终点站\n路途时间\n票价\n");
for(j=0;j printf("%d: %s\t%s\t%s\t%5.1f\t\t%5.2f\t\n",j+1,train[j].id,train[j].start,train[j].destination,
train[j].time,train[j].price);
printf("\n\n");
printf("功能:1.添加\t2.删除\t3.返回\n");
printf("请选择:");
scanf("%d",&j);
printf("\n");
if(j==1){
printf("现有城市:\n");
for(k=0;k printf("%d.%s\t",k+1,city[k]);
printf("\n");
printf("请输入数据:\n");
printf("火车时刻表:\n");
printf("车次\n起点站\n终点站\n路途时间\n票价\n");
scanf("%s%s%s%f%f",train[tn].id,train[tn].start,train[tn].destination,&train[tn].time,&train[tn].price);
tn++;
goto label3;}
else if(j==2){
printf("请选择编号:");
scanf("%d",&k);
if(k==tn) tn--;
else{
for(m=k-1;m train[m]=train[m+1];
tn--;}
goto label3;}
else goto label1; }
case 3:{
label4:
printf("飞机航班表:\n");
printf(" 班次\t起点\t终点\t路途时间\t票价\n");
for(j=0;j printf("%d: %s\t%s\t%s\t%5.1f\t\t%5.2f\t\n",j+1,flight[j].id,flight[j].start,flight[j].destination,
flight[j].time,flight[j].price);
printf("\n\n");
printf("功能:1.添加\t2.删除\t3.返回\n");
printf("资料来源:");
printf("IP地址查询 手机号码归属 邮编区号 身份证验证查询 火车时刻表 成语词典 运程测算 周公解梦 在线学习手册 专业查询网 ");
printf("请选择:");
scanf("%d",&j);
printf("\n");
if(j==1){
printf("现有城市:\n");
for(k=0;k printf("%d.%s\t",k+1,city[k]);
printf("\n");
printf("请输入数据:\n");
printf("车次\t起点站\t终点站\t路途时间\t票价\n");
printf("资料来源:");
printf("IP地址查询 手机号码归属 邮编区号 身份证验证查询 火车时刻表 成语词典 运程测算 周公解梦 在线学习手册 专业查询网 ");
scanf("%s%s%s%f%f",flight[fn].id,flight[fn].start,flight[fn].destination,&flight[fn].time,&flight[fn].price);
fn++;
goto label4;}
else if(j==2){
printf("请选择编号:");
scanf("%d",&k);
if(k==fn) fn--;
else{
for(m=k-1;m flight[m]=flight[m+1];
fn--;}
goto label4;}
else goto label1;}
case 4:{
printf("请选择交通工具(1.火车 2.飞机):");
scanf("%d",&j);
printf("请选择决策方案(1.最短时间 2.最少花费):");
printf("资料来源:");
printf("IP地址查询 手机号码归属 邮编区号 身份证验证查询 火车时刻表 成语词典 运程测算 周公解梦 在线学习手册 专业查询网 ");
scanf("%d",&k);
printf("现有城市:\n");
for(i=0;i printf("%d.%s\t",i+1,city);
printf("\n");
printf("出发地:");
scanf("%d",&m);
printf("目的地:");
scanf("%d",&n);
printf("\n");
if(j==1&&k==1)
if(j==1&&k==2) short_path(train,city[m-1],city[n-1],city,6,5,1);
if(j==2&&k==1) short_path(flight,city[m-1],city[n-1],city,6,5,0);
if(j==2&&k==2) short_path(flight,city[m-1],city[n-1],city,6,5,1);
goto label1;
}
case 5:
return;}}