交通咨询系统设计
数据结构实验报告
一、 设计要求
1.问题描述
根据不同目的的旅客对交通工具具有不同的要求,例如,因公出差的旅客希望在旅途
中的时间尽可能短,出门旅游的游客则希望旅费尽可能省,而老年旅客则要求中转次
数最少。编制一个全国城市之间的模拟交通咨询程序,为旅客提供两种或三种最优决
策的交通咨询。
2.需求分析
(1)提供对城市信息进行编辑的功能。
(2)城市之间有两种交通工具:火车和飞机。提供对列车时刻表和航班进行编辑的
功能。
(3)提供两种最优决策:最快到达或最省钱达到。全程只考虑一种交通工具。
(4)旅途中的航飞的总时间应该包括中转站的等候时间。
(5)咨询以用户和计算机的对方方式进行。由用户输入起始站、终点站、最优决策
原则和交通工具,输出信息:最快需要多长时间才能到达或者最少需要多少旅费才能
达到,并详细说明依次于何时乘坐那一趟列车或哪一次班机到何地。
二、概要设计
1.主界面设计
为实现上面的功能的管理,设计一个主界面,方便引导用户使用。如下图:
2.存储结构设计
本系统采用图结构类型存储抽象交通路线图的信息。其中,各城市间的邻接关系用图
的链表类型存储;城市信息用结构数组存储,其中每个数组元素是一个结构变量。
3.系统功能设计
本系统总共 3 个功能,详细描述如下:
1.管理员管理
管理员管理由函数 Administer 实现。分别包含初始化系统、城市编辑、航班编辑及车
次编辑等功能
2.用户咨询
用户咨询由函数 UserDemand 实现。当用户选择该功能,系统会提供三种最优原则,
并根据用户输入要求,给出最优路线。
3.显示交通系统
显示交通系统由函数 PrintGraph 实现。分别包含显示城市、显示航班以及显示车次等
功能。
三、模块设计
- 1 -
1.模块设计
本系统包含 3 个主程序模块、工作区模块和无向网操作模块。其调用关系如下图所示:
主程序模块
工作区模块
无向网模块
//1.显示程序功能选择界面
//3.用户咨询项目选择界面
//13.航班编辑项目选择界面
//16.车次编辑项目选择界面
//17.增加车次
//18.删除车次
//10.显示城市编辑项目选择界面
//9.用 city,plan,train 三个文档创建城市交通
2.系统子程序及功能设计
本系统共设置 36 个子程序,各子程序的函数名及功能说明如下。
(1)int main()
(2)void Administer(ALGraph *G); //2.显示管理员管理项目选择界面
(3)void UserDemand(ALGraph G);
(4)void PrintGraph(ALGraph *G); //4.显示城市交通系统
//5.初始化交通系统
(5)void initgraph(ALGraph *G);
//6.创建城市名称文档
(6)void createcityfile();
//7.创建航班文档
(7)void createplanefile();
(8)void createtrainfile();
//8.创建车次文档
(9)void CreateGraph(ALGraph *G);
系统
(10)void cityedit(ALGraph *G);
(11)void EnterVertex(ALGraph *G);
//11.增加城市
(12)void DeleteVertex(ALGraph *G); //12.删除城市
(13)void flightedit(ALGraph *G);
(14)void EnterplaneArc(ALGraph *G); //14.增加航班
(15)int DeleteplaneArc(ALGraph *G); //15.删除航班
(16)void trainedit(ALGraph *G);
(17)void EntertrainArc(ALGraph *G);
(18)int DeletetrainArc(ALGraph *G);
(19)int save(ALGraph *G);
(20)void DemandDispose(int n,ALGraph G);//20.用户咨询选择信息输入界面,通过该
子程序调用其他咨询子程序
( 21 ) void ExpenditureDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph
G,int v0,int v1,float *M,int *final);
//21.最少旅行费用处理
(22)void MinExpenditure(infolist arcs,float *expenditure,int *route);
之间最少旅行费用和相应路径
( 23 ) void TimeDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int
v0,int v1,int (*T)[2],int *final);//23.最短旅行时间处理
(24)void MinTime(infolist arcs,int *time,int *route);
行时间和相应路径
(25)void TransferDispose(int k,infolist (*arcs)[MAX_VERTEX_NUM],ALGraph G,int
v0,int v1);
(26)void TimeTreeDispose(Node *head,infolist (*arcs)[MAX_VERTEX_NUM]); //26.
时间树处理
(27)void CreateTimeTree(TimeTree
[MAX_VERTEX_NUM]);
(28)void CopyTimeTree(TimeTree p,TimeTree q);
(29)void VisitTimeTree(TimeTree p);
//19.保存城市交通系统到相应的文档
p,int
//27.创建时间树
i,int
j,LinkQueue
*Q,infolist
(*arcs)
//28.复制时间树
//29.访问时间树界面
//24.两直达城市之间最短旅
//22.两直达城市
//25.最少中转次数处理
- 2 -
(30)void DestoryTimeTree(TimeTree p);
(31)void InitQueue(LinkQueue *Q);
(32)void EnterQueue(LinkQueue *Q,int x);
队列元素
(33)void DeleteQueue(LinkQueue *Q,int *x);
(34)int IsEmpty(LinkQueue *Q);
(35)int LocateVertex(ALGraph *G,char *v);
出城市名在图中对应结点位置
(36)int locatecity(char ct[12]);
3.函数主要调用关系
//36.城市是否已存在
//30.销毁时间树
//31.初始化队列,链队列:队列的链式表示
//32.入队操作,插入元素 x 为 Q 的新的
//33.出队操作
//34.队列判空操作
//35.城市名在交通系统中定位操作,找
主函数可调用子程序 2,3,4
子程序 2 可调用子程序 5,10,13,16
子程序 5 可调用子程序 6,7,8,9
子程序 7,8 可调用子程序 36
子程序 9,14,15,17,18 可调用子程序 35
子程序 10 可调用子程序 11,12
子程序 13 可调用子程序 14,15
子程序 16 可调用子程序 17,18
子程序 3 可调用子程序 20
子程序 20 可调用子程序 25,21,23
子程序 25 可调用子程序 31,28,33,34
子程序 21 可调用子程序 22
子程序 23 可调用子程序 24,26
子程序 26 可调用子程序 27,29,30
子程序 27 可调用子程序 28
四、详细设计
1.数据类型定义
(1)结构体定义
typedef struct
{int number;
float expenditure;
int begintime[2];
int arrivetime[2];
}Vehide;
typedef struct
{Vehide stata[MAX_ROUTE_NUM];
int last;
}infolist;
typedef struct ArcNode
{int adjvex;
struct ArcNode *nextarc;
infolist info;
- 3 -
}ArcNode;
typedef struct VNode
{char cityname[10];
ArcNode *planefirstarc,*trainfirstarc;
}VNode,AdjList[MAX_VERTEX_NUM];
typedef struct
{AdjList vertices;
int vexnum,planearcnum,trainarcnum;
}ALGraph;
typedef struct Node
{int adjvex;
int route;
struct Node *next;
}Node;
typedef struct QNode
{int adjvex;
struct QNode *next;
}QNode;
typedef struct
{QNode *front;
QNode *rear;
}LinkQueue;
typedef struct TimeNode
{int adjvex;
int route;
int begintime[2];
int arrivetime[2];
struct TimeNode *child[MAX_ROUTE_NUM];
}TimeNode,*TimeTree;
struct arc
{int co;
char vt[10];
char vh[10];
int bt[2];
int at[2];
float mo;
}a[MAX_ARC_SIZE];
(2)全局变量定义
char city[MAX_VERTEX_NUM][10];
int TTime[2];
int time[2];
int time1[2];
int time2[2];
int c[MAX_VERTEX_NUM];
- 4 -
int d[MAX_VERTEX_NUM];
int citynum=0;
2.系统主要子程序详细设计
(1)主函数模块设计
主函数。设定用户操作界面的颜色和大小,调用工作区模块函数。
int main()
{ALGraph G;
int i;
FILE *fp;
system("color 1f");
system("mode con: cols=55 lines=20");
if((fp=fopen("city.txt","r"))==NULL)
{printf("\n-----------------欢迎使用交通咨询系统------------------\n\n");
printf("\t 系统首次运行,请按任意键进行初始化!\n");
getch();
initgraph(&G);
//屏幕颜色设置
}
else if(fgetc(fp)==EOF)
{printf("\n-----------------欢迎使用交通咨询系统------------------\n\n");
printf("\t 系统首次运行,请按任意键进行初始化!\n");
getch();
initgraph(&G);
}
else
CreateGraph(&G);
2、用户咨询\n\t\t
1、管理员管理\n\t\t
system("cls");
printf("\n-----------------欢迎使用交通咨询系统------------------\n");
printf("\t\t 请选择程序功能\n\n");
printf("\t\t
出\n\n");
printf("选择:");
scanf("%d",&i);
getchar();
while(!(i==1||i==2||i==3||i==4))
{printf("输入不明确,请重新输入:");
scanf("%d",&i);
getchar();
3、显示交通系统\n\t\t
4、退
}
while(i!=4)
{switch(i)
{case 1:system("cls");Administer(&G);break;
case 2:system("cls");UserDemand(G);break;
case 3:system("cls");PrintGraph(&G);break;
}
- 5 -
system("cls");
printf("\n-----------------欢迎使用交通咨询系统------------------\n");
printf("\t\t 请选择程序功能\n\n");
printf("\t\t1、管理员管理\n\t\t2、用户咨询\n\t\t3、显示交通系统\n\t\t4、退出\n\n");
printf("选择:");
scanf("%d",&i);
getchar();
while(!(i==1||i==2||i==3||i==4))
{printf("输入不明确,请重新输入:");
scanf("%d",&i);
getchar();
}
}
printf("\n\n\n-----------------感谢使用交通咨询系统------------------");
return 1;
}
(2)管理员管理模块设计
void Administer(ALGraph *G)
{int i;
printf("\n-----------------欢迎使用交通咨询系统------------------\n");
printf("\t\t 请选择管理项目\n\n");
printf("\t
返回上一级菜单\n");
printf("选择:");
scanf("%d",&i);
getchar();
while(!(i==1||i==2||i==3||i==4||i==5))
{printf("输入不明确,请重新输入:");
scanf("%d",&i);
getchar();
1、初始化系统\t\t2、城市编辑\n\t
3、航班编辑\t\t4、车次编辑\n\t
5、
}
while(i!=5)
{ switch(i)
{case 1:initgraph(G);
case 2:cityedit(G);
break;
break;
case 3:flightedit(G);
case 4:trainedit(G);
break;
break;
//初始化交通系统
//城市编辑
//航班编辑
//车次编辑
- 6 -
}
system("cls");
printf("\n-----------------欢迎使用交通咨询系统------------------\n");
3、航班编辑\t\t4、车次编辑\n\t
5、
printf("\t\t 请选择管理项目\n\n");
printf("\t
1、初始化系统\t\t2、城市编辑\n\t
返回上一级菜单\n");
printf("选择:");
scanf("%d",&i);
getchar();
while(!(i==1||i==2||i==3||i==4||i==5))
{printf("输入不明确,请重新输入:");
scanf("%d",&i);
getchar();
}
}
}
(3)用户咨询模块设计
void UserDemand(ALGraph G)
{int i;
printf("\n-----------------欢迎使用交通咨询系统------------------\n");
printf("\t\t 请选择咨询项目\n\n");
printf("\t1、最少旅行费用\t
级菜单\n");
printf("选择:");
scanf("%d",&i);
getchar();
while(i!=4)
{switch(i)
{case 1:DemandDispose(1,G);break;
case 2:DemandDispose(2,G);break;
case 3:DemandDispose(3,G);break;
2、最短旅行时间\n\t3、最少中转次数\t
/*最少费用,时间,中转次数*/
}
system("cls");
printf("\n-----------------欢迎使用交通咨询系统------------------\n");
printf("\t\t 请选择咨询项目\n\n");
printf("\t1、最少旅行费用\t
2、最短旅行时间\n\t3、最少中转次数\t
4、返回上一
4、返回上一
级菜单\n");
printf("选择:");
scanf("%d",&i);
getchar();
}
return ;
}
(4)显示城市交通系统
void PrintGraph(ALGraph *G)
{int i,j,k;
ArcNode *q;
- 7 -