(万字)最详细C语言实现火车售票系统

目录

1.1  主菜单

1.2   二级菜单

1.2.1     二级菜单下的三级菜单

2.1 录入模块

2.1.1 车次

2.1.2 用户

2.2 查询模块

2.2.1 车次

2.2.2 用户

2.3 保存信息

2.3.1 车次

2.3.2 用户

2.4 载入信息

2.4.1 车次

2.4.2 用户

2.5 订票模块

2.6 退票模块

2.7 系统维护

2.7.1 车次

2.7.2 用户


1.1  主菜单

首先来看一下主菜单的效果图

 对于我的这个火车系统,主要功能包括8项,因为全程是使用C语言实现的,所以功能较为简单,内部二级菜单里是分为了班次和用户的模块,具体看二级菜单模块,我这一版本可以说是最基础的版本。所以要实现更为完善的系统可以借用我的这一基础系统来更为完善。

主菜单没什么可说的。

主菜单的实现很为简单,用最简单的printf进行实现即可。

int menu()
{
    int option;
    printf("\n\n\n\t*********************欢迎使用火车售票管理系统********************\n\n\n");
    printf("\t                     1.录入信息                                       \n\n");
    printf("\t                     2.查询信息                                        \n\n");
    printf("\t                     3.保存信息                                        \n\n");
    printf("\t                     4.载入信息                                        \n\n");
    printf("\t                     5.订票管理                                        \n\n");
    printf("\t                     6.退票管理                                        \n\n");
    printf("\t                     7.系统维护                                        \n\n");
    printf("\t                     0.退出系统                                  \n\n\n");
    printf("\t*****************************************************************\n\n\n");
    printf(" \t请选择0—7中的数字之一,以进行火车售票服务:");
    scanf("%d",&option);
    return(option);
}

1.2   二级菜单

二级菜单主要包括录入信息,查询信息,保存信息,载入信息,系统维护这5个功能的二级菜单。并且在查询信息和系统维护这两个功能下有更深层次的三级菜单。

上述5个功能的二级菜单实现很类似。我们看其中一个功能即可。就拿系统维护来说,二级菜单里是分为了班次维护和用户维护两者的模块,再将维护信息分为改正信息和删除信息,然后对于其他的功能的实现很相似。

还是先看效果图

功能实现也很是简单。

直接看代码

int weihu()//系统维护的二级菜单
{
    int wh;
    printf("\n\n\n\t*********************请选择您要选用的功能********************\n\n\n");
    printf("                             1.班次维护                              \n\n");
    printf("                             2.用户维护                              \n\n");
    printf("                             0.返回主菜单                            \n\n");
    printf("\n\n\n\t**************************************************************\n\n\n");
    scanf("%d",&wh);
    return(wh);
}

和主菜单的实现很是类似,也是很简单。

1.2.1     二级菜单下的三级菜单

通过对上文系统维护功能的分析,每个二级菜单下的三级菜单实现也很类似。

直接看实现效果

 其他功能下的二级菜单基本类似,界面原理都相同。

代码

int hcgaishan()//班次的改和删
{
    int gs1;
    printf("\n\n\n\t*********************请选择您要选用的功能********************\n\n\n");
    printf("                             1.改正班次信息                          \n\n");
    printf("                             2.删除班次信息                          \n\n");
    printf("                             0.返回维护菜单                          \n\n");
    printf("\n\n\n\t**************************************************************\n\n\n");
    scanf("%d",&gs1);
    return(gs1);
}

至此,主菜单和二级菜单以及二级菜单下的三级菜单的实现我们都已进行了了解,下面是各模块的分层实现。

2.1 录入模块

录入功能总的来说是依靠链表来进行录入赋值,实现就是依靠链表的增删改查中的增这一步,相对来说较为简单。车次和用户的录入基本相同。

注意:录入用户信息时,不只有这一种途径可以录入用户信息,还可以通过订票模块进行用户的录入。

车次结构体:

typedef struct huoche//班次结构体
{
    char checi[1000];//车次名称
    char origin[1000];//始发站
    char endpoint[1000];//终点站
    char time1[1000];//发车时间
    char time2[1000];//终点时间
    //char rank[100];//座位等级
    int price;//票价
    int shuliang;//票数
}Banci;

typedef struct huochejd//班次的节点
{
    Banci data1;
    struct huochejd* next;
}Bcjd;

用户结构体:

