数据结构课设——航空航天订票系统

文章目录

    • 一、系统简介
    •     1、业务活动
    •     2、操作和功能
    • 二、系统功能模块图
    •     1、系统功能模块图
    •     2、函数功能模块
    • 三、详细描述
    •     1、数据结构
    •     2、设计思路
    • 四、运行结果
    •     1、查询所有航班
    •     2、根据起点终点搜索航班
    •     3、订票
    •     4、退票
    •     5、管理员添加航班
    •     6、管理员删除航班
    • 五、课程设计总结
    •     1、 系统中实现哪些功能,哪些特点?
    •     2、系统不足有哪些?
    • 六、源代码

一、系统简介

    1、业务活动

航空客运订票的业务活动包括:查询航班、搜索航班、订票、退票和插入和删除等。每条航线所涉及的信息有:起点、终点、编号、飞机号、飞行日期、总载客、余票量、1级余量和2级余量。

    2、操作和功能

①查询航班:直接打印出所有航班飞行的信息(起点、终点、编号、飞机号、飞行日期、总载客、余票量、1级余量和2级余量),方便客户订票或者退票。

②搜索航班:根据乘客提供的起点站和终点站,输出对应信息的航班,方便乘客订票,以及排队等候订票。

③订票
(1)订票功能:输入航班编号,需要定的票数,你想要定的舱位等级,姓名身份证号,星期几这些信息,如果该飞机该舱位还有空余,则订票成功,并输出乘客所有的机位。如果位置不够,就输出该航班的订票情况,并且询问客户是否改变计划,选乘其他航班。
(2)由起点和终点搜索航班:根据乘客输入的起点和终点站信息,输出对应航班的信息。
(3)搜索所有航班:打印出所有航班的信息。
(4)由编号查询航班:根据乘客输入的航班编号,输出该航班的信息。
(5)返回上一级。

④退票
(1)办理退票:由乘客输入的姓名,身份证号,以及飞行的日期,若输入的信息完全对应,则退票成功。否则输出信息不正确。
(2)返回上一级。

⑤录入和删除
(1)录入:输入航班信息(起点、终点、编号、飞机号、飞行日期、总载客、余票量、1级余量和2级余量),若该航班不存在,则插入航班链表,若航班已经存在,就输出信息不正常。
(2)删除:直接输入航班编号,若存在就直接删除,若不存在则提示不存在该航班。
(3)返回上一级。

二、系统功能模块图

    1、系统功能模块图

数据结构课设——航空航天订票系统_第1张图片

    2、函数功能模块

- 函数包含关系
数据结构课设——航空航天订票系统_第2张图片
- 函数注解

主函数包含函数
①initFlight(); 初始化一个航班链表。
②Create(Phangban flight1); 将flight1中的信息全部录入到链表中。
③menu(); 主菜单页面(1.查询航班。2.搜索航班。3.订票。4.退票。5. 录入与删除)。

Create函数包含函数
①strcpy(char a,char b); 将flight中的信息复制到链表。
②initCusLinkList(CList &cusLinkList); 初始化已订票乘客指针链表,方便存入链表。
③initQueue(LinkQueue &q); 初始化带头结点的链队列,便于排队侯票预定。

菜单函数包含函数
①printfall(pFlight); 打印出全部航班信息(起点、终点、编号、飞机号、飞行日期、总载客、余票量、1级余量和2级余量)。
②sousuoFace(); 搜索界面(1.搜索航班。2.返回上一级)。
③dingpiaoFace(); 订票界面(1.订票。2.由起点和终点搜索航班。3.搜索所有航班。4.通过航班编号查询客户。5.返回上一级)。
④tuipiaoFace(); 退票界面(1.办理退票。2.返回上一级)。
⑤charushanchuFace(); 插入和删除新节点界面(1.增加航班。2.删除航班。3.返回上一级)。

查询界面函数包含
①printfall(hangban *pflight); 直接输出内存中全部函数信息。

搜索界面函数包含
①sousuoflight(); 通过输入起点和终点站信息,搜索出对应航班信息。

