工程实践1(飞机订票系统)

一、项目介绍
在老师提供的工程实践项目中选择了飞机订票系统,目前主要完成了管理员的录入、删除、修改以及乘客的查询、预订、退订操作。
二、设计思路
先将不同用户功能分开,接着对项目数据进行设计,声明结构体,确定变量类型等等,最后进行编码。
三、代码
运行环境:codeblocks-20.03mingw

/*
    文件名: main
    作者: NutG
    日期: 2021-6-15
    描述: 系统主文件,包含乘客及管理员功能实现的函数
    修改说明: 对功能进行完善
              修改系统界面,使其更为方便使用 2021-6-15
              完善缺少的管理员删除功能 2021-6-17
              添加部分缺失注释 2021-6-18
    版本声明: 第四版
*/


#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>
#include <time.h>
#include "searchFunction.c"

#define airfile "../files/airInfo.dat"
#define cusfile "../files/cusInfo.dat"
#define accfile "../files/accountInfo.dat"


int getTimeNum(void);
extern void freeFinfNode(FINF* head);
extern void freeOinfNode(OINF* head);


void cusLog(void);
void managerLog(void);
void accRegist(void);

int cusOper(LOG* passage);
int managerOper(LOG* passage);

extern FINF* searchFlight(char flightNum[],FINF* head);
extern FINF* searchDelFlight(char flightNum[],FINF* head);
extern OINF* searchOrdNum(int ordNum,OINF* head);          //通过订单号查询
extern FINF* searchEnd(FINF* head);
extern FINF* searchFlightSite(FINF* head,char source[],char dest[]);

/*
    全局变量fligHead
    功能: 将航班信息以链表形式存储
*/
FINF* fligHead;


/*
    函数功能: 整体流程控制
    输入参数: 无
    输出参数: 无
    返回值: 0
    调用关系(函数、表): cusLog
                          managerLog
                          accRegist
*/
int main(void)
{
    int ctr = 0;            //接受用户输入以进行操作判断

    FINF* p;
    FILE* fp;

    fligHead = NULL;
    fp = fopen(airfile,"rb+");

    //读取文件中的航班信息以链表形式存储
    while(1)
    {
        p = (FINF*)malloc(sizeof(FINF));
        p->next = NULL;
        if(fscanf(fp,"%s %s %s %s %f %f %f %f %d %d",p->flightNum,p->airNum,p->source,p->dest,&p->depart,&p->fall,
               &p->fare,&p->discount,&p->total,&p->remain)==EOF)
        {
            break;
        }
        if(fligHead == NULL)
        {
            fligHead = p;
        }
        else
        {
            p->next = fligHead;
            fligHead = p;
        }
    }/*----end-----*/

    fclose(fp);

    //输出菜单,直到用户退出方可结束循环
    do
    {
        fflush(stdin);
        printf("\t┌──────────────────────────────────────────────┐\n");
        printf("\t                  飞机订票系统                  \n");
        printf("\t└──────────────────────────────────────────────┘\n\n");
        printf("\t************************************************\n");
        printf("\t*                 1. 乘客登录                  *\n");
        printf("\t*                 2. 管理员登录                *\n");
        printf("\t*                 3. 注册乘客账号              *\n");
        printf("\t*                 4. 退出系统                  *\n");
        printf("\t************************************************\n\n");
        printf("\t请输入要进行的操作: ");

        if(scanf("%d",&ctr)!=1||ctr>4||ctr<0)
        {
            printf("\n输入格式错误,请重新输入!\n按任意键以继续\n");
            fflush(stdin);
            getchar();
            ctr = 0;
            system("cls");
            continue;
        }
        system("cls");

        //用户不同输入的响应
        switch(ctr)
        {
            case 1:cusLog();break;
            case 2:managerLog();break;
            case 3:accRegist();break;
            case 4: printf("\n\t再见,期待您下次使用本系统\n\t");
                    Sleep(2000);break;
            default:break;
        }/*------分支结束-----*/
    }while(ctr!=4);
    /*----循环结束-------*/

    fp = fopen(airfile,"wb");
    p = fligHead;


    while(p!=NULL)
    {
        fprintf(fp,"%s %s %s %s %.2f %.2f %.1f %.1f %d %d\n",p->flightNum,p->airNum,
                p->source,p->dest,p->depart,p->fall,p->fare,
                p->discount,p->total,p->remain);
        p = p->next;
    }/*---循环结束---*/

    fclose(fp);

    freeFinfNode(fligHead);

    return 0;
}