typedef struct yonghu//用户结构体
{
    char name[100];//用户姓名
    char sfz[100];//用户身份证号
    char dianhua[100];//用户的手机号码
    char yhcheci[1000];//用户所订的车次名称
}Yonghu;

typedef struct yonghujd//用户的节点
{
    Yonghu data2;
    struct yonghujd* next;
}Yhjd;

2.1.1 车次

代码:

void Lurubc(Bcjd* L)//录入班次函数
{
    Bcjd* lub;
    Bcjd* rub;
    lub = L;//头节点
    while(lub->next != NULL)
    {
          lub = lub->next;
    }
    rub = (Bcjd* )malloc(sizeof(Bcjd));
    if(rub == NULL)//若ru等于NULL,则说明了未成功开辟空间
    {
        printf("录入出错!");
    }
    else
    {
    printf("\t请输入车次名称:\n");
    scanf("%s",&rub->data1.checi);
    Bancicz(rub,L);//判断车次名称是否重复
    printf("\t请输入始发站:\n");
    scanf("%s",&rub->data1.origin);
    printf("\t请输入终点站:\n");
    scanf("%s",&rub->data1.endpoint);
    printf("\t请输入发车时间:\n");
    scanf("%s",&rub->data1.time1);
    printf("\t请输入终点时间:\n");
    scanf("%s",&rub->data1.time2);
    //printf("\t请输入座位等级:\n");
    //scanf("%s",&rub->data1.rank);
    printf("\t请输入票价:\n");
    scanf("%d",&rub->data1.price);
    printf("\t请输入票数:\n");
    scanf("%d",&rub->data1.shuliang);
    Pshu(rub);
    rub->next = NULL;
    lub->next = rub;
    rub = lub;
    }
}

应注意的是在录入班次名称的时候,要对名称进行查重处理,以免出现多个车次名称相同的情况。

并且在录入票数时,应对票数进行判断,不能输入负数。

车次名称查重 :

void Bancicz(Bcjd* ru,Bcjd* L)//车次名称的查重
{
    Bcjd* T;//头节点
    T = L;
    while(T != NULL)
    {
       if(strcmp(ru->data1.checi,T->data1.checi) == 0)
       {
           printf("该列车已存在,请重新输入\n");
           scanf("%s",&ru->data1.checi);
           Bancicz(ru,L);
       }
       else
       {
           T = T->next;
       }
    }

}

票数查重:

void Pshu(Bcjd* S)//票数判断
{
    if(S->data1.shuliang < 0)
    {
        printf("您的票数错误,请重新输入\n");
        scanf("%d",&S->data1.shuliang);
        Pshu(S);
    }
}

2.1.2 用户

和班次实现基本相同。

代码:

void Luruyh(Yhjd* Q)//录入用户函数
{
    Yhjd* luy;//头节点
    Yhjd* ruy;
    luy = Q;
    while(luy->next != NULL)
    {
        luy = luy->next;//找到尾节点
    }
    ruy = (Yhjd* )malloc(sizeof(Yhjd));
    if(ruy == NULL)
    {
        printf("录入出错! ");
    }
    else
    {
        printf("\t请输入用户姓名:\n");
        scanf("%s",&ruy->data2.name);
        printf("\t请输入用户身份证号:\n");
        scanf("%s",&ruy->data2.sfz);
        printf("\t请输入用户手机号:\n");
        scanf("%s",&ruy->data2.dianhua);
        printf("\t请输入所订的车次名称:\n");
        scanf("%s",&ruy->data2.yhcheci);
        ruy->next = NULL;
        luy->next = ruy;
        ruy = luy;
    }
}

录入模块到此结束

2.2 查询模块

查询模块也是使用到了增删改查中的查这一步,实现也较为简单。车次和用户的查询基本相同。

2.2.1 车次

车次的查询本系统提供了三种查询方式,前两种为查询单个火车车次,后一个为查询全部的火车车次。前两种分别为按车次名称查询和按终点站进行查询,最后一个为查询所有车次。

1. 按车次名称查询

代码:

void Chalieche(Bcjd* C)//通过车次名称进行查询
{
    Bcjd* CB;
    CB = C;//头节点
    char checi2[1000];
    printf("\t请输入您要查询的车次名称:\n");
    scanf("%s",&checi2);
    while(CB != NULL)
    {
        if(strcmp(CB->data1.checi,checi2) == 0)
        {
            zhanshi(CB);
            break;
        }
        CB = CB->next;
    }
    if(CB == NULL)
    {
        printf("\t没有该车次的信息\n");
    }
}

