數據結構課設城市公交完整代碼(c語言)

以下是城市公交的完整代碼,如果需要實驗報告的可以點擊下面的鏈接:
數據結構課設城市公交查詢系統(C語言)

代碼如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#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 1;
}

int SeekStations(char *name) // 尋找公交站
{
    int i;
    for (i = 0; i<StationsNum; i++)
    {
        if (strcmp(name, StationsName[i]) == 0) // 比較函數,若相等,則返回 i 值
        {
            return i;
        }
    }
    return -1;
}


int SaveSysInfo() // 向程序輸入數據
{
    FILE *fp;
    int i, j, total;
    fp = fopen(StationsFile, "w"); // 打開 StationsFile 文檔
    fprintf(fp, "%d\n", StationsNum); // 往文檔中寫公交站的數量
    for (i = 0; i<StationsNum; i++)
    {
        fprintf(fp, "%s\n", StationsName[i]); // 往文檔中寫公交站的名字
    }
    fclose(fp);// 將 StationsFile 文檔關閉
    total = 0;
    fp = fopen(BusFile, "w");// 打開 BusFile 文檔
    for (i = 0; i<StationsNum; i++) // 計算公交的數量
    {
        total += AdjList[i].BusNum;
    }
    fprintf(fp, "%d\n", total); // 往文檔中寫公交的數量
    for (i = 0; i<StationsNum; i++) //
    {
        for (j = 0; j<AdjList[i].BusNum; j++) // 往文檔中寫公交的車次、始發站、終點站
        {
            fprintf(fp, "%s %s %s ", AdjList[i].Bus[j].name,
                                     StationsName[i],
                                     StationsName[AdjList[i].Bus[j].EndStations]);
            fprintf(fp, " %d\n", AdjList[i].Bus[j].Number);// 往文檔中寫
        }
    }
    fclose(fp);

    return 1;
}

int InsertStations(char *Name) // 添加公交站
{
    strcpy(StationsName[StationsNum], Name);
    AdjList[StationsNum].stations = StationsNum;
    AdjList[StationsNum].BusNum = 0;
    StationsNum++;
    return 1;
}