订票界面函数包含
①dingpiao(); 输入你想要定的航班编号,以及你的个人信息,若对应航班还有剩余,则订票成功。若没有剩余,推荐定其他航班或者进入预定队列。
②sousuoflight(); 根据乘客输入的起点和终点搜索对应航班,并打印出来,方便看机位是否还有剩余。
③printfall(pFlight); 打印出全部航班信息。
④pricusInfo(); 输出已经订购该航班的乘客的姓名,身份证号,以及订票等级。

退票界面函数包含
①tuipiao(); 退票功能,通过对比乘客输入的姓名,身份证号,飞行日期,判断是否为该编号飞机的乘客,若对比正确,则可以退票,对应的订票乘客链表删除该信息。

插入删除界面函数包含
①zengjiaFlight(); 增加航班函数,增加航班信息(起点、终点、编号、飞机号、飞行日期、总载客、余票量、1级余量和2级余量)。
②shanchuFlight(); 删除航班函数,输入想要删除的编号,若该航班存在,直接将航班链表该航班删除。

其他函数
①initCusLinkList(CList &cusLinkList); 初始化已订票乘客指针链表。
②initQueue(LinkQueue &q); 初始化带头结点的链队列,队列便于插入预定客户。
③hangban *find(); 输入一个航班编号,查询航班是否存在,若存在就将信息通过结构体指针返回。
④CList addlink(CList &head, int need, char name[], char id[],char day[],int grade); 将订票的客户的订票数量,姓名,身份证号,飞行日期以及订票等级增加到已经订票的用户链表中。
⑤fightinfo(hangban *p); 输出p节点的航班信息(起点、终点、编号、飞机号、飞行日期、总载客、余票量、1级余量和2级余量)。
⑥LinkQueue enqueue(LinkQueue &q, char name[], int need, char id[]); 将排队等候订票的乘客名字已及身份证号入队。
⑦int duibiFlight(hangban *flight, char ID[]); 对比航班的编号,避免增加时重复。

三、详细描述

    1、数据结构

typedef struct CNode {
    char name[20];//姓名
    int num;//订票数 
    char ID[20];//身份证
    char day[20];//飞行日期
    int dengji;//舱等级
    CNode *next;
} CNode, *CList;//乘客节点

typedef struct HbNode {
    char name[20];//姓名
    char ID[20]; //身份证
    int num;//预定数量 
    struct HbNode *next;
} QhbNode, *Phb;//候补队列中的节点

typedef struct Queue {
    Phb front;//等候替补客户名单域的头指针
    Phb rear;//等候替补客户名单域的尾指针
} LinkQueue;//候补队列

typedef struct Cxinxi{
    char name[20];//姓名
    char ID[20]; //身份证
    char day[20];
    int num;//订票量
} Cxinxi;//封装乘客的姓名和订票量和身份证,用于候补客户出队时把关键字返回 

typedef struct hangban {
    char qidian[20];//起点站名
    char zhongdian[20];//终点站名
    char hbID[20];//航班编号 
    char hbnum[20];//飞机号
    char day[20];//飞行日期(星期几)
    int maxnum;//总票数
    int less;//总余票量
    int lessgrade1; //等级1剩余量
    int lessgrade2; //等级2剩余量
    hangban *next;
    CList cusLinkList;//乘员名单域,指向乘员名单链表的头指针
    LinkQueue wQgrade1;//等级1候补,等候替补的客户名单域,指向一个队列
    LinkQueue wQgrade2;//等级2候补,等候替补的客户名单域,指向一个队列
} hangban, hangbanNode, *Phangban;//航班节点

    2、设计思路

数据结构课设——航空航天订票系统_第3张图片

四、运行结果

    1、查询所有航班

数据结构课设——航空航天订票系统_第4张图片

    2、根据起点终点搜索航班

数据结构课设——航空航天订票系统_第5张图片

    3、订票

数据结构课设——航空航天订票系统_第6张图片
数据结构课设——航空航天订票系统_第7张图片

    4、退票