2. 按终点站查询

代码:

void Chazdz(Bcjd* D)//通过终点站进行查询
{
    Bcjd* R;//头节点
    R = D;
    char zdz2[1000];
    printf("\t请输入终点站:\n");//注意:一个城市可能会成为许多城市的终点站,所以终点站可能不唯一,所以就和按车次名称的查询不同(车次只有一个),所以我需要全部遍历火车,找出终点的所有车次,所以他不能就是找到终点的1个可能性就完了,也就是找到了不能跳出循环
    scanf("%s",&zdz2);
    int k = 0;//判断终点的可能
    while(R != NULL)
    {
        if(strcmp(R->data1.endpoint,zdz2) == 0)
        {
            zhanshi(R);
            k = 1;//找到了一个就可以改变k的值
        }
        if(R->next == NULL)
        {
            break;
        }
        R = R->next;
    }
    if(R == NULL || k == 0)//k为0说明没有找到该终点
    {
        printf("\t没有该车次的信息\n");
    }
}

具体注意细节已在代码中标出。

1 和 2 若查询到了,会进行展示该车次信息。

代码:

void zhanshi(Bcjd* Z)//展示单个火车信息
{
    Bcjd* I;
    I = Z;
    //Z = Z->next;
    printf("**************************************************************\n\n\n");
    printf("\t车次名称:%s\n",I->data1.checi);
    printf("\t始发站:%s\n",I->data1.origin);
    printf("\t终点站:%s\n",I->data1.endpoint);
    printf("\t起始时间:%s\n",I->data1.time1);
    printf("\t终止时间:%s\n",I->data1.time2);
    //printf("\t座位等级:%s\n",I->data1.rank);
    printf("\t票价:%d\n",I->data1.price);
    printf("\t票数:%d\n",I->data1.shuliang);
    printf("**************************************************************\n\n\n");

}

3. 查询全部车次

代码:

void Chaxqb(Bcjd* QB)//展示所有班次信息
{
    Bcjd* QB1;
    QB1 = QB->next;
    //printf("\t车次名称\t始发站\t终点站\t发车时间\t到达时间\t座位等级\t票价\t票数\n");
    if(QB1 == NULL)
    {
        printf("\t未有该车次的信息\n");
    }
    while(QB1 != NULL)
    {
        zhanshi(QB1);
        QB1 = QB1->next;
    }
}

若找到了,会进行展示所有车次信息。

2.2.2 用户

对于用户我们提供了两种查询方式,第一是按身份证号进行查询,主要是为了单个用户的查询,第二是查询所有用户。

1. 按身份证号查询

代码:

void Chayh(Yhjd* A)//查询用户信息
{
    Yhjd* AS;//头节点
    AS = A;
    char sfz2[1000];
    printf("请输入用户的身份证:\n");
    scanf("%s",&sfz2);
    while(AS != NULL)
    {
        if(strcmp(AS->data2.sfz,sfz2) == 0)
        {
            zhanshi2(AS);
            break;
        }
        AS = AS->next;
    }
    if(AS == NULL)
    {
        printf("未查询到该用户信息\n");
    }
}

若查询到了,则进行展示单个用户信息。

代码:

void zhanshi2(Yhjd* AN)//展示单个用户信息
{
    Yhjd* AZ;
    AZ = AN;
    printf("**************************************************************\n");
    printf("\t姓名:%s\n",AZ->data2.name);
    printf("\t身份证:%s\n",AZ->data2.sfz);
    printf("\t手机号码:%s\n",AZ->data2.dianhua);
    printf("\t您所订的车次:%s\n",AZ->data2.yhcheci);
    printf("**************************************************************\n");

}

2. 查询所有用户

代码:

void Chaxqy(Yhjd* QY)//展示所有用户信息
{
    Yhjd* QY1;
    QY1 = QY->next;
    //printf("\t车次名称\t始发站\t终点站\t发车时间\t到达时间\t座位等级\t票价\t票数\n");
    if(QY1 == NULL)
    {
        printf("\t未有该用户的信息\n");
    }
    while(QY1 != NULL)
    {
        zhanshi2(QY1);
        QY1 = QY1->next;
    }
}

至此,查询模块到此结束

2.3 保存信息

保存信息所使用的主要是文件的操作,掌握好这一部分的内容即可。

2.3.1 车次