/*
    函数功能: 实现用户登录
    输入参数: 无
    输出参数: 无
    返回值: 无
    调用关系(函数、表): cusOper()
*/
void cusLog(void)
{
    FILE* fp;
    LOG* head;
    char account[20];
    char password[20];
    int flg = 0;             //确定是否登陆成功
    int flgOper = 0;         //接收Oper函数返回值已确定循环是否结束

    head = malloc(sizeof(LOG));
    fp = fopen(accfile,"rb");

    printf("\t---------------------------\n");
    printf("\t         乘客登录          \n");
    printf("\t---------------------------\n");
    printf("\t***************************\n");
    printf("\t账号:");
    scanf("%s",account);
    printf("\t密码:");
    scanf("%s",password);
    printf("\t***************************\n");

    //对比accountData文件内容,实现登录
    while(fscanf(fp,"%d %s %s %s %s",&head->ctrNum,head->name,head->IDNum,head->account,head->password)!=EOF)
    {
        if(strcmp(head->account,account)==0&&strcmp(head->password,password)==0&&head->ctrNum==0)
        {
            printf("\t登陆成功( ̄▽ ̄)");
            Sleep(1000);
            printf("\t欢迎您,%s!\n",head->name);
            system("cls");
            flg = 1;
            flgOper = cusOper(head);
            break;
        }
        else
        {
            continue;
        }
    }/*---循环结束---*/
    if(!flg)
        {
            printf("\t账号或密码错误!╮(╯﹏╰)╭\n\t");
            Sleep(1000);
            system("cls");
        }

    //乘客菜单循环
    while(flgOper)
    {
        flgOper = cusOper(head);
    }/*---循环结束---*/

    fclose(fp);

}

/*
    函数功能: 管理员登录
    输入参数: 无
    输出参数: 无
    返回值: 无
    调用关系(函数、表): managerOper()
*/
void managerLog(void)
{
    FILE* fp;
    LOG* head;
    char account[20];
    char password[20];
    int flg = 0;                //管理员登录成功标志 1
    int flgOper = 0;            //接收管理员操作返回值确定是否结束循环

    head = malloc(sizeof(LOG));
    fp = fopen(accfile,"rb");

    printf("\t---------------------------\n");
    printf("\t        管理员登录         \n");
    printf("\t---------------------------\n");
    printf("\t***************************\n");
    printf("\t账号:");
    scanf("%s",account);
    printf("\t密码:");
    scanf("%s",password);
    printf("\t***************************\n");

    rewind(fp);

    //对比accountData文件内容,实现登录
    while(fscanf(fp,"%d %s %s %s %s",&head->ctrNum,head->name,head->IDNum,head->account,head->password)!=EOF)
    {
        if(strcmp(head->account,account)==0&&strcmp(head->password,password)==0&&head->ctrNum==1)
        {
            printf("\t登陆成功( ̄▽ ̄)\n");
            printf("\t欢迎您,%s!\n\t",head->name);
            Sleep(1000);
            system("cls");
            flg = 1;
            flgOper = managerOper(head);
            break;
        }
        else
        {
            continue;
        }
    }/*---循环结束---*/

    if(!flg)
    {
        printf("\t账号或密码错误!╮(╯﹏╰)╭\n\t");
        Sleep(1000);
        system("cls");
    }

    //管理员操作循环
    while(flgOper)
    {
        flgOper = managerOper(head);
    }/*---循环结束---*/
    fclose(fp);

}

