1、需要用到多个文件,例如文本文件,文件名stations.txt,保存站点信息,格式可以自行设计,例如:编号 站名。等等
2、设计公交线路所需的存储结构,将文件中的数据读入内存。
3、提供用户操作的菜单和界面实现添加、删除、修改公交、站点、线路信息,注意数据间的关联性。
4、将修改后的信息保存回文件。
5、其他查询操作参见教程。
1、 数据格式**:**
在这个课设中我设计的是两个文件,一个文件用来存放公交车站名的“stations.txt”,一个用来存放公交线路“bus.txt”。
(1)**“stations.txt”**文件的第一行,记录的为公交车站的数量,依次往下,为所存的公交车站名,其格式为:
① 公交车站数
② 公交车站名
③ 公交车站名
(2)**“bus.txt****”**文件的第一行,记录的为公交车每个站之间有几条线路,就是一站算一条线路(例如:公交车从仙来广场到庆丰苑是走了一条线路,从仙来广场到金三角,就要先从仙来广场到庆丰苑,再从庆丰苑到金三角,这样看,是走了两条线路) 第二行开始记录公交名,公交车的一条线路的起点和终点,还有两站之间的距离,其格式为:
① 公交线路数量
② 公交车名 起始站 终点站 距离
③ 公交车名 起始站 终点站 距离
④ 公交车名 起始站 终点站 距离
…………………………
例如:
公交车名 起始站 终点站 距离
105 图书馆 人民政府 432
105 人民政府 万达广场 856
这就说明105路公交车,会经过图书馆–>人民广场–>万达广场。
将文件中的数据读入内存,建立图的存储结构,,以下为存储结构的C语言定义:
typedef int StationsType;//StationsType 定义整形的变量
typedef struct TrafficNode
{
char name[MAX_STRING_NUM]; //公交号
int EndCity; //该有向边指向的顶点在数组中的位置,即该公交站编号
int Number ; //用于记录每站之间的距离
} TrafficNodeDat;
typedef struct VNode
{
StationsType stations;
int BusNum; // 标记下面 Bus 数组里元素个数
TrafficNodeDat Bus[MAX_TRAFFIC_NUM]; // 数组成员为结构体,记录了到达的终点站、距离、和公交号
} VNodeDat;
VNodeDat AdjList[MAX_VERTEX_NUM];
4、 添加公交站:
5、 删除公交站:
6、 添加公交线路:
7、 删除公交:
int ShowMenu()
int SeekStations(char *name) // 寻找公交站
int SearchBus(char *name)// 查询公交站
int InsertStations(char *Name) // 添加公交站
int DelStations(char *Name) // 删除公交站
int SaveSysInfo() // 向程序输入数据
int InsertBus(char *bus, char *StartCity, char *EndStations, int number)//添加公交
int DelPath(char *name)// 删除公交
int InitSysData();
1. 在做课设的时候,起初我设计的是一个公交一次性输入许多路线,这样也十分的符合公交的特性,但是在做到最优路径的是吧,出现了大量的bug,于是我进行了查阅资料,于是我就改成了现在的这样,两站两站的输入信息和存储信息,只要起始站和终点站,这样设计。虽然这样麻烦许多,但是在设计的时候自己对于这种方法掌握的更快一点,于是终于设计出来了这个课设。
2. 这个课设还是有很大的完善空间,在继续最优路径搜索的时候,在某些情况下会出现无法输出的情况,在进行了测试后,发现对于一些不存在的公交站查询的时候,不会报错,同时在输出的时候,不是很人性化,同时该程序的一些地方写的代码十分的繁琐,从而影响了运行速度。这些都是在之后的学习中,需要改进和完善的地方。
#include
#include
#include
#define ERR 0
#define OK 1
#define Dij_MAXN 100
#define MAX_VERTEX_NUM 100
#define MAX_STRING_NUM 100
#define MAX_TRAFFIC_NUM 100
const char StationsFile[] = "stations.txt";
const char BusFile[] = "bus.txt";
typedef int StationsType;//StationsType 定义整形的变量
typedef struct TrafficNode
{
char name[MAX_STRING_NUM]; // 公交号 //MAX_STRING_NUM 最为 10
int EndStations; // 该有向边指向的顶点在数组中的位置,即该公交站编号
int Number ; // 用于记录每站之间的距离
} TrafficNodeDat;
typedef struct VNode
{
StationsType stations;
int BusNum; // 标记下面 Bus 数组里元素个数
TrafficNodeDat Bus[MAX_TRAFFIC_NUM]; // 数组成员为结构体,记录了到达的终点站、距离0、和公交号
} VNodeDat;
VNodeDat AdjList[MAX_VERTEX_NUM];
char StationsName[MAX_VERTEX_NUM][MAX_STRING_NUM]; // 公交站名,采用第一下标为该城市在本程序中的编号
int StationsNum; // 公交站数目
int ShowMenu()
{
printf("\n|****************** 欢迎使用城市交通系统 *******|\n");
printf("\n|------------------1: 添加公交站 --------------|");
printf("\n|------------------2: 删除公交线路 ------------|");
printf("\n|------------------3: 添加交通路线 ------------|");
printf("\n|------------------4: 删除公交 ----------------|");
printf("\n|------------------5: 查询最短的路线 ----------|");
printf("\n|------------------6: 查询公交线路 ------------|");
printf("\n|------------------7: 清除屏幕 ----------------|");
printf("\n|------------------0: 退出 --------------------|");
printf("\n|***********************************************|\n");
printf("\n 请输入你的选择 :");
return 0;
}
int SeekStations(char *name) // 寻找公交站
{
int i;
for (i = 0; i StationsNum)
{
o--;
printf(" 未找到此公交站,请重新输入! ");
return 0;
}
for (i = stations; i < StationsNum - 1; i++)
{
strcpy(StationsName[i], StationsName[i + 1]);
AdjList[i].BusNum = AdjList[i + 1].BusNum;
for (j = 0; j < AdjList[i].BusNum; j++)
{
strcpy(AdjList[i].Bus[j].name, AdjList[i + 1].Bus[j].name);
AdjList[i].Bus[j].EndStations = AdjList[i + 1].Bus[j].EndStations;
AdjList[i].Bus[j].Number = AdjList[i + 1].Bus[j].Number;
}
}
StationsNum--;
}
return 1;
}
int InsertBus(char *bus, char *StartCity, char *EndStations, int number)//添加公交
{
int i, j;
i = SeekStations(StartCity);
j = SeekStations(EndStations);
AdjList[i].Bus[AdjList[i].BusNum].Number = number;
AdjList[i].Bus[AdjList[i].BusNum].EndStations = j;
strcpy(AdjList[i].Bus[AdjList[i].BusNum].name, bus);
AdjList[i].BusNum++; // 公交的数加 1
return 1;
}
int DelPath(char *name)// 删除公交
{
int i, j, flag = 0;
for (i = 0; i
最后:
在本课设中对于车站的输入大家要格外注意,因为个人水平的原因,使用这种方法更让我好理解和进行搜索,在之后的学习中,我会完善该课设,在之后的博客中会进行补充。
如需要完整代码可以点击下面的链接:
数据结构课设城市公交完整代码(c语言)