火车管理系统

一、项目描述

       编制一个程序,火车售票系统包括用户及管理部分,能实现录票、订票、退票、查看信息、修改信息等等功能。

二、功能解析

        该程序分为用户端及管理端两部分。用户端可以进行用户注册和用户登录,用户登录之后可以修改自己的用户信息及订票、退票、查看火车信息等等功能。管理端可以通过账号(123456)及密码(csdn)登录,登录之后可以查看火车信息,录入火车信息及查看用户信息等等功能。

三、编译器

该程序代码在Visual Studio 2022编译器中可以正确运行,在Dev-C++编译器中可能存在部分代码格式错误,需要修改才能运行。

四、部分运行图

 

 

 

 

五、代码部分 

(1)第一部分

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#define _CRT_SECURE_NO_WARNINGS 
//火车信息
typedef struct {
	int ticket;//票数
	int money;//价格
	char StartingTime[10];//火车出发时间
	char ArriveTime[10];//火车到达时间
	char TrainID[10];//火车编号
	char From[100];//火车起始站
	char To[100];//火车终点站
}Train;

typedef struct {
	char id[6];
	int bycount;
}Buy;
//用户信息
typedef struct {
	char Name[25];//用户姓名
	char Gender[5];//用户性别
	char ID[20];//用户身份证号码
	char username[20];//用户名
	char password[20];//用户登录密码
	char PhoneNumber[16];//用户手机号码
	int count;//用户订票数量
	Buy u_TrainID[100];
}User;
//定义链表
typedef struct TrainNode {
	Train data;
	struct TrainNode* next;
}TN;
//定义链表
typedef struct UserNode {
	User data;
	struct UserNode* next;
}UN;

