数据结构课设城市公交查询系统(C语言)

公交线路图


一. 设计要求:

1、需要用到多个文件,例如文本文件,文件名stations.txt,保存站点信息,格式可以自行设计,例如:编号 站名。等等

2、设计公交线路所需的存储结构,将文件中的数据读入内存。

3、提供用户操作的菜单和界面实现添加、删除、修改公交、站点、线路信息,注意数据间的关联性。

4、将修改后的信息保存回文件。

5、其他查询操作参见教程。


二. 设计内容:

1、 数据格式**:**

在这个课设中我设计的是两个文件,一个文件用来存放公交车站名的“stations.txt”,一个用来存放公交线路“bus.txt”。

(1)**“stations.txt”**文件的第一行,记录的为公交车站的数量,依次往下,为所存的公交车站名,其格式为:

① 公交车站数

② 公交车站名

③ 公交车站名

④ 公交车站名
数据结构课设城市公交查询系统(C语言)_第1张图片

(2)**“bus.txt****”**文件的第一行,记录的为公交车每个站之间有几条线路,就是一站算一条线路(例如:公交车从仙来广场到庆丰苑是走了一条线路,从仙来广场到金三角,就要先从仙来广场到庆丰苑,再从庆丰苑到金三角,这样看,是走了两条线路) 第二行开始记录公交名,公交车的一条线路的起点和终点,还有两站之间的距离,其格式为:

① 公交线路数量

② 公交车名 起始站 终点站 距离

③ 公交车名 起始站 终点站 距离

④ 公交车名 起始站 终点站 距离

…………………………
例如:
公交车名 起始站 终点站 距离
105 图书馆 人民政府 432
105 人民政府 万达广场 856
这就说明105路公交车,会经过图书馆–>人民广场–>万达广场。


2、 数据结构**:**

将文件中的数据读入内存,建立图的存储结构,,以下为存储结构的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];


3、 查询公交线路:

当输入公交号后,就会输出公交线路的信息如下图:
数据结构课设城市公交查询系统(C语言)_第2张图片

4、 添加公交站:

输入公交站名存储成功后会输出Save OK
数据结构课设城市公交查询系统(C语言)_第3张图片

5、 删除公交站:

输入公交需要删除的公交站成功会提醒:
数据结构课设城市公交查询系统(C语言)_第4张图片

6、 添加公交线路:

输入所规定的起始,终点站,公交号和两站之间的距离:
数据结构课设城市公交查询系统(C语言)_第5张图片

7、 删除公交:

输入公交号删除成功则输出OK:
数据结构课设城市公交查询系统(C语言)_第6张图片


二. 系统子程序及功能设计**:**

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语言)

你可能感兴趣的:(数据结构,算法)