/*
    函数功能: 乘客账号注册
    输入参数: 无
    输出参数: 无
    返回值: 无
    调用关系(函数、表): 未调用自定函数
*/
void accRegist(void)
{
    FILE* fp;
    LOG passage;

    fp = fopen(accfile,"ab");

    printf("\t---------------------------\n");
    printf("\t        乘客账号注册       \n");
    printf("\t---------------------------\n");
    printf("\t***************************\n");
    printf("\t姓名:");
    scanf("%s",passage.name);
    printf("\t证件号:");
    scanf("%s",passage.IDNum);
    printf("\t账号:");
    scanf("%s",passage.account);
    printf("\t密码:");
    scanf("%s",passage.password);
    printf("\t***************************\n");

    fprintf(fp,"%d %s %s %s %s\n",0,passage.name,passage.IDNum,passage.account,passage.password);
    fclose(fp);

    printf("\t注册成功,%s\n\t",passage.name);
    Sleep(1000);
    system("cls");
}

/*
    函数功能: 实现乘客操作功能
    输入参数: 登录账号信息地址
    输出参数: 无
    返回值: 0(退出cusLog()中的调用)/1(重复cusLog()中的调用)
    调用关系(函数、表): searchFlight
                          searchFlightSite
                          searchOrdNum
                          getTimeNow
                          freeOinfNode
*/
int cusOper(LOG* passage)
{
    int ctrNum;            //接收乘客输入控制流程
    int ctrNum2;           //接收乘客查询航班界面的输入
    int ordCount = 0;      //订单计数以控制格式输出
    char ctrC;             //删除退订操作二次确认
    char flightNum[20];
    char source[20];
    char dest[20];

    FILE* fp;
    OINF* ordHead;
    OINF* p;
    OINF* tail;
    OINF* obj_;             //接收查询到订单地址
    FINF* obj;              //接收查询到航班地址


    ordHead = NULL;
    fp=fopen(cusfile,"rb+");

    //订单信息读取
    while(1)
    {
        p = (OINF*)malloc(sizeof(OINF));
        p->next = NULL;
        if(fscanf(fp,"%d %s %s %s",&p->num,p->name,p->IDnum,p->flightNum)==EOF)
        {
            break;
        }
        if(ordHead==NULL)
        {
            ordHead = p;
            tail = p;
        }
        else
        {
            tail->next = p;
            tail = p;
        }


    }/*----循环结束----*/

    printf("\t乘客操作:\n");
    printf("\t*****************************\n");
    printf("\t*       1. 查询航班         *\n");
    printf("\t*       2. 预订航班         *\n");
    printf("\t*       3. 退订航班         *\n");
    printf("\t*       4. 退出             *\n");
    printf("\t*****************************\n");
    printf("\t请选择您要进行的操作:");

    //输入格式错误判定
    if(scanf("%d",&ctrNum)!=1||ctrNum>4||ctrNum<1)
    {
        printf("\n\t输入格式错误,请重新输入!\n\t按任意键以继续\n\t");
        fflush(stdin);
        getchar();

        system("cls");

        return 1;
    }

    //查询航班操作
    if(ctrNum==1)
    {
        system("cls");
        printf("\t航班查询:\n");
        printf("\t********************************\n");
        printf("\t*         1. 航班编号          *\n");
        printf("\t*         2. 起飞-降落地点     *\n");
        printf("\t********************************\n");
        printf("\t请输入您的操作:");
        if(scanf("%d",&ctrNum2)!=1||ctrNum2>3||ctrNum2<1)
    {
        printf("\n\t输入格式错误,请重新输入!\n\t按任意键以继续\n\t");
        fflush(stdin);
        getchar();

        system("cls");

        return 1;
    }
        //航班编号查询
        if(ctrNum2==1)
        {
            printf("\t请输入航班编号:");
            scanf("%s",flightNum);
            printf("\n");
            obj = searchFlight(flightNum,fligHead);
            if(obj==NULL)
            {
                printf("\t未查询到您需要的航班╮(╯﹏╰)╭\n\t");
                Sleep(1000);

                system("cls");
            }
            else
            {
                printf("\t您所查询的航班信息如下:\n");
                printf("\t航班编号 飞机编号 起飞地点 降落地点 起飞时间 降落时间 票价     折扣     总票数   剩余票数\n");
                printf("\t*****************************************************\n");
                printf("\t%-8s %-8s %-8s %-8s %-8.2f %-8.2f %-8.1f %-8.1f %-8d %-8d\n",obj->flightNum,obj->airNum,obj->source
                       ,obj->dest,obj->depart,obj->fall,obj->fare,obj->discount,obj->total,obj->remain);
                printf("\t*****************************************************\n\n");
                printf("\t请记下航班编号后前往“预订航班”中进行预订( ̄▽ ̄)\n");
                printf("\t按任意键以继续\n\t");
                fflush(stdin);
                getchar();
                system("cls");
            }
        }
        //航班起降地点查询
        else if(ctrNum2==2)
        {
            printf("\t请输入航班起降地点(形如“起飞地点 降落地点”)\n\t");
            scanf("%s %s",source,dest);

            obj = searchFlightSite(fligHead,source,dest);
            if(obj==NULL)
            {
                printf("\t未查询到您需要的航班╮(╯﹏╰)╭\n\t");
                Sleep(1000);
                system("cls");
            }
            else if(obj!=NULL)
            {
                printf("\n\t查询到的航班信息如下:\n");
                printf("\t航班编号 飞机编号 起飞地点 降落地点 起飞时间 降落时间 票价     折扣     总票数   剩余票数\n");
                printf("\t*****************************************************\n");
                while(obj!=NULL)
                {
                    printf("\t%-8s %-8s %-8s %-8s %-8.2f %-8.2f %-8.1f %-8.1f %-8d %-8d\n",obj->flightNum,obj->airNum,obj->source
                        ,obj->dest,obj->depart,obj->fall,obj->fare,obj->discount,obj->total,obj->remain);
                    obj = searchFlightSite(obj->next,source,dest);
                }
                printf("\t*****************************************************\n");
                printf("\t请记下航班编号后前往“预订航班”中进行预订( ̄▽ ̄)\n");
                printf("\t按任意键以继续\n\t");
                fflush(stdin);
                getchar();
                system("cls");
            }

        }

    }/*---查询航班功能结束---*/

    //预定航班
    else if(ctrNum==2)
    {
        printf("\t请输入需预订航班的航班号:");
        scanf("%s",flightNum);
        obj = searchFlight(flightNum,fligHead);
        if(obj==NULL)
        {
            printf("\t未查询到该航班!\n\t");
            Sleep(1000);
            system("cls");
            return 1;
        }
        printf("\n\t是否确定预订航班%s:\n",obj->flightNum);
        printf("\t航班编号 飞机编号 起飞地点 降落地点 起飞时间 降落时间 票价     折扣     总票数   剩余票数\n");
        printf("\t*****************************************************\n");
        printf("\t%-8s %-8s %-8s %-8s %-8.2f %-8.2f %-8.1f %-8.1f %-8d %-8d\n",obj->flightNum,obj->airNum,obj->source,obj->dest,obj->depart,
               obj->fall,obj->fare,obj->discount,obj->total,obj->remain);
        printf("\t*****************************************************\n");
        printf("\tY/N(y/n)\n\t");
        fflush(stdin);
        scanf("%c",&ctrC);
        if(ctrC=='Y'||ctrC=='y')
        {
            obj->remain--;
            ordCount = getTimeNum();
            fprintf(fp,"%d %s %s %s\n",ordCount,passage->name,passage->IDNum,obj->flightNum);
            printf("\t预订成功\n\t");
            Sleep(1000);
        }
        system("cls");
    }/*---预定航班功能结束---*/

    //退订航班
    else if(ctrNum==3)
    {
        p = ordHead;

        //剔除不属于本登录账号的订单
        while(p!=NULL)
        {
            if(strcmp(p->name,passage->name)==0&&ordCount==0)
            {
                printf("\n\t订单编号      姓名    证件号码          航班编号");
                printf("\n\t*****************************************************\n");
            }
            if(strcmp(p->name,passage->name)==0)
            {
                printf("\t%-14d%-8s%-18s%-8s\n",p->num,p->name,p->IDnum,p->flightNum);
                ordCount++;
            }
            p = p->next;
        }/*---数据处理结束---*/

        if(ordCount!=0)
        {
            printf("\t*****************************************************\n");
        }

        //无预定航班
        if(ordCount==0)
        {
            printf("\n\t暂无预订订单 ╮(╯﹏╰)╭\n\t");
            Sleep(1000);
            system("cls");
            return 1;
        }
        else
        {
            printf("\t以上为您的预订订单 ( ̄▽ ̄)\n");
        }

        printf("\n\t请输入订单号以退订:");
        scanf("%d",&ctrNum);
        printf("\t是否确定退订?\n\tY/N(y/n)\n\t");
        fflush(stdin);
        scanf("%c",&ctrC);

        if(ctrC=='N'||ctrC=='n')
        {
            printf("\t取消退订成功\n\t");
            Sleep(1000);
        }
        if(ctrC=='Y'||ctrC=='y')
        {
            if(ordHead->num==ctrNum)
            {
                ordHead = ordHead->next;
            }
            else
            {
                obj_ = searchOrdNum(ctrNum,ordHead);
                if(obj_==NULL)
                {
                    printf("\t未查询到该订单╮(╯﹏╰)╭\n\t");
                    Sleep(1000);
                }
                else
                {
                    obj = searchFlight(obj_->next->flightNum,fligHead);
                    obj->remain++;
                    obj_->next = obj_->next->next;
                    printf("\t退订成功( ̄▽ ̄)\n");
                    printf("\t按任意键以继续\n\t");
                    fflush(stdin);
                    getchar();
                }
            }
        }

        fclose(fp);
        fp = fopen(cusfile,"wb");
        p = ordHead;

        //写入修改后的订单信息
        while(p!=NULL)
        {
            fprintf(fp,"%6d %s %s %s\n",p->num,p->name,p->IDnum,p->flightNum);
            p = p->next;
        }/*---循环结束---*/

        system("cls");
    }


    //退出操作
    else if(ctrNum==4)
    {
        system("cls");
        return 0;
    }

    fclose(fp);
    freeOinfNode(ordHead);
    return 1;
}