void clearInputBuffer();
void nowTime();
void goBack(UN* u, UN* tail, TN* s, TN* rear, int* currentPos);
void user(UN* u, UN* tail, TN* s, TN* rear, int* currentPos);
void user_register(UN* u, UN* tail, TN* s, TN* rear, int* currentPos);
void user_registert_name(UN* p, UN* u, UN* tail, TN* s, TN* rear, int* currentPos);
void user_register_id(UN* p, UN* u);
void user_register_phoneNumber(UN* p, UN* u);
void user_register_username(UN* p);
void user_register_password(UN* p);
void user_register_passworeAgain(UN* p, UN* tail, UN* u, TN* s, TN* rear, int* currentPos);
void user_login(UN* u, UN* tail, TN* s, TN* rear, int* currentPos);
void user_login_accountNumber(UN* a, UN* tail, UN* u);
void user_login_password(UN* a);
void user_interface(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos);
void user_interface_changeUsername(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos);
void user_interface_changePhonenumber(UN* a, UN* u, UN* g, UN* tail, TN* s, TN* rear, int* currentPos);
void user_interface_changePassword(UN* a, UN* u, UN* g, UN* tail, TN* s, TN* rear, int* currentPos);
void user_interface_changePassword_two(UN* op, UN* g, UN* tail, UN* u, TN* s, TN* rear, int* currentPos);
void user_interface_buyTrainTicket(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos);
void user_interface_buyTrainTicket_functionOne(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos);
void user_interface_buyTrainTicket_functionTwo(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos);
void user_interface_buyTrainTicket_functionTwo_1(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos);
void user_interface_checkTrainTicket(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos);
void user_interface_returnTrainTicket(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos);
void manager(UN* u, UN* tail, TN* s, TN* rear, int* currentPos);
void manager_login(UN* u, UN* tail, TN* s, TN* rear, int* currentPos);
void manager_login_acount(char* account, char* ao);
void manager_login_password(char* managerPassword, char* bo);
void manager_interface(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_enterTrain(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_enterTrain_trainId(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword, int* currentPos);
void manager_interface_enterTrain_trainFrom(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword);
void manager_interface_enterTrain_trainTo(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword);
void manager_interface_enterTrain_trainStartingTime(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword);
void manager_interface_enterTrain_trainArriveTime(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword);
void manager_interface_enterTrain_trainMoney(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword);
void manager_interface_enterTrain_trainTicket(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword, int* currentPos);
void manager_interface_checkTrain(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_checkTrain_functionOne(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_checkTrain_functionTwo(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_checkTrain_functionThree(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_checkTrain_functionFour(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_reviseTrain(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_reviseTrain_Id(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword, int* currentPos);
void manager_interface_reviseTrain_From(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword);
void manager_interface_reviseTrain_To(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword);
void manager_interface_reviseTrain_StartingTime(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword);
void manager_interface_reviseTrain_ArriveTime(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword);
void manager_interface_reviseTrain_money(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword);
void manager_interface_reviseTrain_ticket(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword, int* currentPos);
void manager_interface_deleteTrain(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_userInformation(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_userInformation_functionOne(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_userInformation_functionTwo(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);
void manager_interface_userInformation_functionThree(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword, int* currentPos);

(2)第二部分

#define _CRT_SECURE_NO_WARNINGS 
#include"head.h"

void clearInputBuffer()
{
    int c = 0;
    while ((c = getchar()) != '\n' && c != EOF)
    {
        c = 0;
    }
}

void nowTime()
{
    time_t rawtime;
    struct tm* timeinfo;
    time(&rawtime);
    timeinfo = localtime(&rawtime);
    printf("\t%04d-%02d-%02d\t", timeinfo->tm_year + 1900, timeinfo->tm_mon + 1, timeinfo->tm_mday);
    char* weekdays[] = { "周日", "周一", "周二", "周三", "周四", "周五", "周六" };
    printf("%s\t", weekdays[timeinfo->tm_wday]);
    printf(" %02d:%02d:%02d\t\n", timeinfo->tm_hour, timeinfo->tm_min, timeinfo->tm_sec);
    return;
}

void goBack(UN* u, UN* tail, TN* s, TN* rear, int* currentPos)
{
    int a = 0;
    system("cls");
    system("color 0A");
    nowTime();
    printf("\t*********************************\t\n");
    printf("\t* 欢 迎 使 用 火 车 购 票 系 统 *\t\n");
    printf("\t*********************************\t\n");
    printf("\t*       1、进入客户端           *\t\n");
    printf("\t*       2、进入管理端           *\t\n");
    printf("\t*       3、直接退出系统         *\t\n");
    printf("\t*********************************\t\n");
    printf("\t请输入您的选择:");
    clearInputBuffer();
    while (scanf("%d", &a) != 1)
    {
        system("cls");
        system("color 0C");
        printf("\t输入错误,请重新输入!\n");
        Sleep(1000);
        goBack(u, tail, s, rear, currentPos);
        return;
    }
    if (a == 1)
    {
        user(u, tail, s, rear, currentPos);
        return;
    }
    else if (a == 2)
    {
        manager(u, tail, s, rear, currentPos);
        return;
    }
    else if (a == 3)
    {
        system("cls");
        system("color 09");
        printf("\t欢迎下次使用!\n");
        Sleep(1000);
        exit(0);
    }
    else
    {
        system("cls");
        system("color 0C");
        printf("\t输入错误,请重新输入!\n");
        Sleep(1000);
        goBack(u, tail, s, rear, currentPos);
        return;
    }
}

void user(UN* u, UN* tail,TN* s,TN* rear,int* currentPos)
{
    int b = 0;
    system("cls");
    system("color 0A");
    nowTime();
    printf("\t*********************************\t\n");
    printf("\t*     客       户       端      *\t\n");
    printf("\t*********************************\t\n");
    printf("\t*        1、用户注册            *\t\n");
    printf("\t*        2、用户登录            *\t\n");
    printf("\t*        3、返回上一级          *\t\n");
    printf("\t*        4、直接退出系统        *\t\n");
    printf("\t*********************************\t\n");
    printf("\t请输入您的选择:");
    while (scanf("%d", &b) != 1)
    {
        system("cls");
        system("color 0C");
        printf("\t输入错误,请重新输入!\n");
        Sleep(1000);
        clearInputBuffer();
        user(u, tail, s, rear, currentPos);
        return;
    }
    if (b == 1)
    {
        user_register(u, tail, s, tail, currentPos);
        return;
    }
    else if (b == 2)
    {
        user_login(u, tail, s, rear, currentPos);
        return;
    }
    else if (b == 3)
    {
        goBack(u, tail, s, rear, currentPos);
        return;
    }
    else if (b == 4)
    {
        system("cls");
        system("color 09");
        printf("\t欢迎下次使用!\n");
        Sleep(1000);
        exit(0);
    }
    else if (b != 1 && b != 2 && b != 3 && b != 4)
    {
        system("cls");
        system("color 0C");
        printf("\t输入错误,请重新输入!\n");
        Sleep(1000);
        user(u, tail, s, rear, currentPos);
        return;
    }
}

void user_register(UN* u, UN* tail,TN* s,TN* rear,int* currentPos)
{
    int a = 0;
    UN* p;
    p = (UN*)malloc(sizeof(UN));
    if (p == NULL)
    {
        system("color 0C");
        printf("操作失败,自动返回上一级!");
        Sleep(2000);
        user(u, tail, s, rear, currentPos);
        return;
    }
    system("cls");
    system("color 0A");
    nowTime();
    printf("\t*********************************\t\n");
    printf("\t*       用   户   注   册       *\t\n");
    printf("\t*********************************\t\n");
    user_registert_name(p, u, tail, s, rear, currentPos);
    user_register_id(p, u);
    user_register_phoneNumber(p, u);
    user_register_username(p);
    user_register_password(p);
    user_register_passworeAgain(p, tail, u,s,rear, currentPos);
}

void user_registert_name(UN*p,UN*u,UN*tail,TN* s,TN* rear,int* currentPos)
{
    int a = 0;
    clearInputBuffer();
    printf("\n\t请输入您的姓名(中文):");
    scanf("%s", p->data.Name);
    for (int i = 0; p->data.Name[i]!='\0'; i++)
    {
        if (p->data.Name[i] >= 32 && p->data.Name[i] <= 127)
        {
            printf("\n\t您输入的姓名格式错误,请重新输入。\n");
            user_registert_name(p, u, tail,s,rear, currentPos);
            return;
        }
    }
    UN* q;
    q = u->next;
    while (q != NULL)
    {
        if (strcmp(p->data.Name, q->data.Name) == 0)
        {
            printf("\n\t该姓名之前已注册!\n");
            Sleep(1000);
            printf("\n\t正在跳转,请稍等!\n");
            Sleep(2000);
            system("cls");
            system("color 0A");
            while (strcmp(p->data.Name, q->data.Name) == 0)
            {
                nowTime();
                printf("\t*********************************\t\n");
                printf("\t*   1、前往客户端登录入口登录   *\t\n");
                printf("\t*   2、重新注册                 *\t\n");
                printf("\t*   3、返回客户端               *\t\n");
                printf("\t*   4、直接退出系统             *\t\n");
                printf("\t*********************************\t\n");
                printf("\t请输入您的选择:");
                clearInputBuffer();
                scanf("%d", &a);
                if (a == 1)
                {
                    user_login(u, tail, s, rear, currentPos);
                    free(p);
                    free(q);
                    return;
                }
                else if (a == 2)
                {
                    free(p);
                    user_register(u, tail, s, rear, currentPos);
                    free(q);
                    return;
                }
                else if (a == 3)
                {
                    free(p);
                    user(u, tail, s, rear, currentPos);
                    free(q);
                    return;
                }
                else if (a == 4)
                {
                    system("cls");
                    system("color 09");
                    printf("\t欢迎下次使用!\n");
                    Sleep(1000);
                    exit(0);
                }
                else
                {
                    system("cls");
                    system("color 0C");
                    printf("\n\t输入错误,请重新输入!\n");
                    Sleep(1000);
                    system("cls");
                    system("color 0A");
                }
            }
        }
        q = q->next;
    }
}

void user_register_id(UN* p,UN* u)
{
    clearInputBuffer();
    printf("\n\t请输入您的身份证号码:");
    scanf("%s", p->data.ID);
    int length = 0;
    int l = 0;
    length = strlen(p->data.ID);
    if (length != 18)
    {
        printf("\n\t您输入的身份证号码长度错误,请重新输入。\n");
        user_register_id(p, u);
        return;
    }
    for (int i = 0; i < 17; i++)
    {
        if (p->data.ID[i] < '0' || p->data.ID[i] > '9')
        {
            printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
            user_register_id(p, u);
            return;
        }
    }
    if (p->data.ID[17] != 'X' && (p->data.ID[17] < '0' || p->data.ID[17] > '9'))
    {
        printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
        user_register_id(p, u);
        return;
    }
    char province_code[3];
    strncpy(province_code, p->data.ID, 2);
    province_code[2] = '\0';
    int code = atoi(province_code);
    if (code < 11 || code > 91)
    {
        printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
        user_register_id(p, u);
        return;
    }
    char year[5], month[3], day[3];
    strncpy(year, p->data.ID + 6, 4);
    year[4] = '\0';
    strncpy(month, p->data.ID + 10, 2);
    month[2] = '\0';
    strncpy(day, p->data.ID + 12, 2);
    day[2] = '\0';
    int y = atoi(year);
    int m = atoi(month);
    int d = atoi(day);
    if (y < 1900 || y > 2021 || m < 1 || m > 12 || d < 1 || d > 31)
    {
        printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
        user_register_id(p, u);
        return;
    }
    int weights[17] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
    char checksum[12] = "10X98765432";
    int sum = 0;
    for (int z = 0; z < 17; z++)
    {
        sum += (p->data.ID[z] - '0') * weights[z];
    }
    int remainder = sum % 11;
    if (p->data.ID[17] != checksum[remainder])
    {
        printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
        user_register_id(p, u);
        return;
    }
    UN* a;
    a = u->next;
    while (a != NULL)
    { 
        if (strcmp(p->data.ID, a->data.ID) == 0)
        {
            printf("\n\t您输入的身份证号码已注册,请重新输入。\n");
            user_register_id(p, u);
            return;
        }
        a = a->next;
    }
    free(a);
    int gender_code = 0;
    gender_code = p->data.ID[16] - '0';
    if (gender_code % 2 == 0)
    {
        printf("\n\t性别:女\n");
        char woman[3] = "女";
        memcpy(p->data.Gender,woman, sizeof(woman));
        p->data.Gender[3] = '\0';
    }
    else
    {
        printf("\n\t性别:男\n");
        char man[3] = "男";
        memcpy(p->data.Gender, man, sizeof(man));
        p->data.Gender[3] = '\0';
    }
}

void user_register_phoneNumber(UN* p,UN* u)
{
    clearInputBuffer();
    printf("\n\t请输入您的电话号码:");
    scanf("%s", p->data.PhoneNumber);
    int length = 0;
    length = strlen(p->data.PhoneNumber);
    if (length != 11) 
    {
        printf("\n\t您输入的电话号码格式错误,请重新输入。\n");
        user_register_phoneNumber(p, u);
        return;
    }
    for (int i = 0; i < length; i++) 
    {
        if (p->data.PhoneNumber[i] < '0' || p->data.PhoneNumber[i] > '9') 
        {
            printf("\n\t您输入的电话号码格式错误,请重新输入。\n");
            user_register_phoneNumber(p, u);
            return;
        }
    }
    UN* a;
    a = u->next;
    while (a != NULL)
    {
        if (strcmp(p->data.PhoneNumber, a->data.PhoneNumber) == 0)
        {
            printf("\n\t您输入的电话号码已注册,请重新输入。\n");
            user_register_phoneNumber(p, u);
            return;
        }
        a = a->next;
    }
    free(a);
}

void user_register_username(UN* p)
{
    clearInputBuffer();
    printf("\n\t请输入您的用户名(中文):");
    scanf("%s", p->data.username);
    int length = 0;
    length = strlen(p->data.username);
    while (length > 12)
    {
        printf("\n\t您输入的用户名长度大于6,请重新输入。\n");
        user_register_username(p);
        return;
    }
    for (int i = 0; i <= length; i++)
    {
        if (p->data.username[i] >= 32 && p->data.username[i] <= 127)
        {
            printf("\n\t您输入的用户名格式错误,请重新输入。\n");
            user_register_username(p); 
            return;
        }
    }
}

void user_register_password(UN* p)
{
    clearInputBuffer();
    printf("\n\t请输入您账号的登录密码(数/英/数英):");
    scanf("%s", p->data.password);
    int length = 0;
    length = strlen(p->data.password);
    if (length > 20)
    {
        printf("\n\t您输入的登录密码长度大于20,请重新输入。\n");
        user_register_password(p);
        return;
    }
    for (int i = 0; p->data.password[i] != '\0'; i++)
    {
        if (!((p->data.password[i] >= '0' && p->data.password[i] <= '9') || (p->data.password[i] >= 'A' && p->data.password[i] <= 'Z') || (p->data.password[i] >= 'a' && p->data.password[i] <= 'z')))
        {
            printf("\n\t您输入的登录密码格式错误,请重新输入。\n");
            user_register_password(p);
            return;
        }
    }
}

void user_register_passworeAgain(UN* p,  UN* tail, UN* u,TN* s,TN* rear,int* currentPos)
{
    UN* k;
    k = (UN*)malloc(sizeof(UN));
    if (k == NULL)
    {
        system("color 0C");
        printf("操作失败,自动返回上一级!");
        Sleep(2000);
        user(u, tail,s,rear, currentPos);
        return;
    }
    clearInputBuffer();
    printf("\n\t请输入您账号的确认密码:");
    scanf("%s", k->data.password);
    int length = 0;
    length = strlen(k->data.password);
    if (length > 20)
    {
        printf("\n\t您输入的确认密码长度大于20,请重新输入。\n");
        user_register_passworeAgain(p, tail, u, s, rear, currentPos);
        return;
    }
    for (int i = 0; k->data.password[i] != '\0'; i++)
    {
        if (!((k->data.password[i] >= '0' && k->data.password[i] <= '9') || (k->data.password[i] >= 'A' && k->data.password[i] <= 'Z') || (k->data.password[i] >= 'a' && k->data.password[i] <= 'z')))
        {
            printf("\n\t您输入的登录密码格式错误,请重新输入。\n");
            user_register_passworeAgain(p, tail, u, s, rear, currentPos);
            return;
        }
    }
    if (strcmp(k->data.password, p->data.password) == 0)
    {
        if (u->next == NULL)
        {
            tail = u;
        }
        p->next = NULL;
        tail->next = p;
        tail = p;
        memset(&p->data.u_TrainID, 0, sizeof(p->data.u_TrainID));
        memset(&p->data.u_TrainID, 0, sizeof(p->data.u_TrainID));
        p->data.count = 0;
        printf("\n\t注册成功!");
        printf("\t时间:");
        nowTime();
        printf("\n\n\t自动返回上一级。");
        Sleep(2000);
        user(u, tail, s, rear, currentPos);
        free(k);
        return;
    }
    else if (strcmp(k->data.password, p->data.password) != 0)
    {
        printf("\n\t确认密码与登录密码不同,请重新输入确认密码。\n");
        user_register_passworeAgain(p, tail, u, s, rear, currentPos);
        return;
    }
}

void user_login(UN* u, UN* tail,TN* s,TN* rear,int* currentPos)
{
    UN* a;
    a = (UN*)malloc(sizeof(UN));
    if (a == NULL)
    {
        system("color 0C");
        printf("操作失败,自动返回用户端!");
        Sleep(2000);
        user(u, tail,s,rear, currentPos);
        return;
    }
    system("cls");
    system("color 0A");
    nowTime();
    printf("\t*********************************\t\n");
    printf("\t*       用   户   登   录       *\t\n");
    printf("\t*********************************\t\n");
    user_login_accountNumber(a, tail, u);
    user_login_password(a);
    UN* g;
    g = u->next;
    while (g != NULL)
    {
        if (strcmp(g->data.PhoneNumber, a->data.PhoneNumber) == 0 && strcmp(g->data.password, a->data.password) == 0)
        {
            system("cls");
            system("color 09");
            printf("\n\t登录成功!");
            printf("\n\t正在进入用户界面,请稍等!");
            Sleep(2000);
            system("cls");
            system("color 0A");
            printf("\n\t欢迎 %s 用户登录\n", g->data.username);
            Sleep(2000);
            user_interface(a, u, tail, g, s, rear, currentPos);
            return;
        }
        g = g->next;
    }
    printf("\n\t账号或者密码输入错误。\n");
    free(g);
    free(a);
    Sleep(1000);
    printf("\n\t正在跳转,请稍等!\n");
    Sleep(2000);
    int h = 0;
    while (h < '1' || h>'2')
    {
        system("cls");
        system("color 0A");
        printf("\t*********************************\t\n");
        printf("\t*         1、重新输入           *\t\n");
        printf("\t*         2、返回用户端         *\t\n");
        printf("\t*********************************\t\n");
        printf("\t请输入您的选择:");
        clearInputBuffer();
        scanf("%d", &h);
        if (h == 1)
        {
            user_login(u, tail, s, rear, currentPos);
            return;
        }
        else if (h == 2)
        {
            user(u, tail,s,rear, currentPos);
            return;
        }
        else
        {
            system("color 0C");
            printf("\n\t输入错误,请重新输入!\n");
            Sleep(1000);
            system("cls");
            system("color 0A");
        }
    }
}

void user_login_accountNumber(UN* a, UN* tail, UN* u)
{
    printf("\n\t请输入您的手机号:");
    clearInputBuffer();
    scanf("%s", a->data.PhoneNumber);
    int length = 0;
    length = strlen(a->data.PhoneNumber);
    if (length != 11)
    {
        printf("\n\t您输入的电话号码格式错误,请重新输入。\n");
        user_login_accountNumber(a, tail, u);
        return;
    }
    for (int i = 0; i < length; i++)
    {
        if (a->data.PhoneNumber[i] < '0' || a->data.PhoneNumber[i] > '9')
        {
            printf("\n\t您输入的电话号码格式错误,请重新输入。\n");
            user_login_accountNumber(a, tail, u);
            return;
        }
    }
}

void user_login_password(UN* a)
{
    printf("\n\t请输入您的密码:");
    clearInputBuffer();
    scanf("%s", a->data.password);
    int length = 0;
    length = strlen(a->data.password);
    if (length > 20)
    {
        printf("\n\t您输入的登录密码长度大于20,请重新输入。\n");
        user_login_password(a);
        return;
    }
    for (int i = 0; a->data.password[i] != '\0'; i++)
    {
        if (!((a->data.password[i] >= '0' && a->data.password[i] <= '9') || (a->data.password[i] >= 'A' && a->data.password[i] <= 'Z') || (a->data.password[i] >= 'a' && a->data.password[i] <= 'z')))
        {
            printf("\n\t您输入的登录密码格式错误,请重新输入。\n");
            user_login_password(a);
            return;
        }
    }
}

void user_interface(UN* a, UN* u, UN* tail,UN* g,TN* s,TN* rear, int* currentPos)
{
    system("cls");
    system("color 0A");
    int h = 0;
    while (h < '1' || h > '9')
    {
        nowTime();
        printf("\t*********************************\t\n");
        printf("\t*       用   户   界   面       *\t\n");
        printf("\t*********************************\t\n");
        printf("\t*        1、更改用户名          *\t\n");
        printf("\t*        2、更改电话号码        *\t\n");
        printf("\t*        3、更改登录密码        *\t\n");
        printf("\t*        4、购买列车票          *\t\n");
        printf("\t*        5、查看我的列车票      *\t\n");
        printf("\t*        6、退掉我的列车票      *\t\n");
        printf("\t*        7、重新登录            *\t\n");
        printf("\t*        8、返回用户端          *\t\n");
        printf("\t*        9、直接退出系统        *\t\n");
        printf("\t*********************************\t\n");
        printf("\t请输入您的选择:");
        clearInputBuffer();
        scanf("%d", &h);
        if (h == 1)
        {
            user_interface_changeUsername(a, u, tail, g,s,rear, currentPos);
            return;
        }
        else if (h == 2)
        {
            user_interface_changePhonenumber(a, u, g, tail,s,rear,currentPos);
            return;
        }
        else if (h == 3)
        {
            user_interface_changePassword(a, u, g, tail, s, rear, currentPos);
            return;
        }
        else if (h == 4)
        {
            user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
            return;
        }
        else if (h == 5)
        {
            user_interface_checkTrainTicket(a, u, tail, g, s, rear, currentPos);
            return;
        }
        else if (h == 6)
        {
            user_interface_returnTrainTicket(a, u, tail, g, s, rear, currentPos);
            return;
        }
        else if (h == 7)
        {
            user_login(u, tail, s, rear, currentPos);
            free(a);
            return;
        }
        else if (h == 8)
        {
            user(u, tail,s,rear, currentPos);
            free(a);
            return;
        }
        else if (h == 9)
        {
            system("cls");
            system("color 09");
            printf("\t欢迎下次使用!\n");
            Sleep(1000);
            exit(0);
        }
        else
        {
            system("cls");
            system("color 0C");
            printf("\n\t输入错误,请重新输入!\n");
            Sleep(1000);
            system("cls");
            system("color 0A");
        }
    }
}

void user_interface_changeUsername(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear,int* currentPos)
{
    UN* o;
    o = (UN*)malloc(sizeof(UN));
    if (o == NULL)
    {
        system("color 0C");
        printf("操作失败,自动返回用户界面!");
        Sleep(2000);
        user_interface(a, u, tail, g,s,rear, currentPos);
        return;
    }
    system("cls");
    system("color 0A");
    printf("\t**********************************\t\n");
    printf("\t*   用  户  名  更  改  界  面   *\t\n");
    printf("\t**********************************\t\n");
    printf("\n\t当前用户名为:%s", g->data.username);
    printf("\n\n\t请输入您要更改的用户名:");
    clearInputBuffer();
    scanf("%s", o->data.username);
    int length = 0;
    length = strlen(o->data.username);
    while (length > 12)
    {
        printf("\n\t您输入的用户名长度大于20,请重新输入。\n");
        user_interface_changeUsername(a, u, tail, g, s, rear, currentPos);
        return;
    }
    for (int i = 0; i <= length; i++)
    {
        if (o->data.username[i] >= 32 && o->data.username[i] <= 127)
        {
            printf("\n\t您输入的用户名格式错误,请重新输入。\n");
            Sleep(2000);
            user_interface_changeUsername(a, u, tail, g, s, rear, currentPos);
            return;
        }
    }
    if (strcmp(o->data.username, g->data.username) == 0)
    {
        printf("\n\t您要更改的用户名与原用户名相同。\n");
        printf("\n\t自动返回上一级。");
        Sleep(2000);
        user_interface(a, u, tail, g, s, rear, currentPos);
        free(o);
        return;
    }
    else
    {
        memcpy(g->data.username, o->data.username, sizeof(o->data.username));
        printf("\n\t用户名更改成功。\n");
        printf("\n\t自动返回上一级。\n");
        Sleep(2000);
        user_interface(a, u, tail, g, s, rear, currentPos);
        free(o);
        return;
    }
}

void user_interface_changePhonenumber(UN* a, UN* u,UN* g,UN*tail,TN* s,TN* rear,int* currentPos)
{
    UN* o;
    o = (UN*)malloc(sizeof(UN));
    if (o == NULL)
    {
        system("color 0C");
        printf("操作失败,自动返回用户界面!");
        Sleep(2000);
        user_interface(a, u, tail, g, s, rear, currentPos);
        return;
    }
    system("cls");
    system("color 0A");
    printf("\t*************************************\t\n");
    printf("\t*   电  话  号  码  更  改  界  面   *\t\n");
    printf("\t*************************************\t\n");
    printf("\n\t当前电话号码为:%s",g->data.PhoneNumber);
    printf("\n\n\t请输入您要更改的电话号码:");
    clearInputBuffer();
    scanf("%s", o->data.PhoneNumber);
    int length = 0;
    length = strlen(o->data.PhoneNumber);
    if (length != 11)
    {
        printf("\n\t您输入的电话号码格式错误,请重新输入。\n");
        user_interface_changePhonenumber(a, u, g, tail, s, rear, currentPos);
        free(o);
        return;
    }
    for (int i = 0; i < length; i++)
    {
        if (o->data.PhoneNumber[i] < '0' || o->data.PhoneNumber[i] > '9')
        {
            printf("\n\t您输入的电话号码格式错误,请重新输入。\n");
            user_interface_changePhonenumber(a, u, g, tail, s, rear, currentPos);
            free(o);
            return;
        }
    }
    if (strcmp(o->data.PhoneNumber, g->data.PhoneNumber) == 0)
    {
        int h = 0;
        printf("\n\t您要更改的电话号码与原电话号码相同。\n");
        printf("\n\t正在跳转,请稍后。\n");
        Sleep(2000);
        while (h < '1' || h>'2')
        {
            system("cls");
            system("color 0A");
            printf("\t*********************************\t\n");
            printf("\t*         1、重新输入           *\t\n");
            printf("\t*         2、返回用户界面       *\t\n");
            printf("\t*********************************\t\n");
            printf("\t请输入您的选择:");
            clearInputBuffer();
            scanf("%d", &h);
            if (h == 1)
            {
                user_interface_changePhonenumber(a, u, g, tail, s, rear, currentPos);
                free(o);
                return;
            }
            else if (h == 2)
            {
                user_interface(a, u, tail, g, s, rear, currentPos);
                free(o);
                return;
            }
            else
            {
                system("color 0C");
                printf("\n\t输入错误,请重新输入!\n");
                Sleep(1000);
                system("cls");
                system("color 0A");
            }
        }
    }
    UN* r;
    r = u->next;
    while (r != NULL)
    {
        if (strcmp(o->data.PhoneNumber, r->data.PhoneNumber) == 0)
        {
            int t = 0;
            printf("\n\t您输入的电话号码已注册。\n");
            printf("\n\t正在跳转,请稍后。\n");
            Sleep(2000);
            while (t < '1' || t>'2')
            {
                system("cls");
                system("color 0A");
                printf("\t*********************************\t\n");
                printf("\t*         1、重新输入           *\t\n");
                printf("\t*         2、返回用户界面       *\t\n");
                printf("\t*********************************\t\n");
                printf("\t请输入您的选择:");
                clearInputBuffer();
                scanf("%d", &t);
                if (t == 1)
                {
                    user_interface_changePhonenumber(a, u, g, tail,s,rear, currentPos);
                    free(o);
                    return;
                }
                else if (t == 2)
                {
                    user_interface(a, u, tail, g, s, rear, currentPos);
                    free(o);
                    return;
                }
                else
                {
                    system("color 0C");
                    printf("\n\t输入错误,请重新输入!\n");
                    Sleep(1000);
                    system("cls");
                    system("color 0A");
                }
            }
        }
        r = r->next;
    }
    memcpy(g->data.PhoneNumber, o->data.PhoneNumber, sizeof(o->data.PhoneNumber));
    printf("\n\t电话号码更改成功,请重新登录。\n");
    Sleep(2000);
    user_login(u, tail,s,rear, currentPos);
    free(o);
    free(r);
    return;
}

void user_interface_changePassword(UN* a, UN* u, UN* g, UN* tail,TN* s,TN* rear,int* currentPos)
{
    UN* o;
    o = (UN*)malloc(sizeof(UN));
    if (o == NULL)
    {
        system("color 0C");
        printf("操作失败,自动返回用户界面!");
        Sleep(2000);
        user_interface(a, u, tail, g,s,rear, currentPos);
        return;
    }
    UN* op;
    op = (UN*)malloc(sizeof(UN));
    if (op == NULL)
    {
        system("color 0C");
        printf("操作失败,自动返回用户界面!");
        Sleep(2000);
        user_interface(a, u, tail, g,s,rear, currentPos);
        return;
    }
    system("cls");
    system("color 0A");
    printf("\t**************************************\t\n");
    printf("\t*   登  录  密  码  更  改  界  面   *\t\n");
    printf("\t**************************************\t\n");
    printf("\n\t请输入当前登录密码(数/英/数英):");
    clearInputBuffer();
    scanf("%s", o->data.password);
    int length = 0;
    length = strlen(o->data.password);
    while (length > 20)
    {
        printf("\n\t您输入的登录密码长度大于20,请重新输入。\n");
        user_interface_changePassword(a, u, g, tail, s, rear, currentPos);
        return;
    }
    for (int i = 0; o->data.password[i] != '\0'; i++)
    {
        if (!((o->data.password[i] >= '0' && o->data.password[i] <= '9') || (o->data.password[i] >= 'A' && o->data.password[i] <= 'Z') || (o->data.password[i] >= 'a' && o->data.password[i] <= 'z')))
        {
            printf("\n\t您输入的登录密码格式错误,请重新输入。\n");
            user_interface_changePassword(a, u, g, tail, s, rear, currentPos);
            return;
        }
    }
    if (strcmp(o->data.password, g->data.password) == 0)
    {
        user_interface_changePassword_two(op, g, tail, u,s,rear, currentPos);
        free(o);
        return;
    }
    else
    {
        int h = 0;
        printf("\n\t您输入的登录密码错误。\n");
        Sleep(1000);
        printf("\n\t正在跳转,请稍后。\n");
        Sleep(2000);
        while (h < '1' || h>'2')
        {
            system("cls");
            system("color 0A");
            printf("\t*********************************\t\n");
            printf("\t*         1、重新输入           *\t\n");
            printf("\t*         2、返回用户界面       *\t\n");
            printf("\t*********************************\t\n");
            printf("\t请输入您的选择:");
            clearInputBuffer();
            scanf("%d", &h);
            if (h == 1)
            {
                user_interface_changePassword(a, u, g, tail, s, rear, currentPos);
                free(o);
                free(op);
                return;
            }
            else if (h == 2)
            {
                user_interface(a, u, tail, g,s,rear, currentPos);
                free(o);
                free(op);
                return;
            }
            else
            {
                system("color 0C");
                printf("\n\t输入错误,请重新输入!\n");
                Sleep(1000);
                system("cls");
                system("color 0A");
            }
        }
    }
}

void user_interface_changePassword_two(UN* op,UN* g,UN* tail,UN* u,TN*s,TN* rear,int* currentPos)
{
    printf("\n\n\t请输入您要更改的登录密码(数/英/数英):");
    clearInputBuffer();
    scanf("%s", op->data.password);
    int length = 0;
    length = strlen(op->data.password);
    while (length > 20)
    {
        printf("\n\t您输入的登录密码长度大于20,请重新输入。\n");
        user_interface_changePassword_two(op, g, tail, u, s, rear, currentPos);
        return;
    }
    for (int i = 0; op->data.password[i] != '\0'; i++)
    {
        if (!((op->data.password[i] >= '0' && op->data.password[i] <= '9') || (op->data.password[i] >= 'A' && op->data.password[i] <= 'Z') || (op->data.password[i] >= 'a' && op->data.password[i] <= 'z')))
        {
            printf("\n\t您输入的登录密码格式错误,请重新输入。\n");
            user_interface_changePassword_two(op, g, tail, u, s, rear, currentPos);
            return;
        }
    }
    memcpy(g->data.password, op->data.password, sizeof(op->data.password));
    printf("\n\t登录密码更改成功,请重新登录。\n");
    Sleep(2000);
    user_login(u, tail,s,rear, currentPos);
    free(op);
    return;
}

void user_interface_buyTrainTicket(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear,int* currentPos)
{
    int ao = 0;
    system("cls");
    system("color 0A");
    while (ao < 1 || ao>4)
    {
        nowTime();
        printf("\t*********************************\t\n");
        printf("\t*   列  车  票  购  买  界  面  *\t\n");
        printf("\t*********************************\t\n");
        printf("\t*      1、按列车编号购买        *\t\n");
        printf("\t*      2、按起始站和终点站购买  *\t\n");
        printf("\t*      3、返回用户界面          *\t\n");
        printf("\t*      4、直接退出系统          *\t\n");
        printf("\t*********************************\t\n");
        printf("\t请输入您的选择:");
        clearInputBuffer();
        scanf("%d", &ao);
        if (ao == 1)
        {
            user_interface_buyTrainTicket_functionOne(a, u, tail, g, s, rear, currentPos);
            return;
        }
        else if (ao == 2)
        {
            user_interface_buyTrainTicket_functionTwo(a, u, tail, g, s, rear, currentPos);
            return;
        }
        else if (ao == 3)
        {
            user_interface(a, u, tail, g, s, rear, currentPos);
            return;
        }
        else if (ao = 4)
        {
            system("cls");
            system("color 09");
            printf("\t欢迎下次使用!\n");
            Sleep(1000);
            exit(0);
        }
        else
        {
            system("cls");
            system("color 0C");
            printf("\n\t输入错误,请重新输入!\n");
            Sleep(1000);
            system("cls");
            system("color 0A");
        }
    }
}

void user_interface_buyTrainTicket_functionOne(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos)
{
    system("cls");
    system("color 0A");
    printf("\n\t按列车编号购买\t\n\n");
    TN* f;
    f = s->next;
    if (f == NULL)
    {
        system("color 0A");
        printf("\n\t当前暂无列车信息。\n");
        Sleep(1000);
        printf("\n\t自动返回上一级。\n");
        Sleep(2000);
        user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
        return;
    }
    TN* ao;
    ao = (TN*)malloc(sizeof(TN));
    if (ao == NULL)
    {
        system("cls");
        system("color 0C");
        printf("操作失败,自动返回上一级!");
        Sleep(2000);
        user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
        return;
    }
    printf("\n\t请输入您要购买的列车号:");
    clearInputBuffer();
    scanf("%s", ao->data.TrainID);
    int length = 0;
    length = strlen(ao->data.TrainID);
    if (length != 5)
    {
        printf("\n\t您输入的列车编号长度错误,输入长度应为5,请按照正确编号格式(如:A1234)重新输入。\n");
        user_interface_buyTrainTicket_functionOne(a, u, tail, g, s, rear, currentPos);
        return;
    }
    if (ao->data.TrainID[0] < 'A' || ao->data.TrainID[0]>'Z')
    {
        printf("\n\t您输入的列车编号第一位应为大写英文,请重新输入。\n");
        user_interface_buyTrainTicket_functionOne(a, u, tail, g, s, rear, currentPos);
        return;
    }
    for (int i = 1; ao->data.TrainID[i] != '\0'; i++)
    {
        if (ao->data.TrainID[i] < '0' || ao->data.TrainID[i]>'9')
        {
            printf("\n\t您输入的列车编号后四位应为数字,请重新输入。\n");
            user_interface_buyTrainTicket_functionOne(a, u, tail, g, s, rear, currentPos);
            return;
        }
    }
    while (f != NULL)
    {
        if (strcmp(ao->data.TrainID, f->data.TrainID) == 0)
        {
            printf("\n\t列车编号        起点站        终点站        出发时间        到达时间      价格(元/张)     剩余票数(单位:张)\n");
            printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-18d\n", &f->data.TrainID, &f->data.From, &f->data.To, &f->data.StartingTime, &f->data.ArriveTime, f->data.money, f->data.ticket);
            int many = 0;
            while (many<1 || many>f->data.ticket)
            {
                clearInputBuffer();
                printf("\n\t请输入您要购买的票数(单位:张):");
                scanf("%d", &many);
                if (many<1 || many>f->data.ticket)
                {
                    printf("\n\n输入票数错误,请重新输入!");
                }
                else
                {
                    printf("\n\t***********************************");
                    printf("\n\t*    1、确定购买   2、放弃购买    *");
                    printf("\n\t***********************************");
                    int kaibai = 0;
                    while (kaibai < 1 || kaibai>2)
                    {
                        printf("\n\t请输入您的选择:");
                        clearInputBuffer();
                        scanf("%d", &kaibai);
                        if (kaibai == 1)
                        {
                            
                            if (g->data.u_TrainID[0].id == 0)
                            {
                                strcpy(g->data.u_TrainID[g->data.count].id, f->data.TrainID);
                                g->data.u_TrainID[g->data.count].bycount = g->data.u_TrainID[g->data.count].bycount + many;
                                g->data.count = g->data.count + 1;
                                f->data.ticket = f->data.ticket - many;
                                printf("\n\t购买成功。");
                                Sleep(1000);
                                printf("\n\t自动返回用户界面。\n");
                                Sleep(2000);
                                user_interface(a, u, tail, g, s, rear, currentPos);
                                free(f);
                                free(ao);
                                return;
                            }
                            else
                            {
                                strcpy(g->data.u_TrainID[g->data.count].id, f->data.TrainID);
                                g->data.u_TrainID[g->data.count].bycount = g->data.u_TrainID[g->data.count].bycount + many;
                                g->data.count = g->data.count + 1;
                                f->data.ticket = f->data.ticket - many;
                                printf("\n\t购买成功。");
                                Sleep(1000);
                                printf("\n\t自动返回用户界面。\n");
                                Sleep(2000);
                                user_interface(a, u, tail, g, s, rear, currentPos);
                                free(f);
                                free(ao);
                                return;
                            }
                        }
                        else if (kaibai == 2)
                        {
                            printf("\n\t放弃购买。");
                            Sleep(1000);
                            printf("\n\t自动返回上一级。");
                            Sleep(1000);
                            user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
                            return;
                        }
                        else
                        {
                            printf("\n\t输入错误,请重新输入!\n");
                        }
                    }
                }
           
            }
        }
        f = f->next;
    }
    printf("\n\t暂无列车编号为 %s 的列车", &ao->data.TrainID);
    Sleep(1000);
    printf("\n\t自动返回上一级。\n");
    Sleep(2000);
    user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
    return;
}

void user_interface_buyTrainTicket_functionTwo(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos)
{
    system("cls");
    system("color 0A");
    printf("\n\t按列车起始站与终点站购买\t\n\n");
    TN* f;
    f = s->next;
    if (f == NULL)
    {
        system("color 0A");
        printf("\n\t当前暂无列车信息。\n");
        Sleep(1000);
        printf("\n\t自动返回上一级。\n");
        Sleep(2000);
        user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
        return;
    }
    TN* ao;
    ao = (TN*)malloc(sizeof(TN));
    if (ao == NULL)
    {
        system("cls");
        system("color 0C");
        printf("\n\t操作失败,自动返回上一级!");
        Sleep(2000);
        user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
        return;
    }
    printf("\n\t请输入您要购买的列车票的起始站名称:");
    clearInputBuffer();
    scanf("%s", ao->data.From);
    for (int i = 0; ao->data.From[i] != '\0'; i++)
    {
        if (ao->data.From[i] >= 32 && ao->data.From[i] <= 127)
        {
            printf("\n\t您输入的列车起点站名称格式错误,请重新输入。\n");
            Sleep(2000);
            user_interface_buyTrainTicket_functionTwo(a, u, tail, g, s, rear, currentPos);
            return;
        }
    }
    printf("\n\t请输入您要购买的列车票的终点站名称:");
    clearInputBuffer();
    scanf("%s", ao->data.To);
    for (int i = 0; ao->data.To[i] != '\0'; i++)
    {
        if (ao->data.To[i] >= 32 && ao->data.To[i] <= 127)
        {
            printf("\n\t您输入的列车终点站名称格式错误,请重新输入。\n");
            Sleep(2000);
            user_interface_buyTrainTicket_functionTwo(a, u, tail, g, s, rear, currentPos);
            return;
        }
    }
    if (strcmp(ao->data.From, ao->data.To) == 0)
    {
        printf("\n\t您输入的列车终点站名称与列车起点站名称一致,请重新输入。\n");
        Sleep(2000);
        user_interface_buyTrainTicket_functionTwo(a, u, tail, g, s, rear, currentPos);
        return;
    }
    TN* fo;
    fo = s->next;
    while (fo != NULL)
    {
        if (strcmp(ao->data.From, fo->data.From) == 0 && strcmp(ao->data.To, fo->data.To) == 0)
        {
            printf("\n\t搜寻到以下列车\n\n");
            printf("\n\t列车编号        起点站        终点站        出发时间        到达时间      价格(元/张)     剩余票数(单位:张)\n");
            break;
        }
        fo = fo->next;
    }
    while (f != NULL)
    {
        if (strcmp(ao->data.From, f->data.From) == 0 && strcmp(ao->data.To, f->data.To) == 0)
        {
            printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-18d\n", &f->data.TrainID, &f->data.From, &f->data.To, &f->data.StartingTime, &f->data.ArriveTime, f->data.money, f->data.ticket);
        }
        f = f->next;
    }
    TN* fa;
    fa = s->next;
    while (fa != NULL)
    {
        if (strcmp(ao->data.From, fa->data.From) == 0 && strcmp(ao->data.To, fa->data.To) == 0)
        {
            user_interface_buyTrainTicket_functionTwo_1(a, u, tail, g, s, rear, currentPos);
            return;
        }
        fa = fa->next;
    }
    printf("\n\t暂无 %s——%s 的列车", &ao->data.From,&ao->data.To);
    Sleep(1000);
    printf("\n\t自动返回上一级。\n");
    Sleep(2000);
    user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
    return;
}

void user_interface_buyTrainTicket_functionTwo_1(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos)
{
    TN* f;
    f = s->next;
    if (f == NULL)
    {
        system("color 0A");
        printf("\n\t当前暂无列车信息。\n");
        Sleep(1000);
        printf("\n\t自动返回上一级。\n");
        Sleep(2000);
        user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
        return;
    }
    TN* ao;
    ao = (TN*)malloc(sizeof(TN));
    if (ao == NULL)
    {
        system("cls");
        system("color 0C");
        printf("操作失败,自动返回上一级!");
        Sleep(2000);
        user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
        return;
    }
    printf("\n\t请输入您要购买的列车号:");
    clearInputBuffer();
    scanf("%s", ao->data.TrainID);
    int length = 0;
    length = strlen(ao->data.TrainID);
    if (length != 5)
    {
        printf("\n\t您输入的列车编号长度错误,输入长度应为5,请按照正确编号格式(如:A1234)重新输入。\n");
        user_interface_buyTrainTicket_functionTwo_1(a, u, tail, g, s, rear, currentPos);
        return;
    }
    if (ao->data.TrainID[0] < 'A' || ao->data.TrainID[0]>'Z')
    {
        printf("\n\t您输入的列车编号第一位应为大写英文,请重新输入。\n");
        user_interface_buyTrainTicket_functionTwo_1(a, u, tail, g, s, rear, currentPos);
        return;
    }
    for (int i = 1; ao->data.TrainID[i] != '\0'; i++)
    {
        if (ao->data.TrainID[i] < '0' || ao->data.TrainID[i]>'9')
        {
            printf("\n\t您输入的列车编号后四位应为数字,请重新输入。\n");
            user_interface_buyTrainTicket_functionTwo_1(a, u, tail, g, s, rear, currentPos);
            return;
        }
    }
    while (f != NULL)
    {
        if (strcmp(ao->data.TrainID, f->data.TrainID) == 0)
        {
            printf("\n\t列车编号        起点站        终点站        出发时间        到达时间       价格(元/张)       剩余票数(单位:张)\n");
            printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-18d\n", &f->data.TrainID, &f->data.From, &f->data.To, &f->data.StartingTime, &f->data.ArriveTime, f->data.money, f->data.ticket);
            int many = 0;
            while (many<1 || many>f->data.ticket)
            {
                printf("\n\t当前列车剩余票数:%d", f->data.ticket);
                printf("\n\n\t请输入您需要的购买的列车票数量:");
                clearInputBuffer();
                scanf("%d", &many);
                if (many<1 || many>f->data.ticket)
                {
                    printf("\n\t输入票数错误,请重新输入!\t");
                }
                else
                {
                    printf("\n\t***********************************");
                    printf("\n\t*    1、确定购买   2、放弃购买    *");
                    printf("\n\t***********************************");
                    int kaibai = 0;
                    while (kaibai < 1 || kaibai>2)
                    {
                        printf("\n\t请输入您的选择:");
                        clearInputBuffer();
                        scanf("%d", &kaibai);
                        if (kaibai == 1)
                        {
                            if (g->data.u_TrainID[0].id == 0)
                            {
                                strcpy(g->data.u_TrainID[g->data.count].id, f->data.TrainID);
                                g->data.u_TrainID[g->data.count].bycount = g->data.u_TrainID[g->data.count].bycount + many;
                                g->data.count = g->data.count + 1;
                                f->data.ticket = f->data.ticket - many;
                                printf("\n\t购买成功。");
                                Sleep(1000);
                                printf("\n\t自动返回用户界面。\n");
                                Sleep(2000);
                                user_interface(a, u, tail, g, s, rear, currentPos);
                                free(f);
                                free(ao);
                                return;
                            }
                            else
                            {
                                strcpy(g->data.u_TrainID[g->data.count].id, f->data.TrainID);
                                g->data.u_TrainID[g->data.count].bycount = g->data.u_TrainID[g->data.count].bycount + many;
                                g->data.count = g->data.count + 1;
                                f->data.ticket = f->data.ticket - many;
                                Sleep(1000);
                                printf("\n\t自动返回用户界面。\n");
                                Sleep(2000);
                                user_interface(a, u, tail, g, s, rear, currentPos);
                                free(f);
                                free(ao);
                                return;
                            }
                        }
                        else if (kaibai == 2)
                        {
                            printf("\n\t放弃购买。");
                            Sleep(1000);
                            printf("\n\t自动返回上一级。");
                            Sleep(1000);
                            user_interface_buyTrainTicket(a, u, tail, g, s, rear, currentPos);
                            return;
                        }
                        else
                        {
                            printf("\n\t输入错误,请重新输入!\n");
                        }
                    }
                }

            }
        }
        f = f->next;
    }
}

void user_interface_checkTrainTicket(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos)
{
    system("cls");
    system("color 0A");
    printf("\n\t我的列车票\t\n\n");
    if (g->data.count == 0)
    {
        printf("\n\t您还未购买列车票。\n");
        Sleep(1000);
        printf("\n\t自动返回上一级。\n");
        Sleep(2000);
        user_interface(a, u, tail, g, s, rear, currentPos);
        return;
    }
    printf("\n\t您共有 %d 张不同列车票。\n", g->data.count);
    printf("\n\t列车编号        起点站        终点站        出发时间        到达时间       价格(元/张)       票数(单位:张)\n");
    for (int i = g->data.count; i >= 0; i--)
    {
        TN* f;
        f = s->next;
        while (f != NULL)
        {
            if (strcmp(f->data.TrainID, g->data.u_TrainID[i].id) == 0)
            {
                printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-18d\n", &f->data.TrainID, &f->data.From, &f->data.To, &f->data.StartingTime, &f->data.ArriveTime, f->data.money, &g->data.u_TrainID[i].bycount);
            }
            f = f->next;
        }
    }
    printf("\n\t按任意返回用户界面。\n");
    getch();
    user_interface(a, u, tail, g, s, rear, currentPos);
    return;
}

void user_interface_returnTrainTicket(UN* a, UN* u, UN* tail, UN* g, TN* s, TN* rear, int* currentPos)
{
    system("cls");
    system("color 0A");
    printf("\n\t退订列车票\t\n\n");
    if (g->data.count == 0)
    {
        printf("\n\t您还未购买列车票。\n");
        Sleep(1000);
        printf("\n\t自动返回上一级。\n");
        Sleep(2000);
        user_interface(a, u, tail, g, s, rear, currentPos);
        return;
    }
    TN* ao;
    ao = (UN*)malloc(sizeof(UN));
    if (ao == NULL)
    {
        system("cls");
        system("color 0C");
        printf("\n\t操作失败,自动返回上一级!");
        Sleep(2000);
        user_interface(a, u, tail, g, s, rear, currentPos);
        return;
    }
    for (int i = g->data.count; i >= 0; i--)
    {
        printf("\n\t您当前的列车票有:");
        printf("%s  ", &g->data.u_TrainID[i].id);
    }
    printf("\n\n\t请输入要退掉的列车编号:");
    clearInputBuffer();
    scanf("%s", ao->data.TrainID);
    int length_a = 0;
    length_a = strlen(ao->data.TrainID);
    if (length_a != 5)
    {
        printf("\n\t您输入的列车编号长度错误,输入长度应为5,请按照正确编号格式(如:A1234)重新输入。\n");
        Sleep(1000);
        user_interface_returnTrainTicket(a, u, tail, g, s, rear, currentPos);
        return;
    }
    if (ao->data.TrainID[0] < 'A' || ao->data.TrainID[0]>'Z')
    {
        printf("\n\t您输入的列车编号第一位应为大写英文,请重新输入。\n");
        Sleep(1000);
        user_interface_returnTrainTicket(a, u, tail, g, s, rear, currentPos);
        return;
    }
    for (int i = 1; ao->data.TrainID[i] != '\0'; i++)
    {
        if (ao->data.TrainID[i] < '0' || ao->data.TrainID[i]>'9')
        {
            printf("\n\t您输入的列车编号后四位应为数字,请重新输入。\n");
            Sleep(1000);
            user_interface_returnTrainTicket(a, u, tail, g, s, rear, currentPos);
            return;
        }
    }
    int i = 0;
    i = g->data.count;
    while (i != 0)
    {
        if (strcmp(ao->data.TrainID, g->data.u_TrainID[i].id) == 0)
        {
            int many = 0;
            printf("\n\t列车编号:%s", &g->data.u_TrainID[i].id);
            printf("\n\t票数:%d 张", g->data.u_TrainID[i].bycount);
            printf("\n\n\t请输入您要退的票数:");
            scanf("%d", &many);
            while (many<1 || many>g->data.u_TrainID[i].bycount)
            {
                printf("\n\t您输入的票数无效,请重新输入。");
                printf("\n\n\t请输入您要退的票数:");
                scanf("%d", &many);
            }
            if (many == g->data.u_TrainID[i].bycount)
            {
                for (int io = i; io <= g->data.count; io++)
                {
                    memcpy(g->data.u_TrainID[io].id, g->data.u_TrainID[io + 1].id, sizeof(g->data.u_TrainID[io].id));
                }
                g->data.count = g->data.count - 1;
                g->data.u_TrainID[i].bycount = g->data.u_TrainID[i].bycount - many;
                TN* f;
                f = u->next;
                while (f != NULL)
                {
                    if (strcmp(g->data.u_TrainID[i].id, f->data.TrainID) == 0)
                    {
                        f->data.ticket = f->data.ticket + many;
                        printf("\n\t列车票退订成功。\n");
                        Sleep(1000);
                        printf("\n\t自动返回上一级。\n");
                        Sleep(2000);
                        user_interface(a, u, tail, g, s, rear, currentPos);
                        return;
                    }
                    f = f->next;
                }
            }
            else
            {
                g->data.u_TrainID[i].bycount = g->data.u_TrainID[i].bycount - many;
                TN* fo;
                fo = u->next;
                while (fo != NULL)
                {
                    if (strcmp(g->data.u_TrainID[i].id, fo->data.TrainID)==0)
                    {
                        fo->data.ticket = fo->data.ticket + many;
                        printf("\n\t列车票退订成功。\n");
                        Sleep(1000);
                        printf("\n\t自动返回上一级。\n");
                        Sleep(2000);
                        user_interface(a, u, tail, g, s, rear, currentPos);
                        return;
                    }
                    fo = fo->next;
                }
            }
        }
        i--;
    }
    printf("\n\t未在您的列车票中搜寻到您输入的列车编号。\n");
    Sleep(1000);
    printf("\n\t自动返回上一级。\n");
    Sleep(2000);
    user_interface(a, u, tail, g, s, rear, currentPos);
    return;
}

void manager(UN* u, UN* tail,TN* s,TN* rear,int* currentPos)
{
    int a = 0;
    system("cls");
    system("color 0A");
    nowTime();
    printf("\t*********************************\t\n");
    printf("\t*     管       理       端      *\t\n");
    printf("\t*********************************\t\n");
    printf("\t*        1、管理员登录          *\t\n");
    printf("\t*        2、返回上一级          *\t\n");
    printf("\t*        3、直接退出系统        *\t\n");
    printf("\t*********************************\t\n");
    printf("\t请输入您的选择:");
    while (scanf("%d", &a) != 1)
    {
        system("cls");
        system("color 0C");
        printf("\t输入错误,请重新输入!\n");
        Sleep(1000);
        clearInputBuffer();
        manager(u, tail, s, rear, currentPos);
        return;
    }
    if (a == 1)
    {
        manager_login(u, tail, s, rear, currentPos);
        return;
    }
    else if (a == 2)
    {
        goBack(u, tail, s, rear, currentPos);
        return;
    }
    else if (a == 3)
    {
        system("cls");
        system("color 09");
        printf("\t欢迎下次使用!\n");
        Sleep(1000);
        exit(0);
    }
    else if (a != 1 && a != 2 && a != 3)
    {
        system("cls");
        system("color 0C");
        printf("\t输入错误,请重新输入!\n");
        Sleep(1000);
        manager(u, tail, s, rear, currentPos);
        return;
    }
}

void manager_login(UN* u,UN* tail,TN* s,TN* rear,int* currentPos)
{
    char account[20];
    char managerPassword[20];
    char ao[20];
    char bo[20];
    strcpy(account, "123456");
    strcpy(managerPassword, "csdn");
    system("cls");
    system("color 0A");
    nowTime();
    printf("\t*********************************\t\n");
    printf("\t*      管  理  员  登  录       *\t\n");
    printf("\t*********************************\t\n");
    manager_login_acount(account, ao);
    manager_login_password(managerPassword, bo);
    if (strcmp(ao, account) == 0 && strcmp(bo, managerPassword) == 0)
    {
        system("cls");
        system("color 09");
        printf("\n\t登录成功!");
        printf("\n\t正在进入管理界面,请稍等!");
        Sleep(2000);
        manager_interface(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    else
    {
        printf("\n\t账号或者密码输入错误。\n");
        Sleep(1000);
        printf("\n\t正在跳转,请稍等!\n");
        Sleep(2000);
        int h = 0;
        while (h < '1' || h>'2')
        {
            system("cls");
            system("color 0A");
            printf("\t*********************************\t\n");
            printf("\t*         1、重新输入           *\t\n");
            printf("\t*         2、返回管理端         *\t\n");
            printf("\t*********************************\t\n");
            printf("\t请输入您的选择:");
            clearInputBuffer();
            scanf("%d", &h);
            if (h == 1)
            {
                manager_login(u, tail, s, rear, currentPos);
                return;
            }
            else if (h == 2)
            {
                manager(u, tail, s, rear, currentPos);
                return;
            }
            else
            {
                system("color 0C");
                printf("\n\t输入错误,请重新输入!\n");
                Sleep(1000);
                system("cls");
                system("color 0A");
            }
        }
    }
}

void manager_login_acount(char* account, char* ao)
{
    printf("\n\t请输入账号(数字):");
    clearInputBuffer();
    scanf("%s", ao);
    int length = 0;
    length = strlen(ao);
    if (length > 20)
    {
        printf("\n\t您输入的账号长度大于20,请重新输入。\n");
        manager_login_acount(account, ao);
        return;
    }
    for (int i = 0; ao[i]!='\0'; i++)
    {
        if (ao[i] < '0' || ao[i]> '9')
        {
            printf("\n\t您输入的账号格式错误,请重新输入。\n");
            manager_login_acount(account, ao);
            return;
        }
    }
}

void manager_login_password(char* managerPassword, char* bo)
{
    printf("\n\t请输入密码(数/英/数英):");
    clearInputBuffer();
    scanf("%s", bo);
    int length = 0;
    length = strlen(bo);
    if (length > 20)
    {
        printf("\n\t您输入的密码长度大于20,请重新输入。\n");
        manager_login_password(managerPassword, bo);
        return;
    }
    for (int i = 0; bo[i] != '\0'; i++)
    {
        if (!((bo[i] >= '0' && bo[i] <= '9') || (bo[i] >= 'A' && bo[i] <= 'Z') || (bo[i] >= 'a' && bo[i] <= 'z')))
        {
            printf("\n\t您输入的登录密码格式错误,请重新输入。\n");
            manager_login_password(managerPassword, bo);
            return;
        }
    }
}

void manager_interface(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
    system("cls");
    system("color 0A");
    int h = 0;
    while (h < '1' || h > '7')
    {
        nowTime();
        printf("\t*********************************\t\n");
        printf("\t*       管   理   界   面       *\t\n");
        printf("\t*********************************\t\n");
        printf("\t*    1、查看目前列车信息        *\t\n");
        printf("\t*    2、录入列车信息            *\t\n");
        printf("\t*    3、修改已录入的列车信息    *\t\n");
        printf("\t*    4、删除列车信息            *\t\n");
        printf("\t*    5、用户信息                *\t\n");
        printf("\t*    6、返回管理端              *\t\n");
        printf("\t*    7、直接退出系统            *\t\n");
        printf("\t*********************************\t\n");
        printf("\t请输入您的选择:");
        clearInputBuffer();
        scanf("%d", &h);
        if (h == 1)
        {
            manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
        else if (h == 2)
        {
            manager_interface_enterTrain(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
        else if (h == 3)
        {
            manager_interface_reviseTrain(u, tail, s, rear,  managerPassword, currentPos);
            return;
        }
        else if (h == 4)
        {
            manager_interface_deleteTrain(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
        else if (h == 5)
        {
            manager_interface_userInformation(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
        else if (h == 6)
        {
            manager(u, tail, s, rear, currentPos);
            return;
        }
        else if (h == 7)
        {
            system("cls");
            system("color 09");
            printf("\t欢迎下次使用!\n");
            Sleep(1000);
            exit(0);
        }
        else
        {
            system("cls");
            system("color 0C");
            printf("\n\t输入错误,请重新输入!\n");
            Sleep(1000);
            system("cls");
            system("color 0A");
        }
    }
}

void manager_interface_checkTrain(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
    int h = 0;
    while (h < '1' || h > '6')
    {
        system("cls");
        system("color 0A");
        printf("\t**************************************\t\n");
        printf("\t*   列  车  信  息  查  看  界  面   *\t\n");
        printf("\t**************************************\t\n");
        printf("\t*       1、查看所有列车信息          *\t\n");
        printf("\t*       2、按列车编号查看列车信息    *\t\n");
        printf("\t*       3、按列车起点站查看列车信息  *\t\n");
        printf("\t*       4、按列车终点站查看列车信息  *\t\n");
        printf("\t*       5、返回管理界面              *\t\n");
        printf("\t*       6、直接退出系统              *\t\n");
        printf("\t**************************************\t\n");
        printf("\t请输入您的选择:");
        clearInputBuffer();
        scanf("%d", &h);
        if (h == 1)
        {
            manager_interface_checkTrain_functionOne(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
        else if (h == 2)
        {
            manager_interface_checkTrain_functionTwo(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
        else if (h == 3)
        {
            manager_interface_checkTrain_functionThree(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
        else if (h == 4)
        {
            manager_interface_checkTrain_functionFour(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
        else if (h == 5)
        {
            manager_interface(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
        else if (h == 6)
        {
            system("cls");
            system("color 09");
            printf("\t欢迎下次使用!\n");
            Sleep(1000);
            exit(0);
        }
        else
        {
            system("cls");
            system("color 0C");
            printf("\n\t输入错误,请重新输入!\n");
            Sleep(1000);
            system("cls");
            system("color 0A");
        }
    }
}

void manager_interface_checkTrain_functionOne(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
    TN* check;
    check = s->next;
    system("cls");
    system("color 09");
    printf("\n\t列车信息目录\n\n");
    if (check == NULL)
    {
        system("color 0A");
        printf("\n\t当前暂无列车信息。");
        Sleep(1000);
        printf("\n\t自动返回上一级。\n");
        Sleep(2000);
        manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    if (check != NULL)
    {
        system("color 0A");
        printf("\n\t列车编号        起点站        终点站        出发时间        到达时间       价格(元/张)       票数(单位:张)\n");
    }
    if (check != NULL)
    {
        while (check != NULL)
        {
            system("color 0A");
            printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-16d\n", &check->data.TrainID, &check->data.From, &check->data.To, &check->data.StartingTime,&check->data.ArriveTime, check->data.money, check->data.ticket);
            check = check->next;
        }
        printf("\n\t按任意返回列车信息查看界面。\n");
        getch();
        manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
}

void manager_interface_checkTrain_functionTwo(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
    TN* o;
    o = (TN*)malloc(sizeof(TN));
    if (o == NULL)
    {
        system("cls");
        system("color 0C");
        printf("操作失败,自动返回上一级!");
        Sleep(2000);
        manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    system("cls");
    system("color 0A");
    printf("\n\t按列车编号查询列车信息\t\n\n");
    TN* p;
    p = s->next;
    if (p == NULL)
    {
        system("color 0A");
        printf("\n\t当前暂无列车信息。");
        Sleep(1000);
        printf("\n\t自动返回上一级。\n");
        Sleep(2000);
        manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    printf("\n\t请输入列车编号:");
    clearInputBuffer();
    scanf("%s",o->data.TrainID);
    int length = 0;
    length = strlen(o->data.TrainID);
    if (length != 5)
    {
        printf("\n\t您输入的列车编号长度错误,输入长度应为5,请按照正确编号格式(如:A1234)重新输入。\n");
        Sleep(1000);
        manager_interface_checkTrain_functionTwo(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    if (o->data.TrainID[0] < 'A' || o->data.TrainID[0]>'Z')
    {
        printf("\n\t您输入的列车编号第一位应为大写英文,请重新输入。\n");
        Sleep(1000);
        manager_interface_checkTrain_functionTwo(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    for (int i = 1; o->data.TrainID[i] != '\0'; i++)
    {
        if (o->data.TrainID[i] < '0' || o->data.TrainID[i]>'9')
        {
            printf("\n\t您输入的列车编号后四位应为数字,请重新输入。\n");
            Sleep(1000);
            manager_interface_checkTrain_functionTwo(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
    }
    while (p != NULL)
    {
        if (strcmp(o->data.TrainID, p->data.TrainID) == 0)
        {
            printf("\n\t列车编号        起点站        终点站        出发时间        到达时间       价格(元/张)       票数(单位:张)\n");
            printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-16d\n", &p->data.TrainID, &p->data.From, &p->data.To, &p->data.StartingTime, &p->data.ArriveTime, p->data.money, p->data.ticket);
            printf("\n\t按任意返回列车信息查看界面。\n");
            getch();
            manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
        p = p->next;
    }
    printf("\n搜寻不到列车编号为 %s 的信息", &o->data.TrainID);
    Sleep(1000);
    printf("\n\t自动返回上一级。\n");
    Sleep(2000);
    manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
    return;
}

void manager_interface_checkTrain_functionThree(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
    TN* o;
    o = (TN*)malloc(sizeof(TN));
    if (o == NULL)
    {
        system("cls");
        system("color 0C");
        printf("操作失败,自动返回上一级!");
        Sleep(2000);
        manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    system("cls");
    system("color 0A");
    printf("\n\t按列车起点站查询列车信息\t\n\n");
    TN* p;
    p = s->next;
    if (p == NULL)
    {
        system("color 0A");
        printf("\n\t当前暂无列车信息。");
        Sleep(1000);
        printf("\n\t自动返回上一级。\n");
        Sleep(2000);
        manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    printf("\n\t请输入列车起点站名称:");
    clearInputBuffer();
    scanf("%s", o->data.From);
    for (int i = 0; o->data.From[i] != '\0'; i++)
    {
        if (o->data.From[i] >= 32 && o->data.From[i] <= 127)
        {
            printf("\n\t您输入的列车起点站名称格式错误,请重新输入。\n");
            Sleep(1000);
            manager_interface_checkTrain_functionThree(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
    }
    while (p != NULL)
    {
        if (strcmp(o->data.From, p->data.From) == 0)
        {
            printf("\n\t列车编号        起点站        终点站        出发时间        到达时间       价格(元/张)       票数(单位:张)\n");
            break;
        }
        p = p->next;
    }
    TN* pa;
    pa = s->next;
    while (pa != NULL)
    {
        if (strcmp(o->data.From, pa->data.From) == 0)
        {
            printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-16d\n", &pa->data.TrainID, &pa->data.From, &pa->data.To, &pa->data.StartingTime, &pa->data.ArriveTime, pa->data.money, pa->data.ticket);
        }
        pa = pa->next;
    }
    TN* pb;
    pb = s->next;
    while (pb != NULL)
    {
        if (strcmp(o->data.From, pb->data.From) == 0)
        {
            printf("\n\t按任意返回列车信息查看界面。\n");
            getch();
            manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
        pb = pb->next;
    }
    printf("\n\t搜寻不到列车编号为 %s 的信息", &o->data.From);
    Sleep(1000);
    printf("\n\t自动返回上一级。\n");
    Sleep(2000);
    manager_interface_checkTrain(u, tail, s, rear, managerPassword,currentPos);
    return;
}

void manager_interface_checkTrain_functionFour(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
    TN* o;
    o = (TN*)malloc(sizeof(TN));
    if (o == NULL)
    {
        system("cls");
        system("cls");
        system("color 0C");
        printf("操作失败,自动返回上一级!");
        Sleep(2000);
        manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    system("cls");
    system("color 0A");
    printf("\n\t按列车终点站查询列车信息\t\n\n");
    TN* p;
    p = s->next;
    if (p == NULL)
    {
        system("color 0A");
        printf("\n\t当前暂无列车信息。");
        Sleep(1000);
        printf("\n\t自动返回上一级。\n");
        Sleep(2000);
        manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    printf("\n\t请输入列车终点站名称:");
    clearInputBuffer();
    scanf("%s", o->data.To);
    for (int i = 0; o->data.To[i] != '\0'; i++)
    {
        if (o->data.To[i] >= 32 && o->data.To[i] <= 127)
        {
            printf("\n\t您输入的列车终点站名称格式错误,请重新输入。\n");
            Sleep(1000);
            manager_interface_checkTrain_functionFour(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
    }
    while (p != NULL)
    {
        if (strcmp(o->data.To, p->data.To) == 0)
        {
            printf("\n\t列车编号        起点站        终点站        出发时间        到达时间       价格(元/张)       票数(单位:张)\n");
            break;
        }
        p = p->next;
    }
    TN* pa;
    pa = s->next;
    while (pa != NULL)
    {
        if (strcmp(o->data.To, pa->data.To) == 0)
        {
            printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-16d\n", &pa->data.TrainID, &pa->data.From, &pa->data.To, &pa->data.StartingTime, &pa->data.ArriveTime, pa->data.money, pa->data.ticket);
        }
        pa = pa->next;
    }
    TN* pb;
    pb = s->next;
    while (pb != NULL)
    {
        if (strcmp(o->data.To, pb->data.To) == 0)
        {
            printf("\n\t按任意返回列车信息查看界面。\n");
            getch();
            manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
        pb = pb->next;
    }
    printf("\n\t搜寻不到终点站名称为 %s 的信息", &o->data.To);
    Sleep(1000);
    printf("\n\t自动返回上一级。\n");
    Sleep(2000);
    manager_interface_checkTrain(u, tail, s, rear, managerPassword, currentPos);
    return;
}

void manager_interface_enterTrain(UN* u,UN* tail,TN* s,TN* rear,char* managerPassword,int* currentPos)
{
    system("cls");
    system("color 0A");
    printf("\t**************************************\t\n");
    printf("\t*   列  车  信  息  录  入  界  面   *\t\n");
    printf("\t**************************************\t\n");
    TN* t;
    t = (TN*)malloc(sizeof(TN));
    if (t == NULL)
    {
        system("cls");
        system("color 0C");
        printf("操作失败,自动返回上一级!");
        Sleep(2000);
        manager_interface(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    manager_interface_enterTrain_trainId(u, tail, s, rear, t, managerPassword, currentPos);
    manager_interface_enterTrain_trainFrom(u, tail, s, rear, t, managerPassword);
    manager_interface_enterTrain_trainTo(u, tail, s, rear, t, managerPassword);
    manager_interface_enterTrain_trainStartingTime(u, tail, s, rear, t, managerPassword);
    manager_interface_enterTrain_trainArriveTime(u, tail, s, rear, t, managerPassword);
    manager_interface_enterTrain_trainMoney(u, tail, s, rear, t, managerPassword);
    manager_interface_enterTrain_trainTicket(u, tail, s, rear, t, managerPassword, currentPos);
}

void manager_interface_enterTrain_trainId(UN* u, UN* tail, TN* s, TN* rear,TN* t, char* managerPassword,int* currentPos)
{
    printf("\n\t请输入列车编号:");
    clearInputBuffer();
    scanf("%s", t->data.TrainID);
    int length = 0;
    length = strlen(t->data.TrainID);
    if (length !=5)
    {
        printf("\n\t您输入的列车编号长度错误,输入长度应为5,请按照正确编号格式(如:A1234)重新输入。\n");
        manager_interface_enterTrain_trainId(u, tail, s, rear, t, managerPassword, currentPos);
        return;
    }
    if (t->data.TrainID[0] < 'A' || t->data.TrainID[0]>'Z')
    {
        printf("\n\t您输入的列车编号第一位应为大写英文,请重新输入。\n");
        manager_interface_enterTrain_trainId(u, tail, s, rear, t, managerPassword, currentPos);
        return;
    }
    for (int i = 1; t->data.TrainID[i] != '\0'; i++)
    {
        if(t->data.TrainID[i]<'0'|| t->data.TrainID[i]>'9')
        {
            printf("\n\t您输入的列车编号后四位应为数字,请重新输入。\n");
            manager_interface_enterTrain_trainId(u, tail, s, rear, t, managerPassword, currentPos);
            return;
        }
    }
    TN* to;
    to = s->next;
    while (to != NULL)
    { 
        if (strcmp(t->data.TrainID, to->data.TrainID) == 0)
        {
            printf("\n\t该列车编号之前已录入!\n");
            Sleep(1000);
            printf("\n\t正在跳转,请稍等!\n");
            Sleep(2000);
            system("cls");
            system("color 0A");
            while (strcmp(t->data.TrainID, to->data.TrainID) == 0)
            {
                int a;
                nowTime();
                printf("\t*********************************\t\n");
                printf("\t*   1、重新录入                 *\t\n");
                printf("\t*   2、返回管理界面             *\t\n");
                printf("\t*   3、直接退出系统             *\t\n");
                printf("\t*********************************\t\n");
                printf("\t请输入您的选择:");
                clearInputBuffer();
                scanf("%d", &a);
                if (a == 1)
                {
                    manager_interface_enterTrain(u, tail, s, rear, managerPassword, currentPos);
                    free(to);
                    free(t);
                    return;
                }
                else if (a == 2)
                {
                    manager_interface(u, tail, s, rear, managerPassword, currentPos);
                    free(to);
                    free(t);
                    return;
                }
                else if (a == 3)
                {
                    system("cls");
                    system("color 09");
                    printf("\t欢迎下次使用!\n");
                    Sleep(1000);
                    exit(0);
                }
                else
                {
                    system("cls");
                    system("color 0C");
                    printf("\n\t输入错误,请重新输入!\n");
                    Sleep(1000);
                    system("cls");
                    system("color 0A");
                }
            }
        }
        to = to->next;
    }
}

void manager_interface_enterTrain_trainFrom(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword)
{
    printf("\n\t请输入列车起点站名称(中文):");
    clearInputBuffer();
    scanf("%s", t->data.From);
    for (int i = 0; t->data.From[i]!='\0'; i++)
    {
        if (t->data.From[i] >= 32 && t->data.From[i] <= 127)
        {
            printf("\n\t您输入的列车起点站名称格式错误,请重新输入。\n");
            manager_interface_enterTrain_trainFrom(u, tail, s, rear, t, managerPassword);
            return;
        }
    }
}

void manager_interface_enterTrain_trainTo(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword)
{
    printf("\n\t请输入列车终点站名称(中文):");
    clearInputBuffer();
    scanf("%s", t->data.To);
    for (int i = 0; t->data.To[i] != '\0'; i++)
    {
        if (t->data.To[i] >= 32 && t->data.To[i] <= 127)
        {
            printf("\n\t您输入的列车终点站名称格式错误,请重新输入。\n");
            manager_interface_enterTrain_trainTo(u, tail, s, rear, t, managerPassword);
            return;
        }
    }
    if (strcmp(t->data.From, t->data.To) == 0)
    {
        printf("\n\t您输入的列车终点站名称与列车起点站名称一致,请重新输入。\n");
        manager_interface_enterTrain_trainTo(u, tail, s, rear, t, managerPassword);
        return;
    }
}

void manager_interface_enterTrain_trainStartingTime(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword)
{
    printf("\n\t请输入列车出发时间(时分格式为00:00):");
    clearInputBuffer();
    scanf("%s", t->data.StartingTime);
    int length = 0;
    length = strlen(t->data.StartingTime);
    while (length > 5)
    {
        printf("\n\t您输入的列车出发时间格式错误,请重新输入。\n");
        manager_interface_enterTrain_trainStartingTime(u, tail, s, rear, t, managerPassword);
        return;
    }
    if (t->data.StartingTime[0] < '0' || t->data.StartingTime[0]>'2')
    {
        printf("\n\t您输入的列车出发时间格式错误,请按照24小时计时法重新输入。\n");
        manager_interface_enterTrain_trainStartingTime(u, tail, s, rear, t, managerPassword);
        return;
    }
    else if (t->data.StartingTime[1] < '0' || t->data.StartingTime[1]>'9')
    {
        printf("\n\t您输入的列车出发时间格式错误,请按照24小时计时法重新输入。\n");
        manager_interface_enterTrain_trainStartingTime(u, tail, s, rear, t, managerPassword);
        return;
    }
    else if (t->data.StartingTime[3] < '0' || t->data.StartingTime[3]>'5')
    {
        printf("\n\t您输入的列车出发时间格式错误,请按照24小时计时法重新输入。\n");
        manager_interface_enterTrain_trainStartingTime(u, tail, s, rear, t, managerPassword);
        return;
    }
    else if (t->data.StartingTime[4] < '0' || t->data.StartingTime[4]>'9')
    {
        printf("\n\t您输入的列车出发时间格式错误,请按照24小时计时法重新输入。\n");
        manager_interface_enterTrain_trainStartingTime(u, tail, s, rear, t, managerPassword);
        return;
    }
}

void manager_interface_enterTrain_trainArriveTime(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword)
{
    printf("\n\t请输入列车到达时间(时分格式为00:00):");
    clearInputBuffer();
    scanf("%s", t->data.ArriveTime);
    int length = 0;
    length = strlen(t->data.ArriveTime);
    while (length > 5)
    {
        printf("\n\t您输入的列车到达时间格式错误,请重新输入。\n");
        manager_interface_enterTrain_trainArriveTime(u, tail, s, rear, t, managerPassword);
        return;
    }
    if (t->data.ArriveTime[0] < '0' || t->data.ArriveTime[0]>'2')
    {
        printf("\n\t您输入的列车到达时间格式错误,请按照24小时计时法重新输入。\n");
        manager_interface_enterTrain_trainArriveTime(u, tail, s, rear, t, managerPassword);
        return;
    }
    else if (t->data.ArriveTime[1] < '0' || t->data.ArriveTime[1]>'9')
    {
        printf("\n\t您输入的列车到达时间格式错误,请按照24小时计时法重新输入。\n");
        manager_interface_enterTrain_trainArriveTime(u, tail, s, rear, t, managerPassword);
        return;
    }
    else if (t->data.ArriveTime[3] < '0' || t->data.ArriveTime[3]>'5')
    {
        printf("\n\t输入的列车到达时间格式错误,请按照24小时计时法重新输入。\n");
        manager_interface_enterTrain_trainArriveTime(u, tail, s, rear, t, managerPassword);
        return;
    }
    else if (t->data.ArriveTime[4] < '0' || t->data.ArriveTime[4]>'9')
    {
        printf("\n\t您输入的列车到达时间格式错误,请按照24小时计时法重新输入。\n");
        manager_interface_enterTrain_trainArriveTime(u, tail, s, rear, t, managerPassword);
        return;
    }
}

void manager_interface_enterTrain_trainMoney(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword)
{
    printf("\n\t请输入列车票价(单位:元(整数)):");
    clearInputBuffer();
    scanf("%d", &t->data.money);
    if (t->data.money < 0 || t->data.money>99999)
    {
        printf("\n\t您输入的列车票价错误,请重新输入。\n");
        manager_interface_enterTrain_trainMoney(u, tail, s, rear, t, managerPassword);
        return;
    }
}

void manager_interface_enterTrain_trainTicket(UN* u, UN* tail, TN* s, TN* rear, TN* t, char* managerPassword,int* currentPos)
{
    printf("\n\t请输入列车票数(单位:张(整数)):");
    clearInputBuffer();
    scanf("%d", &t->data.ticket);
    if (s->next == NULL)
    {
        rear = s;
    }
    if (t->data.ticket < 0 || t->data.ticket>6000)
    {
        printf("\n\t您输入的列车票数错误,请重新输入。\n");
        manager_interface_enterTrain_trainTicket(u, tail, s, rear, t, managerPassword, currentPos);
        return;
    }
    t->next = NULL;
    rear->next = t;
    rear = t;
    printf("\n\t列车信息录入成功!");
    printf("\t时间:");
    nowTime();
    printf("\n\n\t自动返回上一级。");
    Sleep(2000);
    manager_interface(u, tail, s, rear, managerPassword, currentPos);
    return;
}

void manager_interface_reviseTrain(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
    TN* o;
    o = (TN*)malloc(sizeof(TN));
    if (o == NULL)
    {
        system("color 0C");
        printf("操作失败,自动返回上一级!");
        Sleep(2000);
        manager_interface(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    system("cls");
    system("color 0A");
    printf("\t**************************************\t\n");
    printf("\t*   列  车  信  息  修  改  界  面   *\t\n");
    printf("\t**************************************\t\n");
    TN* tp;
    tp = s->next;
    if (tp == NULL)
    {
        system("color 0A");
        printf("\n\t当前暂无列车信息。");
        Sleep(1000);
        printf("\n\t自动返回上一级。\n");
        Sleep(2000);
        manager_interface(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    printf("\n\t请输入要修改的列车编号:");
    clearInputBuffer();
    scanf("%s", o->data.TrainID);
    TN* rp;
    rp = (TN*)malloc(sizeof(TN));
    if (rp == NULL)
    {
        system("color 0C");
        printf("操作失败,自动返回上一级!");
        Sleep(2000);
        manager_interface(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    while (tp != NULL)
    {
        if (strcmp(o->data.TrainID, tp->data.TrainID) == 0)
        {
            printf("\n\t当前列车信息\n\n");
            printf("\n\t列车编号        起点站        终点站        出发时间        到达时间       价格(元/张)       票数(单位:张)\n");
            printf("\n\t%-15s%-15s%-15s%-15s%-15s%-18d%-16d\n", &tp->data.TrainID, &tp->data.From, &tp->data.To, &tp->data.StartingTime, &tp->data.ArriveTime, tp->data.money, tp->data.ticket);
            manager_interface_reviseTrain_Id(u, tail, s, rear, rp, tp, managerPassword, currentPos);
            manager_interface_reviseTrain_From(u, tail, s, rear, rp, tp, managerPassword);
            manager_interface_reviseTrain_To(u, tail, s, rear, rp, tp, managerPassword);
            manager_interface_reviseTrain_StartingTime(u, tail, s, rear, rp, tp, managerPassword);
            manager_interface_reviseTrain_ArriveTime(u, tail, s, rear, rp, tp, managerPassword);
            manager_interface_reviseTrain_money(u, tail, s, rear, rp, tp, managerPassword);
            manager_interface_reviseTrain_ticket(u, tail, s, rear, rp, tp, managerPassword, currentPos);
        }
        tp = tp->next;
    }
    printf("\n搜寻不到列车编号为 %s 的信息", &o->data.TrainID);
    Sleep(1000);
    printf("\n\t自动返回上一级。\n");
    Sleep(2000);
    manager_interface(u, tail, s, rear, managerPassword, currentPos);
    return;
}

void manager_interface_reviseTrain_Id(UN* u, UN* tail, TN* s, TN* rear, TN* rp,TN* tp, char* managerPassword,int* currentPos)
{
    printf("\n\n\t请输入新的列车编号:");
    clearInputBuffer();
    scanf("%s",rp->data.TrainID);
    int length = 0;
    length = strlen(rp->data.TrainID);
    if (length != 5)
    {
        printf("\n\t您输入的列车编号长度错误,输入长度应为5,请按照正确编号格式(如:A1234)重新输入。\n");
        manager_interface_reviseTrain_Id(u, tail, s, rear, rp, tp, managerPassword, currentPos);
        return;
    }
    if (rp->data.TrainID[0] < 'A' || rp->data.TrainID[0]>'Z')
    {
        printf("\n\t您输入的列车编号第一位应为大写英文,请重新输入。\n");
        manager_interface_reviseTrain_Id(u, tail, s, rear, rp, tp, managerPassword, currentPos);
        return;
    }
    for (int i = 1; rp->data.TrainID[i] != '\0'; i++)
    {
        if (rp->data.TrainID[i] < '0' || rp->data.TrainID[i]>'9')
        {
            printf("\n\t您输入的列车编号后四位应为数字,请重新输入。\n");
            manager_interface_reviseTrain_Id(u, tail, s, rear, rp, tp, managerPassword, currentPos);
            return;
        }
    }
    TN* to;
    to = s->next;
    while (to != NULL)
    {
        if (strcmp(rp->data.TrainID, to->data.TrainID) == 0)
        {
            printf("\n\t该列车编号之前已录入!\n");
            Sleep(1000);
            printf("\n\t正在跳转,请稍等!\n");
            Sleep(2000);
            system("cls");
            system("color 0A");
            int a = 0;
            while (strcmp(rp->data.TrainID, to->data.TrainID) == 0)
            {
                nowTime();
                printf("\t*********************************\t\n");
                printf("\t*   1、返回列车信息修改界面     *\t\n");
                printf("\t*   2、返回管理界面             *\t\n");
                printf("\t*   3、直接退出系统             *\t\n");
                printf("\t*********************************\t\n");
                printf("\t请输入您的选择:");
                clearInputBuffer();
                scanf("%d", &a);
                if (a == 1)
                {
                    manager_interface_reviseTrain(u, tail, s, rear, managerPassword, currentPos);
                    free(to);
                    return;
                }
                else if (a == 2)
                {
                    manager_interface(u, tail, s, rear, managerPassword, currentPos);
                    free(to);
                    return;
                }
                else if (a == 3)
                {
                    system("cls");
                    system("color 09");
                    printf("\t欢迎下次使用!\n");
                    Sleep(1000);
                    exit(0);
                }
                else
                {
                    system("cls");
                    system("color 0C");
                    printf("\n\t输入错误,请重新输入!\n");
                    Sleep(1000);
                    system("cls");
                    system("color 0A");
                }
            }
        }
        to = to->next;
    }
    memcpy(tp->data.TrainID, rp->data.TrainID, sizeof(rp->data.TrainID));
}

void manager_interface_reviseTrain_From(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword)
{
    printf("\n\t请输入新的列车起点站名称:");
    clearInputBuffer();
    scanf("%s", rp->data.From);
    for (int i = 0; rp->data.From[i] != '\0'; i++)
    {
        if (rp->data.From[i] >= 32 && rp->data.From[i] <= 127)
        {
            printf("\n\t您输入的列车起点站名称格式错误,请重新输入。\n");
            manager_interface_reviseTrain_From(u, tail, s, rear, rp, tp, managerPassword);
            return;
        }
    }
    memcpy(tp->data.From, rp->data.From, sizeof(rp->data.From));
}

void manager_interface_reviseTrain_To(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword)
{
    printf("\n\t请输入新的列车终点站名称:");
    clearInputBuffer();
    scanf("%s", rp->data.To);
    for (int i = 0; rp->data.To[i] != '\0'; i++)
    {
        if (rp->data.To[i] >= 32 && rp->data.To[i] <= 127)
        {
            printf("\n\t您输入的列车终点站名称格式错误,请重新输入。\n");
            manager_interface_reviseTrain_To(u, tail, s, rear, rp, tp, managerPassword);
            return;
        }
    }
    if (strcmp(rp->data.From, rp->data.To) == 0)
    {
        printf("\n\t您输入的列车终点站名称与列车起点站名称一致,请重新输入。\n");
        manager_interface_reviseTrain_To(u, tail, s, rear, rp, tp, managerPassword);
        return;
    }
    memcpy(tp->data.To, rp->data.To, sizeof(rp->data.To));
}

void manager_interface_reviseTrain_StartingTime(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword)
{
    printf("\n\t请输入新的列车出发时间(00:00):");
    clearInputBuffer();
    scanf("%s", rp->data.StartingTime);
    int length = 0;
    length = strlen(rp->data.StartingTime);
    while (length > 5)
    {
        printf("\n\t您输入的列车出发时间格式错误,请重新输入。\n");
        manager_interface_reviseTrain_StartingTime(u, tail, s, rear, rp, tp, managerPassword);
        return;
    }
    if (rp->data.StartingTime[0] < '0' || rp->data.StartingTime[0]>'2')
    {
        printf("\n\t您输入的列车出发时间格式错误,请按照24小时计时法重新输入。\n");
        manager_interface_reviseTrain_StartingTime(u, tail, s, rear, rp, tp, managerPassword);
        return;
    }
    else if (rp->data.StartingTime[1] < '0' || rp->data.StartingTime[1]>'9')
    {
        printf("\n\t您输入的列车出发时间格式错误,请按照24小时计时法重新输入。\n");
        manager_interface_reviseTrain_StartingTime(u, tail, s, rear, rp, tp, managerPassword);
        return;
    }
    else if (rp->data.StartingTime[3] < '0' || rp->data.StartingTime[3]>'5')
    {
        printf("\n\t您输入的列车出发时间格式错误,请按照24小时计时法重新输入。\n");
        manager_interface_reviseTrain_StartingTime(u, tail, s, rear, rp, tp, managerPassword);
        return;
    }
    else if (rp->data.StartingTime[4] < '0' || rp->data.StartingTime[4]>'9')
    {
        printf("\n\t您输入的列车出发时间格式错误,请按照24小时计时法重新输入。\n");
        manager_interface_reviseTrain_StartingTime(u, tail, s, rear, rp, tp, managerPassword);
        return;
    }
    memcpy(tp->data.StartingTime, rp->data.StartingTime, sizeof(rp->data.StartingTime));
}

void manager_interface_reviseTrain_ArriveTime(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword)
{
    printf("\n\t请输入新的列车到达时间(00:00):");
    clearInputBuffer();
    scanf("%s", rp->data.ArriveTime);
    int length = 0;
    length = strlen(rp->data.ArriveTime);
    while (length > 5)
    {
        printf("\n\t您输入的列车到达时间格式错误,请重新输入。\n");
        manager_interface_reviseTrain_ArriveTime(u, tail, s, rear, rp, tp, managerPassword);
        return;
    }
    if (rp->data.ArriveTime[0] < '0' || rp->data.ArriveTime[0]>'2')
    {
        printf("\n\t您输入的列车到达时间格式错误,请按照24小时计时法重新输入。\n");
        manager_interface_reviseTrain_ArriveTime(u, tail, s, rear, rp, tp, managerPassword);
        return;
    }
    else if (rp->data.ArriveTime[1] < '0' || rp->data.ArriveTime[1]>'9')
    {
        printf("\n\t您输入的列车到达时间格式错误,请按照24小时计时法重新输入。\n");
        manager_interface_reviseTrain_ArriveTime(u, tail, s, rear, rp, tp, managerPassword);
        return;
    }
    else if (rp->data.ArriveTime[3] < '0' || rp->data.ArriveTime[3]>'5')
    {
        printf("\n\t输入的列车到达时间格式错误,请按照24小时计时法重新输入。\n");
        manager_interface_reviseTrain_ArriveTime(u, tail, s, rear, rp, tp, managerPassword);
        return;
    }
    else if (rp->data.ArriveTime[4] < '0' || rp->data.ArriveTime[4]>'9')
    {
        printf("\n\t您输入的列车到达时间格式错误,请按照24小时计时法重新输入。\n");
        manager_interface_reviseTrain_ArriveTime(u, tail, s, rear, rp, tp, managerPassword);
        return;
    }
    memcpy(tp->data.ArriveTime, rp->data.ArriveTime, sizeof(rp->data.ArriveTime));
}

void manager_interface_reviseTrain_money(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword)
{
    printf("\n\t请输入新的列车票价格(元):");
    clearInputBuffer();
    scanf("%d", &rp->data.money);
    if (rp->data.money < 0 || rp->data.money>99999)
    {
        printf("\n\t您输入的列车票价错误,请重新输入。\n");
        manager_interface_reviseTrain_money(u, tail, s, rear, rp, tp, managerPassword);
        return;
    }
    tp->data.money = rp->data.money;
}

void manager_interface_reviseTrain_ticket(UN* u, UN* tail, TN* s, TN* rear, TN* rp, TN* tp, char* managerPassword,int* currentPos)
{
    printf("\n\t请输入列车票数(单位:张(整数)):");
    clearInputBuffer();
    scanf("%d", &rp->data.ticket);
    if (rp->data.ticket < 0 || rp->data.ticket>6000)
    {
        printf("\n\t您输入的列车票数错误,请重新输入。\n");
        manager_interface_reviseTrain_ticket(u, tail, s, rear, rp, tp, managerPassword, currentPos);
        return;
    }
    tp->data.ticket = rp->data.ticket;
    printf("\n\t列车信息修改成功!");
    printf("\t时间:");
    nowTime();
    printf("\n\n\t自动返回上一级。");
    Sleep(2000);
    manager_interface(u, tail, s, rear, managerPassword, currentPos);
    return;
}

void manager_interface_deleteTrain(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
    TN* o;
    o = (TN*)malloc(sizeof(TN));
    if (o == NULL)
    {
        system("color 0C");
        printf("操作失败,自动返回上一级!");
        Sleep(2000);
        manager_interface(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    system("cls");
    system("color 0A");
    printf("\t**************************************\t\n");
    printf("\t*   列  车  信  息  删  除  界  面   *\t\n");
    printf("\t**************************************\t\n");
    TN* pt;
    pt = s->next;
    if (pt == NULL)
    {
        system("color 0A");
        printf("\n\t当前暂无列车信息。");
        Sleep(1000);
        printf("\n\t自动返回上一级。\n");
        Sleep(2000);
        manager_interface(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    printf("\n\t请输入要删除的列车编号:");
    clearInputBuffer();
    scanf("%s", o->data.TrainID);
    int length = 0;
    length = strlen(o->data.TrainID);
    if (length != 5)
    {
        printf("\n\t您输入的列车编号长度错误,输入长度应为5,请按照正确编号格式(如:A1234)重新输入。\n");
        manager_interface_deleteTrain(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    if (o->data.TrainID[0] < 'A' || o->data.TrainID[0]>'Z')
    {
        printf("\n\t您输入的列车编号第一位应为大写英文,请重新输入。\n");
        manager_interface_deleteTrain(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    for (int i = 1; o->data.TrainID[i] != '\0'; i++)
    {
        if (o->data.TrainID[i] < '0' || o->data.TrainID[i]>'9')
        {
            printf("\n\t您输入的列车编号后四位应为数字,请重新输入。\n");
            manager_interface_deleteTrain(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
    }
    while (pt != NULL)
    {
        if (strcmp(o->data.TrainID, pt->data.TrainID) == 0)
        {
            if (pt == s->next)
            {
                s->next = pt->next;
            }
            else if (pt == rear)
            {
                TN* de;
                de = s->next;
                while (de->next != rear)
                {
                    de = de->next;
                }
                rear = de;
                de->next = NULL;
            }
            else
            {
                TN* c;
                c = s->next;
                while (c->next != pt)
                {
                    c = c->next;
                }
                c->next = pt->next;
            }
            printf("\n\t列车信息删除成功,自动返回上一级。\n");
            Sleep(2000);
            manager_interface(u, tail, s, rear, managerPassword, currentPos);
            free(pt);
            free(o);
            return;
        }
        pt = pt->next;
    }
    printf("\n搜寻不到列车编号为 %s 的信息", &o->data.TrainID);
    Sleep(1000);
    printf("\n\t自动返回上一级。\n");
    Sleep(2000);
    manager_interface(u, tail, s, rear, managerPassword, currentPos);
    return;
}

void manager_interface_userInformation(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
    int h = 0;
    while (h < '1' || h > '5')
    {
        system("cls");
        system("color 0A");
        nowTime();
        printf("\t*********************************\t\n");
        printf("\t*    用  户  信  息  界  面     *\t\n");
        printf("\t*********************************\t\n");
        printf("\t*   1、查看所有用户信息         *\t\n");
        printf("\t*   2、按姓名查看用户信息       *\t\n");
        printf("\t*   3、按身份证号码查看用户信息 *\t\n");
        printf("\t*   4、返回管理界面             *\t\n");
        printf("\t*   5、直接退出系统             *\t\n");
        printf("\t*********************************\t\n");
        printf("\t请输入您的选择:");
        clearInputBuffer();
        scanf("%d", &h);
        if (h == 1)
        {
            manager_interface_userInformation_functionOne(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
        else if (h == 2)
        {
            manager_interface_userInformation_functionTwo(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
        else if (h == 3)
        {
            manager_interface_userInformation_functionThree(u, tail, s, rear, managerPassword, currentPos);
        }
        else if (h == 4)
        {
            manager_interface(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
        else if (h == 5)
        {
            system("cls");
            system("color 09");
            printf("\t欢迎下次使用!\n");
            Sleep(1000);
            exit(0);
        }
        else
        {
            system("cls");
            system("color 0C");
            printf("\n\t输入错误,请重新输入!\n");
            Sleep(1000);
            system("cls");
            system("color 0A");
        }
    }
}

void manager_interface_userInformation_functionOne(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
    system("cls");
    system("color 0A");
    printf("\n\t用户信息目录\n\n");
    UN* f;
    f = u->next;
    if (f == NULL)
    {
        system("color 0A");
        printf("\n\t当前暂无用户信息。\n");
        Sleep(1000);
        printf("\n\t自动返回上一级。\n");
        Sleep(2000);
        manager_interface_userInformation(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    while (f != NULL)
    {
        printf("\n\t*******************************************************************\n");
        printf("\n\t姓名:%s", &f->data.Name);
        printf("\n\t性别:%s", &f->data.Gender);
        printf("\n\t身份证号码:%s", &f->data.ID);
        printf("\n\t电话号码:%s", &f->data.PhoneNumber);
        printf("\n\t用户名:%s", &f->data.username);
        printf("\n\t已购的列车票:");
        if (f->data.count == 0)
        {
            printf("\n\t当前还未购买列车票");
        }
        else
        {
            for (int i = f->data.count; i >= 0; i--)
            {
                printf("%s  ", f->data.u_TrainID[i].id);
            }
        }
        printf("\n\t*******************************************************************\n");
        f = f->next;
    }
    printf("\n\t按任意返回用户信息查看界面。\n");
    getch();
    manager_interface_userInformation(u, tail, s, rear, managerPassword, currentPos);
    return;
}

void manager_interface_userInformation_functionTwo(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
    UN* o;
    o = (UN*)malloc(sizeof(UN));
    if (o == NULL)
    {
        system("cls");
        system("color 0C");
        printf("操作失败,自动返回上一级!");
        Sleep(2000);
        manager_interface_userInformation(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    system("cls");
    system("color 0A");
    printf("\n\t按用户姓名查询用户信息\t\n\n");
    UN* f;
    f = u->next;
    if (f == NULL)
    {
        system("color 0A");
        printf("\n\t当前暂无用户信息。\n");
        Sleep(1000);
        printf("\n\t自动返回上一级。\n");
        Sleep(2000);
        manager_interface_userInformation(u, tail, s, rear, managerPassword,currentPos);
        return;
    }
    printf("\n\t请输入用户姓名:");
    clearInputBuffer();
    scanf("%s", o->data.Name);
    for (int i = 0; o->data.Name[i] != '\0'; i++)
    {
        if (o->data.Name[i] >= 32 && o->data.Name[i] <= 127)
        {
            printf("\n\t您输入的姓名格式错误,请重新输入。\n");
            Sleep(1000);
            manager_interface_userInformation_functionTwo(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
    }
    while (f != NULL)
    {
        if (strcmp(o->data.Name, f->data.Name) == 0)
        {
            printf("\n\t*******************************************************************\n");
            printf("\n\t姓名:%s", &f->data.Name);
            printf("\n\t性别:%s", &f->data.Gender);
            printf("\n\t身份证号码:%s", &f->data.ID);
            printf("\n\t电话号码:%s", &f->data.PhoneNumber);
            printf("\n\t用户名:%s", &f->data.username);
            printf("\n\t已购的列车票:");
            if (f->data.count == 0)
            {
                printf("\n\t当前还未购买列车票");
            }
            else
            {
                for (int i = f->data.count; i >= 0; i--)
                {
                    printf("%s  ", f->data.u_TrainID[i].id);
                }
            }
            printf("\n\t*******************************************************************\n");
        }
        f = f->next;
    }
    printf("\n\t按任意返回用户信息查看界面。\n");
    getch();
    manager_interface_userInformation(u, tail, s, rear, managerPassword, currentPos);
    return;
}

void manager_interface_userInformation_functionThree(UN* u, UN* tail, TN* s, TN* rear, char* managerPassword,int* currentPos)
{
    UN* o;
    o = (UN*)malloc(sizeof(UN));
    if (o == NULL)
    {
        system("cls");
        system("color 0C");
        printf("操作失败,自动返回上一级!");
        Sleep(2000);
        manager_interface_userInformation(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    system("cls");
    system("color 0A");
    printf("\n\t按用户身份证号码查询用户信息\t\n\n");
    UN* f;
    f = u->next;
    if (f == NULL)
    {
        system("color 0A");
        printf("\n\t当前暂无用户信息。\n");
        Sleep(1000);
        printf("\n\t自动返回上一级。\n");
        Sleep(2000);
        manager_interface_userInformation(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    printf("\n\t请输入用户身份证号码:");
    clearInputBuffer();
    scanf("%s", o->data.ID);
    int length = 0;
    int l = 0;
    length = strlen(o->data.ID);
    if (length != 18)
    {
        printf("\n\t您输入的身份证号码长度错误,请重新输入。\n");
        Sleep(1000);
        manager_interface_userInformation_functionThree(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    for (int i = 0; i < 17; i++)
    {
        if (o->data.ID[i] < '0' || o->data.ID[i] > '9')
        {
            printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
            Sleep(1000);
            manager_interface_userInformation_functionThree(u, tail, s, rear, managerPassword, currentPos);
            return;
        }
    }
    if (o->data.ID[17] != 'X' && (o->data.ID[17] < '0' || o->data.ID[17] > '9'))
    {
        printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
        Sleep(1000);
        manager_interface_userInformation_functionThree(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    char province_code[3];
    strncpy(province_code, o->data.ID, 2);
    province_code[2] = '\0';
    int code = atoi(province_code);
    if (code < 11 || code > 91)
    {
        printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
        Sleep(1000);
        manager_interface_userInformation_functionThree(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    char year[5], month[3], day[3];
    strncpy(year, o->data.ID + 6, 4);
    year[4] = '\0';
    strncpy(month, o->data.ID + 10, 2);
    month[2] = '\0';
    strncpy(day, o->data.ID + 12, 2);
    day[2] = '\0';
    int y = atoi(year);
    int m = atoi(month);
    int d = atoi(day);
    if (y < 1900 || y > 2021 || m < 1 || m > 12 || d < 1 || d > 31)
    {
        printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
        Sleep(1000);
        manager_interface_userInformation_functionThree(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    int weights[17] = { 7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2 };
    char checksum[12] = "10X98765432";
    int sum = 0;
    for (int z = 0; z < 17; z++)
    {
        sum += (o->data.ID[z] - '0') * weights[z];
    }
    int remainder = sum % 11;
    if (o->data.ID[17] != checksum[remainder])
    {
        printf("\n\t您输入的身份证号码格式错误,请重新输入。\n");
        Sleep(1000);
        manager_interface_userInformation_functionThree(u, tail, s, rear, managerPassword, currentPos);
        return;
    }
    while (f != NULL)
    {
        printf("\n\t*******************************************************************\n");
        printf("\n\t姓名:%s", &f->data.Name);
        printf("\n\t性别:%s", &f->data.Gender);
        printf("\n\t身份证号码:%s", &f->data.ID);
        printf("\n\t电话号码:%s", &f->data.PhoneNumber);
        printf("\n\t用户名:%s", &f->data.username);
        printf("\n\t已购的列车票:");
        if (f->data.count == 0)
        {
            printf("\n\t当前还未购买列车票");
        }
        else
        {
            for (int i = f->data.count; i >= 0; i--)
            {
                printf("%s  ", f->data.u_TrainID[i].id);
            }
        }
        printf("\n\t*******************************************************************\n");
        f = f->next;
    }
    printf("\n\t按任意返回用户信息查看界面。\n");
    getch();
    manager_interface_userInformation(u, tail, s, rear, managerPassword, currentPos);
    return;
}

int main()
{
    int a = 0;
    int currentPos = 0;
    TN* s;
    TN* rear;
    s = (TN*)malloc(sizeof(TN));
    if (s == NULL)
    {
        system("color 0C");
        printf("\n\t操作失败,系统异常退出!");
        Sleep(2000);
        exit(0);
    }
    s->next = NULL;
    rear = s;
    UN* u;
    UN* tail;
    u = (UN*)malloc(sizeof(UN));
    if (u == NULL)
    {
        system("color 0C");
        printf("\n\t操作失败,系统异常退出!");
        Sleep(2000);
        exit(0);
    }
    u->next = NULL;
    tail = u;
    system("cls");
    system("color 0A");
    nowTime();
    printf("\t*********************************\t\n");
    printf("\t* 欢 迎 使 用 火 车 购 票 系 统 *\t\n");
    printf("\t*********************************\t\n");
    printf("\t*       1、进入客户端           *\t\n");
    printf("\t*       2、进入管理端           *\t\n");
    printf("\t*       3、直接退出系统         *\t\n");
    printf("\t*********************************\t\n");
    printf("\t请输入您的选择:");
    while (scanf("%d", &a) != 1)
    {
        system("cls");
        system("color 0C");
        printf("\t输入错误,请重新输入!\n");
        Sleep(1000);
        clearInputBuffer();
        goBack(u, tail, s, rear, currentPos);
        return;
    }
    if (a == 1)
    {
        user(u, tail, s, rear, currentPos);
        return;
    }
    else if (a == 2)
    {
        manager(u, tail, s, rear, currentPos);
        return;
    }
    else if (a == 3)
    {
        system("cls");
        system("color 09");
        printf("\t欢迎下次使用!\n");
        Sleep(1000);
        exit(0);
    }
    else
    {
        system("cls");
        system("color 0C");
        printf("\t输入错误,请重新输入!\n");
        Sleep(1000);
        goBack(u, tail, s, rear, currentPos);
        return;
    }

    return 0;
}

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
非常感谢您的提问。以下是一个简单的C语言实现火车管理系统的示例代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #define MAX_TRAIN_NUM 100 // 火车数量的最大值 // 火车结构体 typedef struct Train { char id[10]; // 火车编号 char start[20]; // 起点站 char end[20]; // 终点站 int seat_num; // 座位数 } Train; // 火车数组 Train trains[MAX_TRAIN_NUM]; int train_num = 0; // 火车数量 // 添加火车 void add_train() { if (train_num >= MAX_TRAIN_NUM) { printf("火车数量已达到最大值,无法添加新的火车!\n"); return; } Train train; printf("请输入火车编号:"); scanf("%s", train.id); printf("请输入起点站:"); scanf("%s", train.start); printf("请输入终点站:"); scanf("%s", train.end); printf("请输入座位数:"); scanf("%d", &train.seat_num); trains[train_num++] = train; printf("火车添加成功!\n"); } // 查询火车 void query_train() { char id[10]; printf("请输入要查询的火车编号:"); scanf("%s", id); int i; for (i = 0; i < train_num; i++) { if (strcmp(trains[i].id, id) == 0) { printf("火车编号:%s\n", trains[i].id); printf("起点站:%s\n", trains[i].start); printf("终点站:%s\n", trains[i].end); printf("座位数:%d\n", trains[i].seat_num); return; } } printf("未找到编号为%s的火车!\n", id); } // 显示菜单 void show_menu() { printf("欢迎使用火车管理系统!\n"); printf("1. 添加火车\n"); printf("2. 查询火车\n"); printf("3. 退出系统\n"); } int main() { int choice; do { show_menu(); printf("请输入您的选择:"); scanf("%d", &choice); switch (choice) { case 1: add_train(); break; case 2: query_train(); break; case 3: printf("感谢使用火车管理系统,再见!\n"); exit(0); default: printf("无效的选择,请重新输入!\n"); break; } } while (1); return 0; } 希望这个示例代码能够帮助您实现一个简单的火车管理系统。如果您有任何问题或建议,请随时与我联系。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值