数据结构课设——航空航天订票系统_第8张图片
数据结构课设——航空航天订票系统_第9张图片

    5、管理员添加航班

数据结构课设——航空航天订票系统_第10张图片
数据结构课设——航空航天订票系统_第11张图片

    6、管理员删除航班

数据结构课设——航空航天订票系统_第12张图片
数据结构课设——航空航天订票系统_第13张图片

五、课程设计总结

    1、 系统中实现哪些功能,哪些特点?

1.查询所有的航班信息,并打印出来。

2.输入起点站和终点站,能够准确找到对应的所有航班,并输出这些航班所有的信息。

3.订票功能
(1)通过输入您想要订购的航班编号,若还有空位,输入你的个人信息(姓名,身份证号,订票等级,订票数量,飞行时间),就可以成功订票,对应航班空位减少。若没有空位,可以向你推荐订购其他航班,或者进入预定队列中,有空位置时就可以订票。
(2)由起点和终点搜索航班。
(3) 搜索所有的航班信息,将所有航班信息答打印出来。
(4)通过输入航班的编号输出所有已经定购这个航班的用户信息。

4.退票功能:通过输入订单编号,并且输入你的个人信息(姓名,身份证号,飞行日期),若存在该用户订购该航班,就可以退票。若不存在订购该航班,返回错误。

5.增加和删除航班:
(1)增加航班节点:先输入航班编号,经过对比函数对比,已经存在该航班就返回错误。不存在就可以输入节点信息(起点、终点、编号、飞机号、飞行日期、总载客、余票量、1级余量和2级余量),插入到已经订票客户链表之中。
(2)删除航班节点:输入想要删除的航班编号,若存在就直接从链表中删除,不存在就返回错误。

    2、系统不足有哪些?

1.航班信息直接存在内存中,增加或者删除航班不方便。
2.不能批量增加或删除航班信息或者已经订票客户信息。
3.不能自动为顾客提供相同航线的不同机次的航班,只能通过顾客自己查询。
4.候补时没有询问排在前面的顾客是否满足该航班,是否订购错误,而是直接将候补人员插在队尾。

六、源代码

#include 
#include 
#include 
#include 

typedef struct CNode {
    char name[20];//姓名
    int num;//订票数 
    char ID[20];//身份证
    char day[20];
    int dengji;//舱等级
    CNode *next;
} CNode, *CList;//乘客节点

typedef struct HbNode {
    char name[20];//姓名
    char ID[20]; //身份证
    int num;//预定数量 
    struct HbNode *next;
} QhbNode, *Phb;//候补队列中的节点

typedef struct Queue {
    Phb front;//等候替补客户名单域的头指针
    Phb rear;//等候替补客户名单域的尾指针
} LinkQueue;//候补队列

typedef struct Cxinxi{
    char name[20];//姓名
    char ID[20]; //身份证
    char day[20];
    int num;//订票量
} Cxinxi;//封装乘客的姓名和订票量和身份证,用于候补客户出队时把关键字返回 

typedef struct hangban {
    char qidian[20];//起点站名
    char zhongdian[20];//终点站名
    char hbID[20];//航班编号 
    char hbnum[20];//飞机号
    char day[20];//飞行日期(星期几)
    int maxnum;//总票数
    int less;//总余票量
    int lessgrade1; //等级1剩余量
    int lessgrade2; //等级2剩余量
    hangban *next;
    CList cusLinkList;//乘员名单域,指向乘员名单链表的头指针
    LinkQueue wQgrade1;//等级1候补,等候替补的客户名单域,指向一个队列
    LinkQueue wQgrade2;//等级2候补,等候替补的客户名单域,指向一个队列
} hangban, hangbanNode, *Phangban;//航班节点