/*
    函数功能: 实现管理员操作
    输入参数: 登录账号信息地址
    输出参数: 无
    返回值: 0(退出managerLog()中的调用)/1(重复managerLog()中的调用)
    调用关系(函数、表): searchFlight
                          searchDelFlight

*/
int managerOper(LOG* passage)
{
    int ctrNum;
    char flightNum[20];
    FINF* pDest;            //接收查询目标航班信息地址
    FINF* add;              //存储待录入航班信息

    add = (FINF*)malloc(sizeof(FINF));

    printf("\t管理员操作:\n");
    printf("\t*****************************\n");
    printf("\t*      1. 录入航班信息      *\n");
    printf("\t*      2. 修改航班信息      *\n");
    printf("\t*      3. 删除航班信息      *\n");
    printf("\t*      4. 退出操作          *\n");
    printf("\t*****************************\n");
    printf("\t请输入要进行的操作:");

    //输入格式错误判定
    if(scanf("%d",&ctrNum)!=1||ctrNum>4||ctrNum<1)
    {
        printf("\n\t输入格式错误,请重新输入!\n\t按任意键以继续\n\t");
        fflush(stdin);
        getchar();

        system("cls");

        return 1;
    }
    //录入航班信息
    if(ctrNum == 1)
    {
        pDest = searchEnd(fligHead);
        printf("\t请输入需要录入的航班信息:\n");

        printf("\t航班编号:");
        scanf("%s",pDest->flightNum);
        printf("\t飞机编号:");
        scanf("%s",pDest->airNum);
        printf("\t起飞地点:");
        scanf("%s",pDest->source);
        printf("\t降落地点:");
        scanf("%s",pDest->dest);
        printf("\t起飞时间(XX.XX):");
        scanf("%f",&pDest->depart);
        printf("\t降落时间(XX.XX):");
        scanf("%f",&pDest->fall);
        printf("\t票价:");
        scanf("%f",&pDest->fare);
        printf("\t折扣:");
        scanf("%f",&pDest->discount);
        printf("\t总票数:");
        scanf("%d",&pDest->total);
        printf("\t剩余票数:");
        scanf("%d",&pDest->remain);

        add->next = NULL;
        pDest->next = add;

        printf("\t航班信息录入成功!( ̄▽ ̄)\n\t");
        Sleep(1000);

    }/*---录入航班信息功能结束---*/

    //修改航班信息
    else if(ctrNum==2)
    {
        printf("\t请输入要修改的航班编号:");
        scanf("%s",flightNum);
        if((pDest = searchFlight(flightNum,fligHead))==NULL)             //返回需要修改航班的链表地址,如果找不到返回NULL
        {
            printf("\t未找到需要修改的航班信息!╮(╯﹏╰)╭\n");
            printf("\t请重新输入或者退出!\n\t");
            Sleep(1000);
        }
        else
        {
            printf("\t请输入修改后的航班信息:\n");
            printf("\t航班编号:");
            scanf("%s",pDest->flightNum);
            printf("\t飞机编号:");
            scanf("%s",pDest->airNum);
            printf("\t起飞地点:");
            scanf("%s",pDest->source);
            printf("\t降落地点:");
            scanf("%s",pDest->dest);
            printf("\t起飞时间(XX.XX):");
            scanf("%f",&pDest->depart);
            printf("\t降落时间(XX.XX):");
            scanf("%f",&pDest->fall);
            printf("\t票价:");
            scanf("%f",&pDest->fare);
            printf("\t折扣:");
            scanf("%f",&pDest->discount);
            printf("\t总票数:");
            scanf("%d",&pDest->total);
            printf("\t剩余票数:");
            scanf("%d",&pDest->remain);

            printf("\t修改成功!( ̄▽ ̄)\n\t");
            Sleep(1000);
        }

    }/*---修改航班信息功能结束---*/

    //删除航班信息
    else if(ctrNum==3)
    {
        printf("\t请输入要删除航班的航班编号:");
        scanf("%s",flightNum);
        if(strcmp(fligHead->flightNum,flightNum)==0)
        {
            fligHead = fligHead->next;
            printf("\t删除成功!( ̄▽ ̄)\n\t");
            Sleep(1000);
        }
        else if((pDest = searchDelFlight(flightNum,fligHead))!=NULL)
        {
            pDest->next = pDest->next->next;
            printf("\t删除成功!( ̄▽ ̄)\n\t");
            Sleep(1000);
        }
        else
        {
            printf("\t未查询到您需删除的航班!╮(╯﹏╰)╭\n\t");
            Sleep(1000);
        }
    }/*---删除航班信息功能结束---*/

    //退出
    else if(ctrNum==4)
    {
        system("cls");
        return 0;
    }
    else
    {
        printf("\t输入操作序号有误!╮(╯﹏╰)╭\n");
        printf("\t请输入正确的操作序号!\n\t");
        Sleep(1000);
        system("cls");

        return 1;
    }
    system("cls");

    return 1;
}