代码:

void BaoB(Bcjd* H)//保存班次信息
{
    Bcjd* BB1;
    FILE* fp1;
    BB1 = H->next;
    if((fp1 = fopen("data\\test1.txt","wb")) == NULL)
    {
        printf("\t文件打开失败\n");
        exit(0);
    }
    else
    {
        printf("\t文件保存成功\n");
    }
    while(BB1)//BB1不为空就写入到文件
    {
        /*char arr1[1024] = {0};
        sprintf(arr1,"%s %s %s %s %s %d %d\n",BB1->data1.checi,BB1->data1.origin,BB1->data1.endpoint,BB1->data1.time1,BB1->data1.time2,BB1->data1.price,BB1->data1.shuliang);*/
        fwrite(BB1,sizeof(Bcjd),1,fp1);
        BB1 = BB1->next;
    }
    fclose(fp1);
}

2.3.2 用户

代码:

void BaoY(Yhjd* Y)//保存用户信息
{
    Yhjd* BB2;
    FILE* fp2;
    BB2 = Y->next;
    if((fp2 = fopen("data\\test2.txt","wb")) == NULL)
    {
        printf("\t文件打开失败\n");
        exit(0);
    }
    else
    {
        printf("\t文件保存成功\n");
    }
    while(BB2)//BB2不为空就写入到文件
    {
        /*char arr2[1024] = {0};
        sprintf(arr2,"%s %s %s %s\n",BB2->data2.name,BB2->data2.sfz,BB2->data2.dianhua,BB2->data2.yhcheci);*/
        fwrite(BB2,sizeof(Yhjd),1,fp2);
        BB2 = BB2->next;
    }
    fclose(fp2);
}

文件操作没什么可多介绍的,也可自己操作。

2.4 载入信息

对于信息的载入,也是关于文件操作的,掌握文件知识即可。

2.4.1 车次

代码:

void ZRB(Bcjd* ZB)//班次信息载入
{
    Bcjd* ZB1;
    FILE* fp1;
    ZB->next = NULL;
    ZB1 = ZB;//相当于单个头节点
    if((fp1 = fopen("data\\test1.txt","rb")) == NULL)
    {
        printf("\t文件信息载入失败\n");
    }
    else
    {
        printf("\t文件信息载入成功\n");
        while(!feof(fp1))//读取到文件结尾
        {
            Bcjd* ZB2 = (Bcjd*)malloc(sizeof(Bcjd));
            if(fread(ZB2,sizeof(Bcjd),1,fp1) != 1)
            {
                break;
            }
            else
            {
                ZB2->next = NULL;
                ZB1->next = ZB2;
                ZB1 = ZB2;
            }
        }
    }
    fclose(fp1);
}

2.4.2 用户

代码:

void ZRY(Yhjd* ZY)//用户信息载入
{
    Yhjd* ZY1;
    FILE* fp2;
    ZY->next = NULL;
    ZY1 = ZY;//相当于单个头节点
    if((fp2 = fopen("data\\test2.txt","rb")) == NULL)
    {
        printf("\t文件信息载入失败\n");
    }
    else
    {
        printf("\t文件信息载入成功\n");
        while(!feof(fp2))//读取到文件结尾
        {
            Yhjd* ZY2 = (Yhjd*)malloc(sizeof(Yhjd));
            if(fread(ZY2, sizeof(Yhjd), 1, fp2) != 1)//以二进制读入
            {
                break;
            }
            else
            {   //相当于录入信息
                ZY2->next = NULL;
                ZY1->next = ZY2;
                ZY1 = ZY2;
            }
        }
    }
    fclose(fp2);
}

至此,关于文件的操作已全部结束

2.5 订票模块

对于订票来说,我们要先让用户输入想要查询的车次名称,并且要对用户输入的车次名称进行查询处理判断车次名称是否存在,存在后我们在让用户输入个人信息,这一步也正是录入用户信息的第二种模式。

另外,订完票后需将票数减一。这也是此系统的一个漏点,就是没有判断票数减一后的状态,就是减一后若为负,那我这个系统则还可以买,这就不符合规定了。所以,各位可进行其完善。

老规矩,我们直接看下运行效果:

此为车次不存在情况。

再看一下,车次存在时

我们可以看到,当我们输入完个人信息后,会显示下我们的订单信息。

下面,我们来看代码:

void dingpiao(Bcjd* BN,Yhjd* YN)//订票函数
{
    Bcjd* BM;//班次头节点
    Yhjd* YM;//用户头节点
    char temp[1000];//可供交换的空字符串
    BM = BN;
    char LC[1000];//预定车次
    printf("************************火车订单**********************\n");
    printf("请输入您要预定的车次名称:\n");
    scanf("%s",LC);
    while(BM != NULL)
    {
        if(strcmp(BM->data1.checi,LC) == 0)//找到该车次
        {
            break;
        }
        BM = BM->next;
    }
    if(BM == NULL)
    {
        printf("暂无该车次的车票,");
    }
    else//找到该车次后录入用户信息
    {
        YM = YN;
        Luruyh2(YM,LC);//将车次传递给函数
        while (YM->next != NULL)
        {
            YM = YM->next;
        }
        zhanshi2(YM);//展示订单
        BM->data1.shuliang = BM->data1.shuliang - 1;//订票后票数减一
        printf("你已成功订票,");
    }
}

 此函数调用了两个函数,分别为Luruyh2()和zhanshi2(),在前文我们已有zhanshi2()函数,为展示单个用户信息函数,我们就不过多做介绍。

我们着重来了解下Luruyg2()函数,为订票函数里的录入用户信息函数。

直接看代码:

void Luruyh2(Yhjd* Q2,char* lc)//通过订票来录入用户
{
    Yhjd* luy2;//头节点
    Yhjd* ruy2;
    luy2 = Q2;
    char temp[1000];//可供交换的空字符串
    while(luy2->next != NULL)
    {
        luy2 = luy2->next;//找到尾节点
    }
    ruy2 = (Yhjd* )malloc(sizeof(Yhjd));
    if(ruy2 == NULL)
    {
        printf("录入出错! ");
    }
    else
    {
        printf("\t请输入您的姓名:\n");
        scanf("%s",&ruy2->data2.name);
        printf("\t请输入您的身份证号:\n");
        scanf("%s",&ruy2->data2.sfz);
        printf("\t请输入您的手机号:\n");
        scanf("%s",&ruy2->data2.dianhua);
        strcpy(temp,lc);//将用户所订的车次赋值给结构体
        strcpy(lc,ruy2->data2.yhcheci);
        strcpy(ruy2->data2.yhcheci,temp);
        ruy2->next = NULL;
        luy2->next = ruy2;
        ruy2 = luy2;
    }
}

 

和录入模块中的录入用户很相像,两者稍作改动即可一样。

ok,订票模块结束

2.6 退票模块

对于退票来说,我们也是先让用户输入其想要退订的车次名称,判断下该车次是否存在,再让其用户输入其身份证号,来进行判断该用户是否订票,若存在,则进行展示其订单信息。然后完成退票操作即可。

注意:退完票后需将票数加一

我们来看其效果:

下面,代码:

void tuipiao(Bcjd* TB,Yhjd* TY)//退票函数
{
    Bcjd* Tub1,* Tub2;
    Yhjd* Tuy1,* Tuy2;
    //Tuy2 = (Yhjd *)malloc(sizeof(Yhjd));
    char Tup[1000];//退票的车次名称
    char sfz2[1000];//退票时的身份证号
    Tuy1 = TY;
    Tub1 = TB;
    printf("请输入您要退订的车次名称:\n");
    scanf("%s",Tup);
    printf("请输入您的身份证号:\n");
    scanf("%s",sfz2);
    while(Tuy1 != NULL)
    {
        if((strcmp(Tuy1->data2.sfz,sfz2) == 0) && (strcmp(Tuy1->data2.yhcheci,Tup) == 0))
        {
            printf("您当前的订单信息为:\n");
            zhanshi2(Tuy1);
            break;
        }
        else
        {   Tuy2 = Tuy1;//保存住删除节点的前一节点
            Tuy1 = Tuy1->next;
        }
    }
    if(Tuy1 == NULL)//为空说明没有用户订票信息
    {
        printf("无该用户订票信息,");
    }
    else//只要不为空来结束循环,则就说明有该用户订票(这一步主要完成票数的删减和删除退票用户的信息)
    {
        while(Tub1 != NULL)
        {
            if(strcmp(Tub1->data1.checi,Tup) == 0)//找到用户所订的车次
            {
                break;
            }
            else
            {
                Tub1 = Tub1->next;
            }
        }
        if(Tub1 == NULL)//以尾节点来结束循环时,自然就没有信息
        {
            printf("无订票信息");
        }
        else
        {
            Tub1->data1.shuliang+=1;//将票数加1
            Tuy2->next = Tuy1->next;//删除节点
            free(Tuy1);
        }
        printf("您已成功退票,");
    }
}