void initFlight(); //初始化航班链表
hangban *find(); // 输入编号返回对应信息 
int initQueue(LinkQueue &q);//初始化队列
int initCusLinkList(CList &cusLinkList);//初始化订票乘客链表 
CList addlink(CList &head, int need, char name[], char id[],char day[], int grade);
//将订票成功的乘客节点加入到已订票链表 
void sousuoflight();//由起点终点搜索航班 
void pricusInfo();//输出已经订票的函数 
void dingpiao();// 订票函数 
void fightinfo(hangban *p);//输出对应节点信息 
LinkQueue enqueue(LinkQueue &q, char name[], int need, char id[]);
//将等待的客户入队 
void tuipiao();// 退票
void sousuoFace();// 搜索界面
void dingpiaoFace();//  订票界面
void tuipiaoFace(); //退票界面 
void printfall(hangban *pflight);//打印全部航班信息
int menu();// 菜单界面函数
void charushanchuFace(); //插入和删除 
int zengjiaFlight();//增加航班 
int shanchuFlight();// 删除航班
void sousuoFlight();//由起点和终点搜索对应航班 
int Create(Phangban flight1);//将航班信息插入到链表中 
int duibiFlight(hangban *flight, char flightCodeID[]);
// 对比插入航班标号,防止标号重复 

hangban *pFlight;//全局节点变量 
 //初始输入的航班信息 
hangban flight1[16] = {
        {"上海", "北京", "1", "A1111", "星期一", 200, 200, 90},
        {"北京", "武汉", "2", "B8942", "星期三", 200, 200, 100},
        {"武汉", "广州", "3", "C5465", "星期六", 200, 200, 100},
        {"广州", "福州", "4", "D5645", "星期五", 200, 200, 100},
        {"福州", "长沙", "5", "E4986", "星期一", 200, 200, 100},
        {"长沙", "杭州", "6", "F6545", "星期四", 200, 200, 100},
        {"杭州", "郑州", "7", "G3993", "星期二", 200, 200, 100},
        {"郑州", "南京", "8", "H6533", "星期一", 200, 200, 100},
        {"南京", "西安", "9", "I9662", "星期五", 200, 200, 100},
        {"西安", "重庆", "10", "J8526", "星期日", 200, 200, 100},
        {"重庆", "成都", "11", "K6863", "星期二", 200, 200, 100},
        {"成都", "昆明", "12", "L6666", "星期天", 150, 80, 80},
        {"昆明", "贵阳", "13", "M6546", "星期三", 100, 100, 40},
        {"贵阳", "厦门", "14", "N6562", "星期六", 200, 200, 100},
        {"厦门", "南宁", "15", "K9896", "星期三", 200, 200, 100},
		{"南宁", "北京", "16", "B8665", "星期一", 200, 100, 100},};


void initFlight()// 初始化航班链表
 {
    pFlight = (hangban *) malloc(sizeof(hangban));
    if (pFlight == NULL) exit(0);
    pFlight->next = NULL;
}

int Create(Phangban flight1)// 将已有航班信息插入链表 
 {
    hangban *p = pFlight, *q;
    for (int i=0; i < 16; i++) {
        q = (hangban *) malloc(sizeof(hangban));
        if (q == NULL)
            return 0;
        strcpy(q->qidian, flight1[i].qidian);//利用链表把每个信息录入 
        strcpy(q->zhongdian, flight1[i].zhongdian);
        strcpy(q->hbID, flight1[i].hbID);
        strcpy(q->hbnum, flight1[i].hbnum);
        strcpy(q->day, flight1[i].day);
        q->maxnum = flight1[i].maxnum;
        q->less = flight1[i].maxnum;
        q->lessgrade1 = flight1[i].lessgrade1;
        q->lessgrade2 = flight1[i].maxnum - flight1[i].lessgrade1;
        initCusLinkList(q->cusLinkList); //初始化已经订票乘客链表
        initQueue(q->wQgrade1);// 将两种等级的票入队 ,方便后面预定排队 
        initQueue(q->wQgrade2);
        q->next = p->next;
        p->next = q;
    }
    return 1;
}

int initCusLinkList(CList &cusLinkList)//初始化已订票乘客指针链表 
{
    CList q = cusLinkList;
    cusLinkList = (CNode *) malloc(sizeof(CNode));
    cusLinkList->next = NULL;
}