int DelStations(char *Name) // 刪除公交站
{
    int stations, i, j,o=1,k=0;
    stations = SeekStations(Name);
    printf("%s",Name);
    while (true)
    {
        while (strcmp(StationsName[k], Name) != 0)
        {
            k++;
        }
        if (k > 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<StationsNum; i++)
    {
        for (j = 0; j<AdjList[i].BusNum; j++)
            if (strcmp(AdjList[i].Bus[j].name, name) == 0)
            {
                flag = 1;
                break;
            }
        if (flag==0)
        {
            for (; j<AdjList[i].BusNum - 1; j++) // 把刪除的公交後的每個公交都前移一位
            {
                AdjList[i].Bus[j].Number = AdjList[i].Bus[j + 1].Number;
                AdjList[i].Bus[j].EndStations = AdjList[i].Bus[j + 1].EndStations;
                strcpy(AdjList[i].Bus[j].name, AdjList[i].Bus[j + 1].name);
            }
            AdjList[i].BusNum--;
            break;
        }
    }
    return 1;
}

void Dijkstra_Output(int matx[Dij_MAXN][Dij_MAXN], int PreCity[Dij_MAXN], int p_end, int TravelType)
{
    int track[Dij_MAXN];
    int i = 0, j, k, min, tmp, end, num = 0;
    j = p_end;
    track[i++] = j;
    while (PreCity[j] >= 0)
    {
        num += matx[PreCity[j]][j];
        track[i++] = j = PreCity[j];
    }
    printf("\nBus Way:\n");
    printf(" 公交站 \t所坐公交 \n");
    char na[MAX_STRING_NUM];//中間量,用於記錄上一次輸出的公交名字
    if (!TravelType)
    {
        for (i--; i>0; i--)
        {
            printf("%s:   \t", StationsName[track[i]]);
            end = track[i - 1];
            min = 32767;
            for (k = 0; k<AdjList[track[i]].BusNum; k++)
                if (AdjList[track[i]].Bus[k].EndStations == end&&min>AdjList[track[i]].Bus[k].Number)
                {
                    min = AdjList[track[i]].Bus[k].Number;
                    tmp = k;
                }
                if(strcmp(na,AdjList[track[i]].Bus[tmp].name) == 0)
                    printf("  %s\n", AdjList[track[i]].Bus[tmp].name);
                else
                    printf("  %s(請在此站乘坐此輛公交車)\n", AdjList[track[i]].Bus[tmp].name);
                strcpy(na,AdjList[track[i]].Bus[tmp].name);

        }
    }
    printf("\n%s: 已到達目的地!  ", StationsName[track[0]]);
    printf("\n一共需要坐這麼多距離 : %d\n", num);
}

void Dijkstra(int matx[Dij_MAXN][Dij_MAXN], int p_start, int p_end, int TravelType)
{
    int PreCity[Dij_MAXN];
    int i, j, min, pre, pos;
    for (i = 0; i<StationsNum; i++)
    {
        PreCity[i] = -1;
    }
    PreCity[p_start] = -2;
    while (PreCity[p_end] == -1)
    {
        min = -1;
        for (i = 0; i<StationsNum; i++)
            if (PreCity[i] != -1)
            {
                for (j = 0; j<StationsNum; j++)
                    if (PreCity[j] == -1 && matx[i][j]>0 && (min<0 || matx[i][j]<min))
                    {
                        pre = i;
                        pos = j;
                        min = matx[i][j];
                    }
            }
        PreCity[pos] = pre;
    }
    Dijkstra_Output(matx, PreCity, p_end, TravelType);
}

int InitSysData()
{
    FILE *fp;
    int i, j, num, number;
    char stmp1[MAX_STRING_NUM];
    char stmp2[MAX_STRING_NUM];
    char stmp3[MAX_STRING_NUM];
    fp = fopen(StationsFile, "r");
    if (!fp)
    {
        printf("\nError:Cannot Open Stations File...\n");
        return -1;
    }
    fscanf(fp, "%d", &StationsNum);
    for (i = 0; i<StationsNum; i++)
    {
        fscanf(fp, "%s", &StationsName[i]);
        AdjList[i].stations = i;
        AdjList[i].BusNum = 0;
    }
    fclose(fp);
    fp = fopen(BusFile, "r");
    if (!fp)
    {
        printf("\nError:Cannot Open Bus File...\n");
        return -1;
    }
    fscanf(fp, "%d", &num);
    for (i = 0; i<num; i++)
    {
        fscanf(fp, "%s", &stmp1); // 公交的車次
        fscanf(fp, "%s", &stmp2); // 公交的始發站
        fscanf(fp, "%s", &stmp3); // 公交的終點站
        j = SeekStations(stmp2);
        AdjList[j].Bus[AdjList[j].BusNum].EndStations = SeekStations(stmp3); // 將公交的車號、始發站、終點站讀出
        strcpy(AdjList[j].Bus[AdjList[j].BusNum].name, stmp1);
        fscanf(fp, "%d", &number);
        AdjList[j].Bus[AdjList[j].BusNum].Number = number;
        AdjList[j].BusNum++;
    }
    fclose(fp);
    return 1;
}


int CalcMinNum(int StartCity, int EndStations, int TravelType)
{
    int ma[Dij_MAXN][Dij_MAXN];
    int i, j, min, end;
    for (i = 0; i<StationsNum; i++)
        for (j = 0; j<StationsNum; j++)
            ma[i][j] = -1;
    if (TravelType == 0)
    {
        for (i = 0; i<StationsNum; i++)
        {
            min = 32767;
            j = 0;
            while (j<AdjList[i].BusNum)
            {
                min = 32767;
                end = AdjList[i].Bus[j].EndStations;
                while (end == AdjList[i].Bus[j].EndStations&&j<AdjList[i].BusNum)
                {
                    if (AdjList[i].Bus[j].Number<min)
                    {
                        min = AdjList[i].Bus[j].Number;
                    }
                    j++;
                }
                ma[i][end] = min;
            }
        }
    }
    Dijkstra(ma, StartCity, EndStations, TravelType);
    return 1;
}

int SearchBus(char *name)// 查詢公交站
{
    FILE *fp;
    int i, j, num, number;
    char stmp1[MAX_STRING_NUM];
    char stmp2[MAX_STRING_NUM];
    char stmp3[MAX_STRING_NUM];
    int stmp4;
    fp = fopen(BusFile, "r");
    if (!fp)
    {
        printf("\nError:Cannot Open Bus File...\n");
        return -1;
    }
    fscanf(fp, "%d", &num);
    for (i = 0; i<num; i++)
    {
        fscanf(fp, "%s", &stmp1); // 公交的車次
        fscanf(fp, "%s", &stmp2); // 公交的始發站
        fscanf(fp, "%s", &stmp3); // 公交的終點站
        fscanf(fp, "%d", &stmp4); // 公交站之間的距離
        if(strcmp(stmp1,name) == 0)
        {
            printf("%s  %s  %s  %d\n" , stmp1 ,stmp2 ,stmp3 ,stmp4);
        }
    }
    fclose(fp);
    return 1;
}

int main()
{
    char name[MAX_STRING_NUM]; // 公交站名
    char s_city[MAX_STRING_NUM]; // 始發站
    char e_city[MAX_STRING_NUM]; // 終點站
    int Command, number = 1;
    int startcity, endcity, traveltype = 0;
    while (true)
    {
        printf("\n");
        ShowMenu(); // 主菜單
        scanf("%d", &Command);// 輸入選擇
        switch (Command) // 對菜單的內容進行選擇
        {
        case 0: // 退出
            return 0;
        case 1: // 添加公交
            InitSysData(); // 讀出文檔中已存的信息
            printf("\n 輸入公交站名 :");
            scanf("%s", &name); // 輸入城市名
            InsertStations(name); // 將城市插入到數組中
            SaveSysInfo(); // 把公交的信息寫入文檔中
            printf(" Save OK!\n");
            break;
        case 2: // 刪除公交站
            InitSysData(); // 讀出文檔中已有的信息
            printf("\n 輸入公交站名 :");
            scanf("%s", &name);
            DelStations(name); // 將公交刪除
            SaveSysInfo(); // 將處理過的信息寫入文檔中
            printf("Save OK!\n");
            break;
        case 3: // 添加路線
            InitSysData();
            printf(" 起始公交站名 :");
            scanf("%s", &s_city); // 起始站
            printf(" 終點公交站名 :");
            scanf("%s", &e_city); // 終點站
            printf(" 輸入公交號  :");
            scanf("%s", &name);
            printf(" 距離 :");
            scanf("%d", &number);
            InsertBus(name, s_city, e_city, number);
            SaveSysInfo();

            printf(" Save OK!\n");
            break;
        case 4: // 刪除公交
            InitSysData();
            printf(" 輸入需要刪除的公交車名 :");
            scanf("%s", &name);
            DelPath(name); // 將路線進行刪除
            SaveSysInfo();
            printf("Save OK!\n");
            break;
        case 5: // 最小所坐站
            InitSysData();
            printf("\n 起始公交站 :");
            scanf("%s", &name);
            startcity = SeekStations(name);
            if (startcity<0)
            {
                printf("Error station Name:No such station!\n");
                break;
            }
            printf(" 終點公交站 :");
            scanf("%s", &name);
            endcity = SeekStations(name);
            if (endcity<0)
            {
                printf("Error station Name:No such station!\n");
                break;
            }
            CalcMinNum(startcity, endcity, traveltype); // 計算最少的站數
            printf("\n");
            break;
        case 6:
            InitSysData();
            printf(" 輸入公交號 :");
            scanf("%s", &name);
            SearchBus(name);
            break;
        case 7:
            system("cls");// 清除屏幕
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章