/*
    函数功能: 获取系统当前时间
    输入参数: 无
    输出参数: 无
    返回值: 将 月日时分秒 以int类型返回
    调用关系(函数、表): 未调用自定函数
*/
int getTimeNum(void)
{
    int timeNum = 0;                //存储处理后的订单号
    time_t now;
    struct tm* nowTime;

    now = time(NULL);
    nowTime = localtime(&now);
    timeNum = nowTime->tm_mon*100000000+100000000+nowTime->tm_mday*1000000
        +nowTime->tm_hour*10000+nowTime->tm_min*100+nowTime->tm_sec;

    return timeNum;
}

/*
    文件名: searchFunction
    作者: NutG
    日期: 2021-6-15
    描述: 包涵主文件中所需要的搜索功能函数的定义
    修改说明: 增添了几个新的搜索函数
              添加注释 2021-6-17
    版本声明: 1.1
*/

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>

#define airfile "../files/airInfo.dat"
#define cusfile "../files/cusInfo.dat"
#define accfile "../files/accountInfo.dat"

typedef struct accData
{
    int ctrNum;
    char name[20];
    char IDNum[20];
    char account[20];
    char password[20];
    struct accData* next;
}LOG;

typedef struct flightInf
{
    char flightNum[20];          //航班编号
    char airNum[20];             //飞机编号
    char source[20];
    char dest[20];
    float depart;
    float fall;
    float fare;
    float discount;
    int total;
    int remain;
    struct flightInf* next;
}FINF;