int initQueue(LinkQueue &q)//初始化带头结点的链队列 
{
    QhbNode *p;
    p = (QhbNode *) malloc(sizeof(QhbNode));
    if (p == NULL) 
	{
        printf("内存不足\n");
        return 0;
    }
    p->next = NULL;
    q.front = q.rear = p;//队空 
    return 1;
}



void sousuoflight() //有起点和终点搜索对应航班 
{
    char qidian[10];
    char zhongdian[10];
    int flag = 0;
    printf("请输入起点站名:");
    scanf("%s", qidian);
    printf("请输入终点站名:");
    scanf("%s", zhongdian);
    struct hangban *p;
    p = pFlight->next;
    printf("起点  终点  编号  飞机号  飞行日期  总载客  余票量  1级余量  2级余量 \n");
    while (p != NULL) 
	{
        if ((strcmp(qidian, p->qidian) == 0) && (strcmp(zhongdian, p->zhongdian) == 0) ) 
//	对比输入的起点和终点,推荐航班 
		{
            flag = 1;
            printf("%4s  %4s  %2s     %5s %8s  %5d   %5d  %6d     %4d\n",p->qidian,p->zhongdian,p->hbID,p->hbnum, p->day,p->maxnum, p->less, p->lessgrade1, p->lessgrade2);
        }
        p = p->next;
    }
    printf("\n\n");
    if (flag == 0)
        printf("不存在该航班! \n");
}

void dingpiao() // 订票函数 
{
    struct hangban *info;
    int need, grade;
    int num;//剩余的等级1数目或者等级2数目
    char name[20];
    char id[20];
    char day[20];
    info = find();//输入想订的航班,看是否还有空位置,并返回复制节点 
    if (info == NULL)
	{
        printf("不存在该航班!\n");
        dingpiao();
    }
  	printf("请输入您想要定得票数:");
        scanf("%d", &need);
    if (need <= 0 ) 
    {
    	printf("请输入您想要定得票数:");
        scanf("%d", &need);
    }
    printf("请输入您的票的舱位等级(1或2):");
    scanf("%d", &grade);
    if (grade == 1)
        num = info->lessgrade1;
    else
        num = info->lessgrade2;
    if (need <= num) //订票数小于剩余数 
	{
        int i;
        printf("请输入您的姓名:");
        scanf("%s", name);
        printf("请输入您的身份证号码:");
        scanf("%s", id);
        printf("请输入你的飞行周期:");
		scanf("%s",day); 
        CList head = info->cusLinkList; 
        addlink(head, need, name, id,day,grade);//订票成功,插入成员名单链表
        for (i = 0; i < need; i++)
            printf("%s 的座位号是: %d\n", name, info->maxnum - info->less + i + 1);
        info->less -= need;
        if (grade == 1)
            info->lessgrade1 -= need;
        else
            info->lessgrade2 -= need;
        printf("\n订票成功!\n");
    } 
	else
        {
            char r;
            printf("该等级的票不足,以下为该航班乘客信息\n");
            fightinfo(info);//输出该航班的订票信息 
            printf("是否改变订票计划?Y/N\n");
            r = getch();
            printf("%c", r);
            if (r == 'Y' || r == 'y') //改变计划,重新选择航班
			{
                dingpiao();//返回订票主页面 
            } 
			else 
			{
                printf("\n您需要排队等候吗?(Y/N)");
                r = getch();
                printf("%c", r);
                if (r == 'Y' || r == 'y') 
				{//不改变计划,排队候票
                    printf("\n请输入您的姓名(排队订票):");
                    scanf("%s", name);
                    printf("\n请输入您的身份证(排队订票):");
                    scanf("%s", id);
                    if (grade == 1) //进入1等舱排队队列
					{
                        info->wQgrade1 = enqueue(info->wQgrade1, name, need, id);
                    } 
					else //进入2等舱排队队列
					{
                        info->wQgrade2 = enqueue(info->wQgrade2, name, need, id);
                    }
                    printf("\n排队成功!\n");
                } 	
            }
        }

}