此函数只调用了一个函数zhanshi2(),用来展示用户的个人信息。

ok,退票模块结束

2.7 系统维护

对于系统维护来说,此系统主要包括改正和删除,此模块的实现主要依靠链表的改和删,掌握好这部分内容即可。

2.7.1 车次

改:先输入车次名称判断要修改的车次是否存在,若存在后,会出来修改菜单,可进行其选择要修改的信息,选择后修改即可。

删:先输入车次名称判车次是否存在,若存在,直接将其删除即可。

改:

运行效果:

 代码:

void Gzbc(Bcjd* H)//改正班次信息
{
    Bcjd* Gb1;
    Bcjd* H1;
    Gb1 = H->next;
    char Xgb[1000];
    int xh = 0;
    if(Gb1 == NULL)
    {
        printf("\t暂时没有信息可供修改\n");
    }
    else
        {
            printf("\t请输入您要修改的车次名称:\n");
            scanf("%s",Xgb);
            while(strcmp(Gb1->data1.checi,Xgb) != 0)//找到了就退出循环
            {
                Gb1 = Gb1->next;
                if(Gb1 == NULL)
                {
                    printf("没有该班次的信息,");
                    break;
                }
            }
        }
    if(Gb1)//Gb1为空的时候退出了循环,因为空是0,0是假
    {
        printf("\t1.车次名称\n\t2.始发站\n\t3.终点站\n\t4.出发时间\n\t5.到达时间\n\t6.票价\n\t7.票数\n");
        printf("\t请输入您要修改的序号:\n");
        scanf("%d",&xh);
        switch(xh)
        {
             case 1:
                 printf("请输入修改的车次名称:\n");
                 scanf("%s",&Gb1->data1.checi);
                 Xgbcc(Gb1);
                 break;
             case 2:
                 printf("请输入修改的始发站:\n");
                 scanf("%s",&Gb1->data1.origin);
                 break;
             case 3:
                 printf("请输入修改的终点站:\n");
                 scanf("%s",&Gb1->data1.endpoint);
                 break;
             case 4:
                 printf("请输入修改的出发时间:\n");
                 scanf("%s",&Gb1->data1.time1);
                 break;
             case 5:
                 printf("请输入修改的到达时间:\n");
                 scanf("%s",&Gb1->data1.time2);
                 break;
             case 6:
                 printf("请输入修改的票价:\n");
                 scanf("%d",&Gb1->data1.price);
                 break;
             case 7:
                 printf("请输入修改的票数:\n");
                 scanf("%d",&Gb1->data1.shuliang);
                 Pshu(Gb1);
                 break;
            default:
				printf("\t输入错误!\n");
        }
        if (xh >= 1 && xh <= 7)//如果xh输入合法则修改成功
				printf("修改成功,请按任意键返回原菜单\n");
    }
}

此函数调用了两个判断函数,分别是修改后的车次查重和票数查重,票数查重还是调用原来函数Pshu(),我们只介绍修改后的车次查重Xgbcc()。

代码:

void Xgbcc(Bcjd* Gb1)//修改车次名称的查重
{
    Bcjd* Gb2;
    Bcjd* Gb3;
    Gb2 = Gb1->next;
    while(Gb2)
    {
        if(strcmp(Gb1->data1.checi,Gb2->data1.checi) == 0)
        {
            printf("当前班次信息已存在,请重新输入:\n");
            scanf("%s",&Gb1->data1.checi);
            Xgbcc(Gb1);
        }
        else
        {
            Gb2 = Gb2->next;//因为之前的那些节点已经判断过查重过了,所以就在当前节点往后查重就行了
        }

    }
}

原理和一开始的那个车次查重相同。

删:

运行效果:

代码:

void SCbc(Bcjd* SB)//删除班次链表的节点
{
    Bcjd* SB1;//头节点
    Bcjd* SB2;
    char SCB[1000];
    SB1 = SB;
    if(SB1 == NULL)
    {
        printf("\t暂无可删除的信息\n");
    }
    printf("\t请输入您要删除的车次名称:\n");
    scanf("%s",SCB);
    while(SB1 != NULL)
    {
        if(strcmp(SB1->data1.checi,SCB) == 0)//找到车次名称
        {
            break;
        }
        else
        {
            SB2 = SB1;//保存住前一节点
            SB1 = SB1->next;
        }
    }
    if(SB1 == NULL)
    {
        printf("\t未找到该车次的信息,请按任意键返回原菜单");
    }
    else
    {
        SB2->next = SB1->next;//删除节点
        free(SB1);
		printf("   删除完毕,请按任意键返回原菜单");
    }
}

 