typedef struct orderInf
{
    int num;
    char name[20];
    char IDnum[20];
    char flightNum[20];
    struct orderInf* next;
}OINF;

void freeFinfNode(FINF* head);
void freeOinfNode(OINF* head);

FINF* searchFlight(char flightNum[],FINF* head);
FINF* searchDelFlight(char flightNum[],FINF* head);
OINF* searchOrdNum(int ordNum,OINF* head);          //通过订单号查询
FINF* searchEnd(FINF* head);
FINF* searchFlightSite(FINF* head,char source[],char dest[]);

/*
    函数功能: 通过航班编号查找航班信息地址
    输入参数: 航班编号flightNum 航班信息链表头head
    输出参数: 无
    返回值: 返回该航班编号的地址/NULL(未查询到匹配航班)
    调用关系(函数、表): 未调用自定函数
*/
FINF* searchFlight(char flightNum[],FINF* head)
{
    FINF* p;
    p = head;

    //链表遍历
    while(p!=NULL)
    {
        if(strcmp(p->flightNum,flightNum)==0)
        {
            return p;
        }
        p = p->next;
    }//循环结束

    return NULL;
}

/*
    函数功能: 通过航班编号查找需要删除的航班信息地址
    输入参数: 待删除航班编号flightNum 航班信息链表头head
    输出参数: 无
    返回值: 返回待删除航班编号所在节点的前一个节点地址/NULL(未查询到匹配航班)
    调用关系(函数、表): 未调用自定函数
*/
FINF* searchDelFlight(char flightNum[],FINF* head)
{
    FINF* p;
    p = head;

    while(p->next!=NULL)
    {
        if(strcmp(flightNum,p->next->flightNum)==0)
        {
            return p;
        }
        p = p->next;
    }

    return NULL;
}