hangban *find()//根据自己输入的航班标号查询是否存在并返回节点 
{
    char number[10];
    int i = 0;
    printf("请输入航班编号: ");
    scanf("%s", number);
    hangban *p = pFlight->next; //头结点的下一个节点开始遍历
    while (p != NULL) 
	{
        if (!strcmp(number, p->hbID))
            return p;
        p = p->next;
    }
    return NULL;
}

CList addlink(CList &head, int need, char name[], char id[],char day[],int grade)
//插入到已经订票客户链表 
{
    CList new1;//创建一个新节点 
    new1 = (CNode *) malloc(sizeof(CNode));
    if (new1 == NULL) 
	{
        printf("\n内存不足\n");
        return NULL;
    }
    strcpy(new1->name, name);
    strcpy(new1->ID, id);
    strcpy(new1->day,day);
    new1->num = need;
    new1->dengji = grade;
    new1->next = head->next;//头插入法加入成员名单域
    head->next = new1;
    return head;
}

void fightinfo(hangban *p)//输出p节点的航班信息 
{
    printf("起点  终点  编号  飞机号  飞行日期  总载客  余票量  1级余量  2级余量 \n");
     printf("%4s  %4s  %2s     %5s %8s  %5d   %5d  %6d     %4d\n",p->qidian,p->zhongdian,p->hbID,p->hbnum, p->day,p->maxnum, p->less, p->lessgrade1, p->lessgrade2);
    printf("\n\n");

}

LinkQueue enqueue(LinkQueue &q, char name[], int need, char id[])
//入队,增加排队等候的客户名单域
{
    Phb new1;
    new1 = (Phb) malloc(sizeof(QhbNode));
    strcpy(new1->name, name);
    strcpy(new1->ID, id);
    new1->num = need;
    new1->next = NULL;
    q.rear->next = new1;
    q.rear = new1;
    return q;
}

void tuipiao() //退票功能 
{
    struct hangban *info;
    int grade;
    CNode *p1, *p2, *head;//p1为遍历指针,p2指向p1的前驱
    char name[20];//客户姓名
    char id[20];//客户身份证
    char day[20];
    info = find();//复制节点信息给info,find函数根据航班编号返回该航班节点的指针
    while (info == NULL)
	{
        printf("没有这个航班, 请重新输入\n");
        tuipiao();
    }
    head = info->cusLinkList;//head为该航班的的乘员名单域的头指针
    p1 = head->next;    //带头结点的指针,head->next 开始遍历
    printf("请输入你的姓名: ");
    scanf("%s",name);
    printf("请输入你的身份证号码: ");
    scanf("%s", id);
    printf("请输入飞行周期: ");
    scanf("%s",day);
    p2 = head;//根据客户姓名搜索客户是否订票
    while (p1 != NULL) 
	{//对比姓名和身份证 
        if ((strcmp(name, p1->name) == 0) && (strcmp(id, p1->ID) == 0)&&(strcmp(day, p1->day) == 0)) break;
        p2 = p1;
        p1 = p1->next;
    }
    if (p1 == NULL) 
	{
        printf("对不起,你没有订过票或姓名和身份证,与飞行周期不对应\n");
        return;
    } 
	else 
	{//退票成功
        //从乘客名单域中移除该节点
        grade = p1->dengji;
        p2->next = p1->next;
        //加回该航班的剩余票
        info->less += p1->num;
        if (grade == 1) 
		{
            info->lessgrade1 += p1->num;
        } 
		else 
		{
            info->lessgrade2 += p1->num;
        }
        printf("%s  成功退票!\n", p1->name);
        free(p1);
    }
}

void charushanchuFace()//插入删除节点函数 
{
    int a2;
        printf("\n");
        printf("\n");
        printf("\n");
        printf("\n");

        printf("                            插入与删除\n");
        printf("***********************************************************\n");
        printf("                            1.增加航班              \n");
        printf("                            2.删除航班              \n");
        printf("                            3.返回上一级            \n");
        printf("***********************************************************\n");
        printf("                            请输入你要办理的业务:");
        scanf("%d", &a2);
    switch (a2) 
	{
        case 1:
            zengjiaFlight();//增加航班节点函数 
            charushanchuFace();
            break;
        case 2:
            if (1 == shanchuFlight())//删除航班节点函数 
			{
                printf("删除成功\n");
            } 
			else 
			{
                printf("没有这个航班,删除失败!\n");
            };
            charushanchuFace(); 
        case 3:
           menu();
            break;
        default:
            charushanchuFace();
    }
}