2.7.2 用户

改:对于用户来说,先进行输入用户的身份证号,判断其用户是否存在,若存在,则可进行选择其修改的信息,选择后进行修改即可。

删:先进行输入用户的身份证号,若存在,则直接进行删除即可。

改:

运行效果:

 代码:

void Gzyh(Yhjd* Y)//改正用户信息
{
    Yhjd* Gy1;
    Yhjd* Y1;
    Gy1 = Y->next;
    char Xgy[1000];
    int xy = 0;
    if(Gy1 == NULL)
    {
        printf("\t暂时没有信息可供修改\n");
    }
    else
        {
            printf("\t请输入您要修改的身份证号:\n");
            scanf("%s",Xgy);
            while(strcmp(Gy1->data2.sfz,Xgy) != 0)//找到了就退出循环
            {
                Gy1 = Gy1->next;
                if(Gy1 == NULL)
                {
                    printf("没有该用户的信息,");
                    break;
                }
            }
        }
    if(Gy1)//Gy1为空的时候退出了循环,因为空是0,0是假
    {
        printf("\t1.姓名\n\t2.身份证号\n\t3.手机号码\n\t4.所订的车次名称\n");
        printf("\t请输入您要修改的序号:\n");
        scanf("%d",&xy);
        switch(xy)
        {
             case 1:
                 printf("请输入修改的姓名:\n");
                 scanf("%s",&Gy1->data2.name);
                 break;
             case 2:
                 printf("请输入修改的身份证号:\n");
                 scanf("%s",&Gy1->data2.sfz);
                 break;
             case 3:
                 printf("请输入修改的手机号码:\n");
                 scanf("%s",&Gy1->data2.dianhua);
                 break;
             case 4:
                 printf("请输入修改的所订车次名称:\n");
                 scanf("%s",&Gy1->data2.yhcheci);
                 break;
            default:
				printf("\t输入错误!\n");
        }
        if (xy >= 1 && xy <= 7)//如果xy输入合法则修改成功
				printf("修改成功,请按任意键返回原菜单\n");
    }
}

删:

运行效果:

代码:

void SCyh(Yhjd* SY)//删除用户链表的节点
{
    Yhjd* SY1;//头节点
    Yhjd* SY2;
    char SCY[1000];
    SY1 = SY;
    if(SY1 == NULL)
    {
        printf("\t暂无可删除的信息\n");
    }
    printf("\t请输入您要删除的身份证号:\n");
    scanf("%s",SCY);
    while(SY1 != NULL)
    {
        if(strcmp(SY1->data2.sfz,SCY) == 0)//找到该用户
        {
            break;
        }
        else
        {
            SY2 = SY1;//保存住前一节点
            SY1 = SY1->next;
        }
    }
    if(SY1 == NULL)
    {
        printf("\t未找到该用户的信息,请按任意键返回原菜单");
    }
    else
    {
        SY2->next = SY1->next;//删除节点
        free(SY1);
		printf("   删除完毕,请按任意键返回原菜单");
    }
}

 综上,为系统维护的全部信息

最后给出主函数,结束