/*
    函数功能: 通过航班起降地点查找航班信息地址
    输入参数: 航班信息链表头head 起飞地点source 降落地点dest
    输出参数: 无
    返回值: 返回该航班地址/NULL(未查询到匹配航班)
    调用关系(函数、表): 未调用自定函数
*/
FINF* searchFlightSite(FINF* head,char source[],char dest[])
{
    FINF* p;

    p = head;
    while(p!=NULL)
    {
        if(strcmp(p->source,source)==0&&strcmp(p->dest,dest)==0)
        {
            return p;
        }
        p = p->next;
    }
    return NULL;
}

/*
    函数功能: 通过订单编号查找订单信息地址
    输入参数: 订单编号ordNum 订单信息链表头head
    输出参数: 无
    返回值: 返回该订单地址/NULL(未查询到匹配订单)
    调用关系(函数、表): 未调用自定函数
*/
OINF* searchOrdNum(int ordNum,OINF* head)
{
    OINF* p;

    p = head;
    while(p->next!=NULL)
    {
        if(p->next->num==ordNum)
        {
            return p;
        }
        p = p->next;
    }
    return NULL;
}

/*
    函数功能: 定位航班信息链表结尾
    输入参数: 航班信息链表头head
    输出参数: 无
    返回值: 返回结尾节点地址
    调用关系(函数、表): 未调用自定函数
*/
FINF* searchEnd(FINF* head)
{
    FINF* p;
    p = head;
    while(p->next!=NULL)
    {
        p = p->next;
    }

    return p;
}

/*
    函数功能: 释放航班信息链表
    输入参数: 航班信息链表头head
    输出参数: 无
    返回值: 无
    调用关系(函数、表): 未调用自定函数
*/
void freeFinfNode(FINF* head)
{
    FINF* p;
    FINF* p2;

    p = head->next;
    p2 = head;
    while(p!=NULL)
    {
        free(p2);

        p2 = p;
        p = p->next;
    }
}

/*
    函数功能: 释放订单信息链表
    输入参数: 订单信息链表头head
    输出参数: 无
    返回值: 无
    调用关系(函数、表): 未调用自定函数
*/
void freeOinfNode(OINF* head)
{
    OINF* p;
    OINF* p2;

    p = head->next;
    p2 = head;
    while(p!=NULL)
    {
        free(p2);

        p2 = p;
        p = p->next;
    }
}

以上为飞机订票系统的源码,因为时间不足,部分细节及功能还暂未实现,也可能会有部分错误,如有问题,请及时告知以修改,多谢!

posted @ 2022-02-12 14:45  Goper  阅读(71)  评论(0编辑  收藏  举报