int zengjiaFlight()//增加航班函数 
{
    hangbanNode *q;//定义q为新增加的航班结点的指针的形参
    hangban *p = pFlight;
    int y = 1;
    while (y != 0) 
	{
        q = (hangbanNode *) malloc(sizeof(hangbanNode));
        if (q == NULL)
            return 0;
        printf("\t\t请依次输入以下内容\n");
        printf("\t\t请输入航班编号\n");
        scanf("%s", q->hbID);
        int t = duibiFlight(pFlight, q->hbID);//判断添加的航班编号是否已经存在 
        if (t == 0) 
		{ 
            printf("该航班编号已经存在,请重新输入航班编号\n");
            continue;
        }
        printf("\t\t请输入起点站名\n");
        scanf("%s", q->qidian);
        printf("\t\t请输入终点站名\n");
        scanf("%s", q->zhongdian);
        printf("\t\t请输入编号\n");
        scanf("%s", q->hbnum);
        printf("\t\t请输入飞行日期\n");
        scanf("%s", &q->day);
        printf("\t\t请输入乘客定额\n");
        scanf("%d", &q->maxnum);
        q->less = q->maxnum;
        printf("\t\t请输入1等票数目\n");
        scanf("%d", &q->lessgrade1);
        q->lessgrade2 = q->maxnum - q->lessgrade1;//1等票 = 总票数目 - 2等 
        initCusLinkList(q->cusLinkList);//初始化
        initQueue(q->wQgrade1);//将两种等级的票入队,方便等候计算 
        initQueue(q->wQgrade2);

        q->next = p->next;
        p->next = q;

        printf("\t\t是否继续录入航班信息(任意数字继续,0表示停止)。\n");
        printf("\t\t请输入:");
        scanf("%d", &y);
    }
    return 0;
}

int shanchuFlight()// 删除航班函数 
 {
    char ID[20];
    printf("请输入航班ID\n");
    scanf("%s",ID);
    Phangban pre = pFlight;
    Phangban p = pre->next;
    while (p != NULL) {
        if (!strcmp(ID, p->hbID)) {
            pre->next = p->next;
            free(p);
            return 1;
        }
        pre = p;
        p = p->next;
    }
    return 0;

}

int duibiFlight(hangban *flight, char ID[])
//对比航班的编号,防止增加航班时,出现重复 
{
    hangban *p = flight;
    while (p != NULL)
	{
        if (!strcmp(ID, p->hbID)) 
		{
            return 0;//航班ID重复
        }
        p = p->next;
    }
    //ID不重复
    return 1;

}

void sousuoFace() //搜索界面
{
    int a2;
        printf("\n");
        printf("\n");
        printf("\n");
        printf("\n");


        printf("                            搜索航班\n");
        printf("***********************************************************\n");
        printf("                            1.搜索航班            \n");
        printf("                            2.返回上一级          \n");
        printf("***********************************************************\n");
        printf("                            请输入您的选择:");
        scanf("%d", &a2);
    switch (a2) 
	{
        case 1:
            sousuoflight();//输入起点和终点搜索航班 
            system("PAUSE");
            sousuoFace();
            break;
        case 2:
            menu();
            break;
        default:
            sousuoFace();
    }
}