int main()
{
    int option;
    int lr;//录入函数的进行的选择
    //char a[100],b[100];//录入函数中的输入
    int cx;//查询函数进行的选择
    int bc;//查询班次信息的选择
    int lichehao;//前期的准备(列车号,终点站)
    int zdz;
    int yh;//用户
    int wh;//用于维护的选择
    int gs1;//改正火车信息
    int gs2;//改正用户信息
    int bcb;//保存信息
    int zrb;//载入信息
    Bcjd* H;
    Yhjd* Y;
    H = (Bcjd*)malloc(sizeof(Bcjd));
    Y = (Yhjd*)malloc(sizeof(Yhjd));//开辟空间给头节点
    H->next = NULL;
    Y->next = NULL;
    do
    {
    system("cls");//清屏
    option = menu();//得到选项值
    switch(option)
    {
     case 1:
        do{
            system("cls");
            lr = luru();
        if(lr == 1)
        {
            system("cls");
            Lurubc(H);//录入班次信息
            //zhanshi(H);
            printf("录入已完成,请按任意键返回原菜单\n");
            getch();
        }
        if(lr == 2)
        {
            system("cls");
            Luruyh(Y);//录入用户信息
            //zhanshi2(Y);
            printf("录入已完成,请按任意键返回原菜单\n");
            getch();
        }
        }while(lr != 0);
        //getch();
        break;
     case 2:
        do
        {
            system("cls");
            cx = chaxun();
            if(cx == 1)
            {
                do
                {
                    system("cls");
                    bc = banci();
                    if(bc == 1)
                    {
                        system("cls");
                        Chalieche(H);
                        printf("查询结束,谢谢使用,请按任意键返回原菜单\n");//按列车号查询班次函数
                        getch();
                        //break;
                    }
                    if(bc == 2)
                    {
                        system("cls");
                        Chazdz(H);
                        printf("查询结束,谢谢使用,请按任意键返回原菜单\n");//按终点站查询班次函数
                        getch();
                        //break;
                    }
                    if(bc == 3)
                    {
                        system("cls");
                        Chaxqb(H);
                        printf("查询结束,谢谢使用,请按任意键返回原菜单\n");
                        getch();
                    }
                }while(bc != 0);
            }
               if(cx == 2)
              {
                do
                {
                    system("cls");
                    yh = yonghu();
                    if(yh == 1)
                    {
                        system("cls");
                        Chayh(Y);
                        printf("查询结束,谢谢使用,请按任意键返回原菜单\n");
                        getch();
                    }
                    if(yh == 2)
                    {
                        system("cls");
                        Chaxqy(Y);
                        printf("查询结束,谢谢使用,请按任意键返回原菜单\n");
                        getch();
                    }
                }while(yh != 0);
              }

        }while(cx != 0);

        break;
     case 3:
         do
         {
             system("cls");
             bcb = BcB();
             if(bcb == 1)
             {
                 system("cls");
                 BaoB(H);
                 printf("班次信息已保存,请按任意键返回原菜单\n");
                 getch();
             }
             if(bcb == 2)
             {
                 system("cls");
                 BaoY(Y);
                 printf("用户信息已保存,请按任意键返回原菜单\n");
                 getch();
             }
         }while(bcb != 0);
        break;
     case 4:
         do
         {
             system("cls");
             zrb = ZrB();
             if(zrb == 1)
             {
                 system("cls");
                 ZRB(H);
                 printf("已载入班次信息,请按任意键返回原菜单\n");
                 getch();
             }
             if(zrb == 2)
             {
                 system("cls");
                 ZRY(Y);
                 printf("已载入用户信息,请按任意键返回原菜单\n");
                 getch();
             }
         }while(zrb != 0);
        break;
     case 5:
        system("cls");
        dingpiao(H,Y);//订票函数
        printf("请按任意键返回主菜单\n");
        getch();
        break;
     case 6:
        system("cls");
        tuipiao(H,Y);
        printf("请按任意键返回主菜单\n");//退票函数
        getch();
        break;
     case 7:
         do
         {
             system("cls");
             wh = weihu();
             if(wh == 1)
             {
                 do
                 {
                     system("cls");
                     gs1 = hcgaishan();
                     if(gs1 == 1)
                     {
                         system("cls");
                         Gzbc(H);
                         //printf("请按任意键返回原菜单\n");//改正班次函数
                         getch();
                     }
                     if(gs1 == 2)
                     {
                         system("cls");
                         SCbc(H);
                         //printf("删除完毕,请按任意键返回原菜单\n");//删除班次函数
                         getch();
                     }

                 }while(gs1 != 0);
             }
             if(wh == 2)
             {
                 do
                 {
                     system("cls");
                     gs2 = yhgaishan();
                     if(gs2 == 1)
                     {
                         system("cls");
                         Gzyh(Y);
                         //printf("请按任意键返回原菜单\n");//改正用户函数
                         getch();
                     }
                     if(gs2 == 2)
                     {
                         system("cls");
                         SCyh(Y);
                         //printf("删除完毕,请按任意键返回原菜单\n");//删除用户函数
                         getch();
                     }
                 }while(gs2 != 0);
             }

         }while(wh != 0);

        break;
    }
    }while(option != 0);//当选项为0时跳出
    system("cls");
    return 0;
}

  • 19
    点赞
  • 99
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值