void dingpiaoFace() //订票界面
{
    int a3;
        printf("\n");
        printf("\n");
        printf("                            订票\n");
        printf("***********************************************************\n");
        printf("                            1.订票                         \n");
        printf("                            2.由起点和终点搜索航班           \n");
        printf("                            3.搜索所有航班                     \n");
        printf("                            4.通过航班编号查询客户       \n");
        printf("                            5.返回上一级                  \n");
        printf("***********************************************************\n");
        printf("                            请输入你要办理的业务:");
        scanf("%d", &a3);
    switch (a3) 
	{
        case 1://订票
            dingpiao();
            system("PAUSE");
            dingpiaoFace();
            break;
        case 2://输入起点和终点查询
            sousuoflight();
            system("PAUSE");
            dingpiaoFace();
            break;
        case 3:
            printfall(pFlight);
            system("PAUSE");
            dingpiaoFace();
            break;
        case 4:  //查到客户的姓名和订票量
            pricusInfo();
            system("PAUSE");
            dingpiaoFace();
            break;
        case 5:
            menu();
            break;
        default:
            dingpiaoFace();
    }
}

void tuipiaoFace()//退票模块界面
{
    int a3;
        printf("\n");
        printf("\n");
        printf("                            退票\n");
        printf("***********************************************************\n");
        printf("                            1.办理退票            \n");
        printf("                            2.返回上一级          \n");
        printf("***********************************************************\n");
        printf("                            请输入你要办理的业务:");
        scanf("%d", &a3);
    
    switch (a3) 
	{
        case 1:
            tuipiao();
            system("PAUSE");
            tuipiaoFace();
            break;
        case 2:
            menu();
            break;
        default:
            tuipiaoFace();
    }
}

void pricusInfo()//输出订购该航班乘客的姓名,票数,等级 
{
    CList p;
    hangban *info;
    info = find();//由输入的航班编号查询航班是否存在,并将节点复制给info 
    if (info == NULL) 
	{
        printf("没有这个航班\n");
        return;
    }
    //头结点的下一个节点开始遍历
    p = info->cusLinkList->next;
    if (p != NULL) 
	{
        printf("客户姓名   订票数额   舱位等级(1经济舱,2商务舱)\n");
        while (p) 
		{
            printf("%s\t\t%d\t%d\n", p->name, p->num, p->dengji);
            p = p->next;
        }
    } else
        printf("该航班没有客户信息!!\n");
}

void printfall(hangban *pflight)//打印全部航班信息
{
    hangban *p;
    p = pflight->next;
    printf("起点  终点  编号  飞机号  飞行日期  总载客  余票量  1级余量  2级余量 \n");
    while (p != NULL) 
	{
         printf("%4s  %4s  %2s     %5s %8s  %5d   %5d  %6d     %4d\n",p->qidian,p->zhongdian,p->hbID,p->hbnum, p->day,p->maxnum, p->less, p->lessgrade1, p->lessgrade2);
        p = p->next;
    }
    printf("\n\n");
}

int main() 
{
    initFlight();//初始化航班链表 
    Create(flight1);//将航标信息插入链表 
    menu();    //菜单
    return 0;
}

int menu()//菜单界面函数 
{
    int i;
    do{
    {
        system("color 9e");
        printf("\n");
        printf("\n");
        printf("                            航空订票系统\n");
        printf("***********************************************************\n");
        printf("                            1.  查询航班             \n");
        printf("                            2.  搜索航班             \n");
        printf("                            3.  订票                 \n");
        printf("                            4.  退票                 \n");
        printf("                            5.  录入与删除           \n");
        printf("***********************************************************\n");
        printf("                           输入需要办理的业务:");
        scanf("%d", &i);
    }
    switch (i) 
	{
        case 1:
            printfall(pFlight);//打印全部航班信息 
            system("PAUSE");
            menu();
            break;
        case 2: 
            sousuoFace();// 搜索界面 
            system("PAUSE");
            menu();
            break;
        case 3:
            dingpiaoFace();//订票界面 
            system("PAUSE");
            menu();
            break;
        case 4:
            tuipiaoFace();//退票界面 
            system("PAUSE");
            menu();
            break;
        case 5:
            charushanchuFace();//插入和删除新节点 
            system("PAUSE");
            menu();
            break;
        default:
            menu();//返回主菜单 
    }
   }while(0);
}

你可能感兴趣的:(课程设计,数据结构,链表,c++,其他)