数据结构课程设计--航空客运订票系统

简介: 数据结构课程设计--航空客运订票系统

航空客运订票系统

本次课程设计做的航空客运订票系统,主要用到了,线性表、链表、图的存储结构,本次课程设计仍然使用多文件组织工程,点击此处参考(编码工具:code::blocks 12.04)

工程文件视角图如下:

image.png

实现源代码如下:

1.mainFram.h

//*Copyright  (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :mainFram.h*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:定义界面实现的部分宏定义、要实现算法的函数的声明*
//*输入描述:无*
//*程序输出:无*
#ifndef MAINFRAM_H_INCLUDED
#define MAINFRAM_H_INCLUDED
#define flight_max 5//最大航班数
struct passanager //乘客信息结构体
{
    char name[10];//名字
    char id[20];//身份证号
    float money; //资产
    int ifstu;  //是否学生认证
    char airnum[10];  //航班号
    int sex;   //性别,男1女0
    char phone[15]; //预留手机号
};
typedef struct passanager pass;
 struct airplane//航班信息
{
    char num[10];  //航班号
    float price;   //票价
    float discount;  //折扣
    char start[10];  //起始地
    char arrive[10];  //目的地
    int count;    //余票数
    int min,sec;   //时间
};
typedef struct airplane air;
int setdiscount(air *a);    //设定折扣函数,只需要传递air指针即可,包含这些函数的模块只能对航班操作
void disairline(air *a);//显示航班信息,顺序结构,顾客用
bool stu_confrim(pass *p);   //学生认证函数,传递pass指针,只需对乘客操作
#endif // MAINFRAM_H_INCLUDED

2.mainFram.cpp

//*Copyright  (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :mainFrame.h*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:界面实现函数以及各模块功能的实现函数代码*
//*输入描述:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
//*程序输出:各模块实现功能*
#include "mainFram.h"
#include "linklist.h"
#include <malloc.h>
#include <cstdio>
#include <iostream>
#include <conio.h>
#include <string.h>
#include <fstream>
#include <stdlib.h>
#include "graph.h"
using namespace std;
/***********************************************************
* 功能描述:主函数
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数:无
* 返回值  :无
* 其他说明:入口函数
************************************************************/
void mainFram(DLinkList *L,pass *p,air *a,ALGraph *&G)
{
    system("cls");//清屏
  system("color 9f");//改变界面颜色,管理颜色为红色背景,普通服务为蓝色背景
    cout<<endl<<endl;
    cout<<"             **        *        ** ****** *       ****    ****       *         *      ******"<<endl;
    cout<<"              **      ***      **  *      *      *       *    *     * *       * *     *     "<<endl;
    cout<<"               **    ** **    **   *****  *      *       *    *    *   *     *   *    ***** "<<endl;
    cout<<"                **  **   **  **    *      *      *       *    *   *     *   *     *   *     "<<endl;
    cout<<"                 ***      ***      *      *      *       *    *  *       * *       *  *     "<<endl;
    cout<<"                  *        *       ****** ******  ****    ****  *         *         * ******"<<endl;
    cout<<endl<<endl<<endl;
    cout<<"          ☆☆☆☆☆☆☆☆☆☆☆☆☆    TCH Airplane Synthetic System   ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;
    cout<<endl;
    cout<<"                                   ┏━━━━━━━━━━━━━┓\n";
    cout<<"                                   ┃  航空客运订票综合系统    ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃1.用户服务系统            ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃2.管理员管理系统          ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃3.关于我们                ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃0.退出                    ┃\n";
    cout<<"                                   ┗━━━━━━━━━━━━━┛\n";
  cout<<"请输入数字实现功能:"<<endl;
  int n;
  cin>>n;
  switch(n)
  {
    case 1:
        mainFram_pa(L,p,a,G);//调用用户服务认证界面
        break;
    case 2:
        if(rootlog(L,p,a,G))  //由函数返回的布尔值继续进行
        {
            getch();
            mainFram_ma(L,p,a,G); //登录成功之后,进入管理主界面
        }
        else
        {
            cout<<"密码或用户名不对!登陆失败"<<endl;
            getch();
        }
        break;
    case 3:
        system("cls");//清屏
         cout<<endl<<endl<<endl;
         cout<<"          ☆☆☆☆☆☆☆☆☆☆☆☆☆    TCH Airplane Synthetic System   ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;//我的信息
         cout<<"          ☆☆☆☆☆☆☆☆☆☆☆☆☆       航空客运订票综合系统         ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;
         cout<<"          ☆☆☆☆☆☆☆☆☆☆☆☆版本号:V1.0   联系邮箱:153199613@qq.com☆☆☆☆☆☆☆☆☆☆☆"<<endl;
         cout<<"          ☆☆☆☆☆☆☆☆☆☆☆☆☆    烟台大学计算机与控制工程学院    ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;
         getch();
        break;
    default:
        break;
  }
}
/***********************************************************
* 功能描述:用户服务系统主界面
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 认证界面
* 返回值  :无
* 其他说明:入口函数
************************************************************/
void mainFram_pa(DLinkList *L,pass *p,air *a,ALGraph *&G)
{
    int i1;//此变量用于存储LocateElem返回的值,判断认证顾客在链表中的位置
    pass pa1;//用于传递参数
    char name1[10];
    system("cls");
    cout<<"请输入您的身份证号来验证身份:"<<endl;
    cin>>pa1.id;
    i1=LocateElem(L,1,pa1);
    if(i1!=0)
    {
        cout<<"已确认身份合法,请输入您的姓名完成身份鉴定。"<<endl<<"请输入您的用户名:"<<endl;
        cin>>name1;
        int j=0;
        DLinkList *c=L;
        while (j<i1)
        {
            j++;
            c=c->next;
        }
            strcpy(pa1.name,c->data.name);
        if(!strcmp(name1,pa1.name))
        {
            pass *wo;
            wo=&c->data;
            cout<<"鉴定成功,您的信息如下:"<<endl;
            mainFram_pa_su(L,wo,a,G);//compare success
        }
        else
        {
            cout<<"鉴定故障,原因可能是您输入的用户名与您的身份证号不匹配。\nPress any key to continue..."<<endl;
            getch();
            mainFram(L,p,a,G);
        }
    }
    else
    {
        cout<<"该身份证号不存在,您的信息没有在数据库中,如有需要请联系管理员及时添加。"<<endl;
        cout<<"Press any key to continue..."<<endl;
        getch();
        mainFram(L,p,a,G);
    }
}
/***********************************************************
* 功能描述:用户服务系统主界面1
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 用户服务主界面
* 返回值  :无
* 其他说明:用户服务入口窗口
************************************************************/
void mainFram_pa_su(DLinkList *L,pass *p, air *a,ALGraph *&G)//认证之后的p指针是认证时的顾客,这样进行操作时,就会有目的进行修改
{
    system("cls");//清屏
  system("color 9f");//改变界面颜色
    cout<<endl<<endl;
    cout<<"             **        *        ** ****** *       ****    ****       *         *      ******"<<endl;
    cout<<"              **      ***      **  *      *      *       *    *     * *       * *     *     "<<endl;
    cout<<"               **    ** **    **   *****  *      *       *    *    *   *     *   *    ***** "<<endl;
    cout<<"                **  **   **  **    *      *      *       *    *   *     *   *     *   *     "<<endl;
    cout<<"                 ***      ***      *      *      *       *    *  *       * *       *  *     "<<endl;
    cout<<"                  *        *       ****** ******  ****    ****  *         *         * ******"<<endl;
    cout<<endl<<endl<<endl;
    cout<<"          ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH Airplane Servervice System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;
    cout<<endl;
    cout<<"                                   ┏━━━━━━━━━━━━━┓\n";
    cout<<"                                   ┃ 欢迎使用航空客运订票系统 ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃1.购买机票                ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃2.查询航班信息            ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃3.学生认证                ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃0.退出                    ┃\n";
    cout<<"                                   ┗━━━━━━━━━━━━━┛\n";
  cout<<"请输入数字实现功能:"<<endl;
  int me;
  cin>>me;
  switch(me)
  {
    case 0:
        break;
    case 1:
        system("cls");
        if(!purtic(p,a))//根据返回的布尔值进行下列程序
        {
            cout<<"购买失败,给自己节省点时间吧,看看别的航班,请不要购买没有余票的航班!"<<endl;
            getch();
            purtic(p,a);
        }
        mainFram_pa_su(L,p,a,G);
        break;
    case 2:
        system("cls");
        cout<<endl<<endl;
        cout<<"\t\t"<<"*****航班信息表*****"<<endl;
        disairline(a);
        getch();
        mainFram_pa_su(L,p,a,G);
        break;
    case 3:
        if(stu_confrim(p))//此处进行学生认证
        {
            p->ifstu=1;
            cout<<"认证成功,您在购买机票的时候将享受半价优惠。\n";
            getch();
            mainFram_pa_su(L,p,a,G);
        }
        else
        {
            cout<<"您所在的大学不存在或者未与我方合作,认证失败!\n";
            getch();
            mainFram_pa_su(L,p,a,G);
        }
        break;
  }
}
/***********************************************************
* 功能描述:学生认证函数
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 认证界面
* 返回值  :认证结果
* 其他说明:使用文件输入流
************************************************************/
bool stu_confrim(pass *p)//学生认证函数
{
    ifstream infile;
    infile.open("G://大学.txt");  //此处文件保存学校信息,只有在文件中的学校才能获得认证资格
    if(!infile) cout<<"error"<<endl;  //文件读入数据操作
    char school[20];
    char input[20];
    cout<<"请输入您所在的大学:"<<endl;
    cin>>input;
    while(infile.getline(school,sizeof(school))) //以循环的方式
    {
        if(!strcasecmp(school,input))
            return true;
    }
    return false;
}
bool purtic(pass *p,air *a)//购票函数
{
    system("cls");
    int i;
    cout<<endl<<endl;
    cout<<"#####欢迎来到购票系统#####"<<endl;
    cout<<"请您选择购票的航班"<<endl;
    for(i=1;i<=flight_max;i++)
    {
        cout<<i<<"."<<(a+i-1)->num<<"  "<<(a+i-1)->start<<"-->"<<(a+i-1)->arrive<<"  票数剩余:"<<(a+i-1)->count<<endl;
        cout<<"单价:"<<(a+i-1)->price<<endl;
    }
    cout<<"输入0取消购买。"<<endl;
    cin>>i;
    if(i==0)
    {
        return true;
    }
    if((a+i-1)->count!=0)
    {
        float in;//purchase sucess
        if((strcmp(p->airnum,"无"))!=0)//判断该用户是否已经购买机票
        {
            cout<<"您已经买过票了,给别人个机会吧,有钱也不要任性啊!"<<endl;
            return false;
        }
        if(p->ifstu==1)//判断是否是在校学生
        {
            cout<<"您是在校学生,享有半价优惠。"<<endl;
            in=p->money-(a+i-1)->price*0.5;
            if(in<0)//确保不赊账
            {
                cout<<"大哥,没钱就别出来混了,快去充点钱吧,要不连家都回不去了。\n";
                return false;
            }
            in=p->money;
            cout<<"购买成功,账单明细:";
            p->money=p->money-(a+i-1)->price*0.5;
            strcpy(p->airnum,(a+i-1)->num);
            printf("\n您购票前账户余额:%0.2f\n您花费的金额为:%0.2f\n您当前余额为:%0.2f\n",in,(a+i-1)->price,p->money);
            cout<<"Press any key to continue..."<<endl;
            (a+i-1)->count--;
            getch();
            return true;
        }
            in=p->money-(a+i-1)->price;
            if(in<0)
            {
                cout<<"大哥,没钱就别出来混了,快去充点钱吧,要不连家都回不去了。\n";
                return false;
            }
            in=p->money;
            cout<<"购买成功,账单明细:";
            p->money=(p->money-(a+i-1)->price);
            strcpy(p->airnum,(a+i-1)->num);
            printf("\n您购票前账户余额:%0.2f\n您花费的金额为:%0.2f\n您当前余额为:%0.2f\n",in,(a+i-1)->price,p->money);
            cout<<"Press any key to continue..."<<endl;
            (a+i-1)->count--;
            getch();
            return true;
    }
    else
        return false;
}
/*g管理界面系统*/
/***********************************************************
* 功能描述:管理系统主界面
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 主界面
* 返回值  :无
* 其他说明:管理员入口函数
************************************************************/
void mainFram_ma(DLinkList *&L,pass *p,air *a,ALGraph *&G)//管理界面
{
    system("cls");//清屏
  system("color 4f");//改变界面颜色
    cout<<endl<<endl;
    cout<<"             **        *        ** ****** *       ****    ****       *         *      ******"<<endl;
    cout<<"              **      ***      **  *      *      *       *    *     * *       * *     *     "<<endl;
    cout<<"               **    ** **    **   *****  *      *       *    *    *   *     *   *    ***** "<<endl;
    cout<<"                **  **   **  **    *      *      *       *    *   *     *   *     *   *     "<<endl;
    cout<<"                 ***      ***      *      *      *       *    *  *       * *       *  *     "<<endl;
    cout<<"                  *        *       ****** ******  ****    ****  *         *         * ******"<<endl;
    cout<<endl<<endl<<endl;
    cout<<"          ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH Airplane Reservation System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;
    cout<<endl;
    cout<<"                                   ┏━━━━━━━━━━━━━┓\n";
    cout<<"                                   ┃ 航空订票服务高级管理系统 ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃1.用户信息管理            ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃2.设置票价优惠            ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃3.管理航班信息            ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃0.退出                    ┃\n";
    cout<<"                                   ┗━━━━━━━━━━━━━┛\n";
  cout<<"请输入数字实现功能:"<<endl;
    int m;
    cin>>m;
    switch(m)
    {
    case 1:
        chapass(L,p,a,G); //更改用户信息
        break;
    case 2:
        float pr;
        pr=setdiscount(a);//设置折扣
        if(pr!=0)
        {
           cout<<"打折之后的票价为:"<<endl;
           cout<<pr<<endl;
           cout<<endl<<endl<<"Press any key to continue..."<<endl;
        }
        else
        {
            cout<<"设置失败!"<<endl;
        }
        getch();
        mainFram_ma(L,p,a,G);
        break;
    case 3:
        maairline(a,L,G);//管理航班信息
        mainFram_ma(L,p,a,G);
        break;
    case 0:
        break;
    default:
        cout<<"您的输入有误,系统无法提供服务,按任意键返回。"<<endl;
        mainFram_ma(L,p,a,G);
    }
}
/***********************************************************
* 功能描述:查看航班信息
* 输入参数:air型指针
* 输出参数: 航班的详细信息
* 返回值  :无
* 其他说明:入口函数
************************************************************/
void disairline(air *a)  //用户查看航班信息,表格形式,顺序结构
{
    int i;
    printf("|航班号| | 票价 | |折扣| |起始地| |目的地| | 发车时间 | |余票|\n");
    for(i=0;i<flight_max;i++)
    {
        printf("|%-6s| |%-6.2f| |%-4.2f| |%-6s| |%-6s| | %-2d : %-2d  | |%-4d|\n",(a+i)->num,(a+i)->price,(a+i)->discount,(a+i)->start,(a+i)->arrive,(a+i)->min,(a+i)->sec,(a+i)->count);
    }
    printf("\nPress any key to continue...");
}
/* 用户信息管理界面 */
/***********************************************************
* 功能描述:用户信息更改实现界面
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 选择功能
* 返回值  :无
* 其他说明:更改信息,实现增删改查
************************************************************/
void chapass(DLinkList *L,pass *p,air *a,ALGraph *&G)//更改顾客信息
{
    system("cls");//清屏
    cout<<endl<<endl<<endl;
    cout<<"          ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH Airplane Reservation System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;
    cout<<endl;
    cout<<"                                   ┏━━━━━━━━━━━━━┓\n";
    cout<<"                                   ┃      用户信息管理界面    ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃1.查看所有用户信息        ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃2.添加一个用户            ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃3.删除一个用户            ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃4.更改用户信息            ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃5.查找用户                ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃0.退出                    ┃\n";
    cout<<"                                   ┗━━━━━━━━━━━━━┛\n";
  cout<<"请输入数字实现功能:"<<endl;
    int m;
    cin>>m;
    switch(m)
    {
    case 1:
        system("cls");//清屏
        DispList(L);
        getch();
        chapass(L,p,a,G);
        break;
    case 2:
        system("cls");
        int i;
        cout<<"请输入您要插入的位置:"<<endl;
        cin>>i;
        pass e;
        if(ListInsert(L,i,e))
            cout<<"信息添加成功,请按任意键返回。。。"<<endl;//插入一个节点
        else
            cout<<"添加失败,可能是超过最大名额限制或者插入的位置超过上限,请联系开发人员(17865569098)。"<<endl;
        getch();
        chapass(L,p,a,G);
        break;
    case 3:
        int i1;
        pass e1;
        system("cls");
        cout<<endl<<endl;
        cout<<"warning : Your action is sensitive operation !"<<endl<<"警告:您现在的操作为敏感操作,请慎重考虑后再行删除!"<<endl;
        cout<<"请选择删除模式"<<endl<<"1.按照身份证号删除"<<endl<<"2.按照预留手机号删除"<<endl;
        int mode;
        cin>>mode;     //此处的mode变量为模式,将模式的值传递给LocateElem函数,进行相应的操作
        if(mode==1)
        {
            cout<<"请输入您要删除用户的身份证号:"<<endl;
            cin>>e1.id;
            i1=LocateElem(L,mode,e1); //查找一个节点
            if(i1!=0)
            {
                if(ListDelete(L,i1,e1)) //删除一个节点
                {
                    cout<<"删除该用户信息成功!按任意键退回。。。"<<endl;
                    getch();
                    chapass(L,p,a,G);
                }
                else
                {
                    cout<<"删除失败,没有找到该身份证号对应的用户。。。"<<endl;
                    getch();
                    chapass(L,p,a,G);
                }
            }
            else
            {
                cout<<"未找到符合条件的用户,查找失败。。。"<<endl;
                getch();
                chapass(L,p,a,G);
            }
        }
        else if(mode==2)
        {
            cout<<"请输入您要删除用户的手机号:"<<endl;
            cin>>e1.phone;
            i1=LocateElem(L,mode,e1); //查找一个节点
            if(i1!=0)
            {
                if(ListDelete(L,i1,e1)) //删除一个节点
                {
                    cout<<"删除该用户信息成功!按任意键退回。。。"<<endl;
                    getch();
                    chapass(L,p,a,G);
                }
                else
                {
                    cout<<"删除失败,没有找到该手机号对应的用户。。。"<<endl;
                    getch();
                    chapass(L,p,a,G);
                }
            }
            else
            {
                cout<<"未找到符合条件的用户,查找失败。。。"<<endl;
                getch();
                chapass(L,p,a,G);
            }
        }
        break;
    case 4:
        int i3;
        pass e3;
        system("cls");//清屏
        cout<<endl<<endl<<"warning : Your action is sensitive operation !"<<endl<<"警告:您现在的操作为敏感操作,请谨慎操作!"<<endl;  //敏感操作要警告
        cout<<endl<<"####更改用户信息####"<<endl;
        cout<<"请输入您要更改的用户的身份证号:"<<endl;
        cin>>e3.id;
        i3=LocateElem(L,1,e3);
        if(i3!=0)
        {
            cout<<"查找成功,可以进行修改操作,请谨慎进行!"<<endl;
            if(ListInsert(L,i3,e3))
            {
                cout<<"修改成功,Press any key to continue..."<<endl;
                getch();
                chapass(L,p,a,G);
            }
            else
            {
                cout<<"修改失败,可能是您没有操作权限或者操作非法!"<<endl;
                getch();
                chapass(L,p,a,G);
            }
        }
        else
        {
            cout<<"未能找到符合条件的用户,Press any key to continue..."<<endl;
            getch();
            chapass(L,p,a,G);
        }
        break;
    case 5:
        system("cls");
        cout<<endl<<endl<<"#####查找用户信息#####"<<endl;
        int i2,mode2;
        pass e2;
        cout<<endl<<"请选择查找方式:"<<endl<<"1.按照身份证号查找"<<endl<<"2.按照预留手机号查找"<<endl;
        cin>>mode2;
        cout<<endl;
        if(mode2==1)
        {
            cout<<"请输入您要找的用户身份证号:"<<endl;
            cin>>e2.id;
            i2=LocateElem(L,mode2,e2);
            if(i2!=0)
            {
                cout<<"查找成功!以下是身份证为"<<e2.id<<"的信息:"<<endl;
                GetElem(L,i2,e2);
                cout<<"|姓名\t| |     身份证号     | |性别|  |  电话号码  | |航班号\t| |学生认证|";
                printf("\n");
                printf("%-10s",e2.name);
                printf(" %-20s",e2.id);
                if(e2.sex==1)
                    cout<<"  男\t";
                else
                    cout<<"  女\t";
                printf("%-11s",e2.phone);
                printf("    %-12s",e2.airnum);
                if(e2.ifstu==1)
                    cout<<"  是"<<"\t";
                else
                    cout<<"  否"<<"\t";
                cout<<endl<<endl<<"按任意键继续。。。"<<endl;
                getch();
                chapass(L,p,a,G);
            }
            else
            {
                cout<<"未能查到符合条件的用户信息,Press any key to continue..."<<endl;
                getch();
                chapass(L,p,a,G);
            }
        }
        else
        {
            cout<<"请输入您要找的手机号:"<<endl;
            cin>>e2.phone;
            i2=LocateElem(L,mode2,e2);
            if(i2!=0)
            {
                cout<<"查找成功!以下是手机号为"<<e2.phone<<"的信息:"<<endl;
                GetElem(L,i2,e2);
                cout<<"|姓名\t| |     身份证号     | |性别|  |  电话号码  | |航班号\t| |学生认证|";
                printf("\n");
                printf("%-10s",e2.name);
                printf(" %-20s",e2.id);
                if(e2.sex==1)
                    cout<<"  男\t";
                else
                    cout<<"  女\t";
                printf("%-11s",e2.phone);
                printf("    %-12s",e2.airnum);
                if(e2.ifstu==1)
                    cout<<"  是"<<"\t";
                else
                    cout<<"  否"<<"\t";
                cout<<endl<<endl<<"按任意键继续。。。"<<endl;
                getch();
                chapass(L,p,a,G);
            }
            else
            {
                cout<<"未能查到符合条件的用户信息,Press any key to continue..."<<endl;
                getch();
                chapass(L,p,a,G);
            }
        }
        break;
    case 0:
        mainFram_ma(L,p,a,G);
        break;
    default:
        cout<<"您的指令有误,请按正确的格式输入!Press any key to continue!"<<endl;
        getch();
        chapass(L,p,a,G);
        break;
    }
}
/***********************************************************
* 功能描述:设置折扣
* 输入参数:air型指针与折扣
* 输出参数:折扣后的票价
* 返回值  :票价
* 其他说明:入口函数
************************************************************/
int setdiscount(air *a)
{
    int i;
    float dis;
    system("cls");
    cout<<"请输入您想设置优惠的航班号:"<<endl;
    char hang[10];
    cin>>hang;
    for(i=0;i<flight_max;i++)
    {
        if(!strcmp(((a+i)->num),hang))
        {
            cout<<"请输入您要设置的优惠:"<<endl;
            cin>>dis;
            (a+i)->discount=dis;
            cout<<"设置成功。"<<endl;
            (a+i)->price=(a+i)->price*(a+i)->discount;
            getch();
            return (a+i)->price;
        }
    }
    cout<<"没有该航班。"<<endl;
    getch();
    return 0;
}
/*航班管理函数*/
/***********************************************************
* 功能描述:管理航班信息函数
* 输入参数:air型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 功能实现
* 返回值  :无
* 其他说明:入口函数
************************************************************/
void maairline(air *a,struct DNode *L,ALGraph *&G)
{
    system("cls");
    cout<<endl<<endl;
    cout<<"             **        *        ** ****** *       ****    ****       *         *      ******"<<endl;
    cout<<"              **      ***      **  *      *      *       *    *     * *       * *     *     "<<endl;
    cout<<"               **    ** **    **   *****  *      *       *    *    *   *     *   *    ***** "<<endl;
    cout<<"                **  **   **  **    *      *      *       *    *   *     *   *     *   *     "<<endl;
    cout<<"                 ***      ***      *      *      *       *    *  *       * *       *  *     "<<endl;
    cout<<"                  *        *       ****** ******  ****    ****  *         *         * ******"<<endl;
    cout<<endl<<endl<<endl;
    cout<<"          ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH   Airplane  Airline  System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;
    cout<<endl;
    cout<<"                                   ┏━━━━━━━━━━━━━┓\n";
    cout<<"                                   ┃   航空订票航班管理系统   ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃1.更改航班信息            ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃2.显示所有航班信息        ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃0.退出                    ┃\n";
    cout<<"                                   ┗━━━━━━━━━━━━━┛\n";
    cout<<endl<<endl<<"请输入数字以实现功能:"<<endl;
    int me5;
    cin>>me5;
    switch(me5)
    {
    case 0:
        break;
    case 1:
        chairline(a,L,G);
        getch();
        break;
    case 2:
        DispAdj(G);
        getch();
        break;
    default:
        cout<<"您的指令有误,请重新输入。"<<endl;
        getch();
        maairline(a,L,G);
        break;
    }
}
/***********************************************************
* 功能描述:更改航班信息界面
* 输入参数:air型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 实现界面与修改实现
* 返回值  :无
* 其他说明:入口函数
************************************************************/
void chairline(air *a,struct DNode *L,ALGraph *&G)
{
    system("cls");
    cout<<endl<<endl;
    cout<<"          ☆☆☆☆☆☆☆☆☆☆☆☆☆ TCH   Airplane  Airline  System ☆☆☆☆☆☆☆☆☆☆☆☆☆☆"<<endl;
    cout<<endl;
    cout<<"                                   ┏━━━━━━━━━━━━━┓\n";
    cout<<"                                   ┃1.更改航班号              ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃2.放票、收票              ┃\n";
    cout<<"                                   ┃━━━━━━━━━━━━━┃\n";
    cout<<"                                   ┃0.退出                    ┃\n";
    cout<<"                                   ┗━━━━━━━━━━━━━┛\n";
     cout<<endl<<endl<<"请输入数字以实现功能:"<<endl;
    int me4;
    cin>>me4;
    switch(me4)
    {
    case 0:
        break;
    case 1:
        system("cls");
        if(chline(a,L,G))
            cout<<"修改成功!按任意键继续!"<<endl;
        else
            cout<<"您输入的航班号不存在,修改失败!"<<endl;
        getch();
        chairline(a,L,G);
        break;
    case 2:
        system("cls");
        if(chticcount(a,L,G))
            cout<<"修改成功!按任意键继续!"<<endl;
        else
            cout<<"您输入的航班号不存在或者操作非法,修改失败!"<<endl;
        getch();
        chairline(a,L,G);
        break;
    default:
        cout<<"您的指令有误,请重新输入。"<<endl;
        getch();
        maairline(a,L,G);
        break;
    }
}
/*变更航班号函数*/
/***********************************************************
* 功能描述:变更航班号
* 输入参数:air型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 认证界面
* 返回值  :无
* 其他说明:入口函数
************************************************************/
bool chline(air *a,struct DNode *L,ALGraph *&G)
{
        system("cls");
        cout<<endl<<endl;
        cout<<"请输入您要更改的航班号:"<<endl;
        char hangn[10];
        cin>>hangn;
        int i;
        ArcNode *p;  //创建节点
        for (i=0; i<G->n; i++)   //用循环进行遍历
        {
            p=G->adjlist[i].firstarc;
            while (p!=NULL)
            {
                if(!strcmp(G->adjlist[i].data.num,hangn))
                {
                    char nnum[10];
                    cout<<"请输入新的航班号:"<<endl;
                    cin>>nnum;
                    strcpy(G->adjlist[i].data.num,nnum);
                    strcpy(a[i].num,nnum);
                    cout<<"修改成功!";
                    return true;
                }
                p=p->nextarc;
            }
        }
        return false;
}
/*变更航班票数函数*/
/***********************************************************
* 功能描述:放票收票函数
* 输入参数:air型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 实现界面
* 返回值  :实现结果
* 其他说明:
************************************************************/
bool chticcount(air *a,struct DNode *L,ALGraph *&G)
{
    system("cls");
        cout<<endl<<endl;
        cout<<"请输入您要更改的航班号:"<<endl;
        char hangn[10];
        cin>>hangn;
        int i;
        ArcNode *p;
        for (i=0; i<G->n; i++)
        {
            p=G->adjlist[i].firstarc;//给p初始值
            while (p!=NULL)
            {
                if(!strcmp(G->adjlist[i].data.num,hangn))
                {
                    int ncount;
                    cout<<"请选择模式:1.放票 2.收票"<<endl;
                    cout<<"当前此航班剩余票数:"<<G->adjlist[i].data.count<<endl;
                    int sel;
                    cin>>sel;
                    if(sel==1)
                    {
                        cout<<"请输入放票数量:"<<endl;
                        cin>>sel;
                        ncount=G->adjlist[i].data.count+sel; //条件判断值
                        if(ncount>60)
                        {
                            cout<<"大哥,飞机不是货车,哪有那么多票啊!"<<endl;
                            return false;
                        }
                        G->adjlist[i].data.count=ncount;//同步图结构的值与线性表中的一致!!!!重要
                        a[i].count=ncount;
                        cout<<"放票成功!"<<endl;
                        return true;
                    }
                    else if(sel==2)
                    {
                        cout<<"请输入收票数量:"<<endl;
                        cin>>sel;
                        ncount=G->adjlist[i].data.count-sel;
                        if(ncount<0)
                        {
                            cout<<"大哥,票都收没了,别收了!"<<endl;
                            return false;
                        }
                        G->adjlist[i].data.count=ncount;
                        a[i].count=ncount;
                        cout<<"收票成功!"<<endl;
                        return true;
                    }
                    else
                    {
                        cout<<"error!错误输入!"<<endl;
                        return false;
                    }
                }
                p=p->nextarc;
            }
        }
        return false;
}
/*管理员登录函数*/
/***********************************************************
* 功能描述:管理员登录
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 认证界面
* 返回值  :无
* 其他说明:管理员入口函数
************************************************************/
bool rootlog(struct DNode *L,pass *p,air *a,ALGraph *&G)
{
    system("cls");
    char username[10]="root";
    char password[10]="123456";
    char username1[10];
    char password1[10];
    cout<<endl<<endl<<endl<<endl;
    cout<<"              ********************************************"<<endl;
    cout<<"              *                                          *"<<endl;
    cout<<"              *            欢迎进入管理登录系统          *"<<endl;
    cout<<"              *                                          *"<<endl;
    cout<<"              ********************************************"<<endl;
    cout<<endl<<endl<<endl<<endl;
    cout<<"                              请输入用户名:";
    cin>>username1;
    cout<<endl;
    cout<<"                              请输入密码:";
    cin>>password1;
    if((!strcmp(username1,username))&& (!strcmp(password1,password)))  //匹配固定密码
    {
        cout<<"登录成功!"<<endl;
        return true;
    }
    else
        return false;
}

3.linklist.h

//*Copyright  (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :linklist.h*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:定义双链表数据结构的代码、宏定义、要实现算法的函数的声明*
//*输入描述:无*
//*程序输出:无*
#ifndef LINKLIST_H_INCLUDED
#define LINKLIST_H_INCLUDED
#include "mainFram.h"
#include "graph.h"
typedef struct passanager NewType;
typedef struct DNode        //定义双链表结点类型
{
    NewType data;
    struct DNode *prior;    //指向前驱结点
    struct DNode *next;     //指向后继结点
} DLinkList;
void CreateListF(DLinkList *&L,NewType a[],int n);//头插法建双链表
void CreateListR(DLinkList *&L,NewType a[],int n);//尾插法建双链表
void InitList(DLinkList *&L); //初始化双链表
void DestroyList(DLinkList *&L); //销毁双链表
bool ListEmpty(DLinkList *L); //判断链表是否为空
int ListLength(DLinkList *L); //求链表的长度
void DispList(DLinkList *L); //输出链表
bool GetElem(DLinkList *L,int i,NewType &e); //获取节点的值,并按要求输出输出
int LocateElem(DLinkList *L,int mode,NewType e); //查找一个节点
bool ListInsert(DLinkList *&L,int i,NewType e) ;//插入一个节点
bool ListDelete(DLinkList *&L,int i,NewType &e); //删除一个节点
#endif // LINKLIST_H_INCLUDED

4.linklist.cpp

//*Copyright  (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :linklist.cpp*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:双链表数据结构的函数实现代码*
//*输入描述:Dlinklist型指针以及air、pass型指针*
//*程序输出:无*
#include <stdio.h>
#include <malloc.h>
#include <conio.h>
#include <iostream>
#include "linklist.h"
#include <string.h>
using namespace std;
/***********************************************************
* 功能描述:头插法创建双链表
* 输入参数:Dlinklist 型引用指针,NewType 型数组首地址,插入数量
* 输出参数: 创建结果
* 返回值  :无
* 其他说明:无
************************************************************/
void CreateListF(DLinkList *&L,NewType a[],int n)
//头插法建双链表
{
    DLinkList *s;
    int i;
    L=(DLinkList *)malloc(sizeof(DLinkList));   //创建头结点
    L->prior=L->next=NULL;
    for (i=0; i<n; i++)
    {
        s=(DLinkList *)malloc(sizeof(DLinkList));//创建新结点
        s->data=a[i];
        s->next=L->next;            //将*s插在原开始结点之前,头结点之后
        if (L->next!=NULL) L->next->prior=s;
        L->next=s;
        s->prior=L;
    }
}
/***********************************************************
* 功能描述:尾插法创建双链表
* 输入参数:Dlinklist 型引用指针,NewType 型数组首地址,插入数量
* 输出参数: 创建结果
* 返回值  :无
* 其他说明:无
************************************************************/
void CreateListR(DLinkList *&L,NewType a[],int n)
//尾插法建双链表
{
    DLinkList *s,*r;
    int i;
    L=(DLinkList *)malloc(sizeof(DLinkList));   //创建头结点
    L->prior=L->next=NULL;
    r=L;                    //r始终指向终端结点,开始时指向头结点
    for (i=0; i<n; i++)
    {
        s=(DLinkList *)malloc(sizeof(DLinkList));//创建新结点
        //a[i].signinfo();
        s->data=a[i];
        r->next=s;
        s->prior=r; //将*s插入*r之后
        r=s;
    }
    r->next=NULL;           //终端结点next域置为NULL
}
/***********************************************************
* 功能描述:插入链表
* 输入参数:Dlinklist 型引用指针
* 输出参数:Dlinklist 型指针引用
* 返回值  :无
* 其他说明:无
************************************************************/
void InitList(DLinkList *&L)
{
    L=(DLinkList *)malloc(sizeof(DLinkList));   //创建头结点
    L->prior=L->next=NULL;
}
/***********************************************************
* 功能描述:销毁链表
* 输入参数:Dlinklist 型引用指针
* 输出参数:Dlinklist 型指针引用
* 返回值  :无
* 其他说明:无
************************************************************/
void DestroyList(DLinkList *&L)
{
    DLinkList *p=L,*q=p->next;
    while (q!=NULL)
    {
        free(p);
        p=q;
        q=p->next;
    }
    free(p);
}
/***********************************************************
* 功能描述:判断链表是否为空
* 输入参数:Dlinklist 型指针
* 输出参数:
* 返回值  :bool型变量表示结果
* 其他说明:无
************************************************************/
bool ListEmpty(DLinkList *L)
{
    return(L->next==NULL);
}
/***********************************************************
* 功能描述:求链表长度
* 输入参数:Dlinklist 型指针
* 输出参数:长度
* 返回值  :int整形长度信息
* 其他说明:无
************************************************************/
int ListLength(DLinkList *L)
{
    DLinkList *p=L;
    int i=0;
    while (p->next!=NULL)
    {
        i++;
        p=p->next;
    }
    return(i);
}
/***********************************************************
* 功能描述:按格式显示链表内容
* 输入参数:Dlinklist 型指针
* 输出参数:显示列表
* 返回值  :无
* 其他说明:无
************************************************************/
void DispList(DLinkList *L)
{
    DLinkList *p=L->next;
    cout<<"|姓名\t| |     身份证号     | |性别|  |  电话号码  | |航班号\t| |学生认证| |用户资产|";//按格式输出
    while (p!=NULL)
    {
        printf("\n");
        printf("%-10s",p->data.name);
        printf(" %-20s",p->data.id);
        if(p->data.sex==1)
            cout<<"  男\t";
        else
            cout<<"  女\t";
        printf("%-11s",p->data.phone);
        printf("    %-12s",p->data.airnum);
        if(p->data.ifstu==1)
            cout<<"  是";
        else
            cout<<"  否";
        printf("        %0.2f",p->data.money);//p->data.display();   //一定要回头改,将全局变量问题解决之后
        p=p->next;
    }
    printf("\n信息显示完毕,请按任意键继续。。。\n");
    getch();
}
/***********************************************************
* 功能描述:获取节点值
* 输入参数:Dlinklist 型指针,位置,NewType型引用结构体
* 输出参数:无
* 返回值  :bool型结果
* 其他说明:无
************************************************************/
bool GetElem(DLinkList *L,int i,NewType &e)
{
    int j=0;
    DLinkList *p=L;
    while (j<i && p!=NULL)
    {
        j++;
        p=p->next;
    }
    if (p==NULL)
        return false;
    else
    {
        e=p->data;
        return true;
    }
}
/***********************************************************
* 功能描述:获取用户位置
* 输入参数:Dlinklist 型引用指针,模式,NewType 型
* 输出参数:Dlinklist 型指针引用
* 返回值  :int型位置
* 其他说明:无
************************************************************/
int LocateElem(DLinkList *L,int mode,NewType e)
{
    int n=1;
    DLinkList *p=L->next;
    if(mode==1)
    {
       while (p!=NULL && (strcmp(p->data.id,e.id)))
        {
            n++;
            p=p->next;
        }
        if (p==NULL)
            return(0);
        else
            return(n);
    }
    else if(mode==2)
    {
        while (p!=NULL && (strcmp(p->data.phone,e.phone)))
        {
            n++;
            p=p->next;
        }
        if (p==NULL)
            return(0);
        else
            return(n);
    }
    else
    {
        cout<<"您输入的模式有误,不能完成您的要求。。。"<<endl;
        getch();
        return(0);
    }
}
bool ListInsert(DLinkList *&L,int i,NewType e)
{
    cout<<endl<<endl<<endl;
    cout<<"请输入该用户的用户名:"<<endl;
    cin>>e.name;
    cout<<"请输入该用户的身份证号:"<<endl;
    cin>>e.id;
    cout<<"请输入该用户的缴存金额:"<<endl;
    cin>>e.money;
    cout<<"请输入该用户的性别(男为1,女为0):"<<endl;
    cin>>e.sex;
    cout<<"请输入该用户的预留手机号:"<<endl;
    cin>>e.phone;
    strcpy(e.airnum,"无");
    e.ifstu=0;
    int j=0;
    DLinkList *p=L,*s;
    while (j<i-1 && p!=NULL)
    {
        j++;
        p=p->next;
    }
    if (p==NULL)    //未找到第i-1个结点
        return false;
    else            //找到第i-1个结点*p
    {
        s=(DLinkList *)malloc(sizeof(DLinkList));   //创建新结点*s
        s->data=e;
        s->next=p->next;        //将*s插入到*p之后
        if (p->next!=NULL) p->next->prior=s;
        s->prior=p;
        p->next=s;
        return true;
    }
}
/***********************************************************
* 功能描述:删除用户实现
* 输入参数:Dlinklist 型引用指针 int型位置 NewType临时
* 输出参数:删除后的链表
* 返回值  :bool型结果
* 其他说明:无
************************************************************/
bool ListDelete(DLinkList *&L,int i,NewType &e)
{
    int j=0;
    DLinkList *p=L,*q;
    while (j<i-1 && p!=NULL)
    {
        j++;
        p=p->next;
    }
    if (p==NULL)                //未找到第i-1个结点
        return false;
    else                        //找到第i-1个结点*p
    {
        q=p->next;              //q指向要删除的结点
        if (q==NULL)
            return false;       //不存在第i个结点
        e=q->data;
        p->next=q->next;        //从单链表中删除*q结点
        if (p->next!=NULL) p->next->prior=p;
        free(q);                //释放*q结点
        return true;
    }
}

5.graph.h

//*Copyright  (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :graph.h*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:定义图数据结构的代码、宏定义、要实现算法的函数的声明*
//*输入描述:无*
//*程序输出:无*
#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED
#define MAXV 5               //最大顶点个数
#define INF 32767       //INF表示∞
#include "mainFram.h"
#include "linklist.h"
//0烟1德2聊3菏
//0-1 0-2 1-3 2-3 3-0
typedef char InfoType;
//以下定义邻接矩阵类型
typedef struct
{
    int no;                     //顶点编号
    InfoType info[10];              //顶点其他信息,在此存放带权图权值
} VertexType;                   //顶点类型
typedef struct                  //图的定义
{
    int edges[MAXV][MAXV];      //邻接矩阵
    int n,e;                    //顶点数,弧数
    VertexType vexs[MAXV];      //存放顶点信息
} MGraph;                       //图的邻接矩阵类型
//以下定义邻接表类型
typedef struct ANode            //弧的结点结构类型
{
    int adjvex;                 //该弧的终点位置
    struct ANode *nextarc;      //指向下一条弧的指针
    int info;              //该弧的相关信息,这里用于存放权值
} ArcNode;
typedef struct airplane Vertex;
typedef struct Vnode            //邻接表头结点的类型
{
    Vertex data;                //顶点信息
    int count;                  //存放顶点入度,只在拓扑排序中用
    ArcNode *firstarc;          //指向第一条弧
} VNode;
typedef VNode AdjList[MAXV];    //AdjList是邻接表类型
typedef struct
{
    AdjList adjlist;            //邻接表
    int n,e;                    //图中顶点数n和边数e
} ALGraph;                      //图的邻接表类型
//功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
//      n - 矩阵的阶数
//      g - 要构造出来的邻接矩阵数据结构
void ArrayToList(int *Arr, int n, ALGraph *&,air *&a); //用普通数组构造图的邻接表
void MatToList(MGraph g,ALGraph *&G);//将邻接矩阵g转换成邻接表G
void DispAdj(ALGraph *G);//输出邻接表G
/*航班信息管理函数声明*/
//此处函数传值为airline结构体类型指针,将存放航班信息的头指针传递过来,进而可以实现遍历操作,增删改查
//传值还有DNode型指针,由于使用别名会造成其他头文件无法识别,故此处用前向声明,解决此矛盾,此为顾客链表的头结点
//图结构ALGraph型指针,传递此参数便于对图结构存储的信息进行操作,要注意与airline的数据统一
void maairline(air *a,struct DNode *L,ALGraph *&G);//航班管理界面,界面函数无需返回值
void chairline(air *a,struct DNode *L,ALGraph *&G);//更改航班信息界面
bool chline(air *a,struct DNode *L,ALGraph *&G);//更改航班号实现,返回布尔值判断是否修改成功
bool chticcount(air *a,struct DNode *L,ALGraph *&G);//放票收票实现,返回布尔值判断是否修改成功
/*主界面函数声明*/
//此处函数传值多一个passanager型指针,将乘客的头结点传入可以,对乘客进行修改及其他操作
void mainFram(struct DNode *L,pass *p,air *a,ALGraph *&G);  //系统主界面
void mainFram_ma(struct DNode *&L,pass *p,air *a,ALGraph *&G);//管理员管理主界面
void chapass(struct DNode *L,pass *p,air *a,ALGraph *&G); //用户信息管理界面
void mainFram_pa(struct DNode *L,pass *p,air *a,ALGraph *&G);//顾客服务主界面认证
void mainFram_pa_su(struct DNode *L,pass *p,air *a,ALGraph *&G);//顾客服务主界面
bool rootlog(struct DNode *L,pass *p,air *a,ALGraph *&G);//管理员登录函数,此处声明为布尔型,返回登录成功与否的状态
bool purtic(pass *p,air *a); //购票实现,返回布尔型值判断是否购票成功
#endif // GRAPH_H_INCLUDED

6.graph.cpp

//*Copyright  (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :graph.cpp*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:定义栈数据结构的代码、宏定义、要实现算法的函数的声明*
//*输入描述:ALgraph型指针*
//*程序输出:各种实现*
#include <stdio.h>
#include <malloc.h>
#include "graph.h"
#include <iostream>
using namespace std;
//功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
//      n - 矩阵的阶数
//      g - 要构造出来的邻接矩阵数据结构
/***********************************************************
* 功能描述:数组转邻接表
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 认证界面
* 返回值  :无
* 其他说明:入口函数
************************************************************/
void ArrayToList(int *Arr, int n, ALGraph *&G, air *&a)
{
    int i,j,count=0;  //count用于统计边数,即矩阵中非0元素个数
    ArcNode *p;
    G=(ALGraph *)malloc(sizeof(ALGraph));
    G->n=n;
    for (i=0; i<n; i++)                 //给邻接表中所有头节点的指针域置初值
        G->adjlist[i].firstarc=NULL;
    for (i=0; i<n; i++)                 //检查邻接矩阵中每个元素
        for (j=n-1; j>=0; j--)
            if (Arr[i*n+j]!=0)      //存在一条边,将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j]
            {
                p=(ArcNode *)malloc(sizeof(ArcNode));   //创建一个节点*p
                p->adjvex=j;
                p->info=Arr[i*n+j];
                p->nextarc=G->adjlist[i].firstarc;      //采用头插法插入*p
                G->adjlist[i].firstarc=p;
                G->adjlist[i].data=a[i];
            }
    G->e=count;
}
/***********************************************************
* 功能描述:
* 输入参数:Dlinklist 型引用指针
* 输出参数:Dlinklist 型指针引用
* 返回值  :无
* 其他说明:图算法库
************************************************************/
void DispAdj(ALGraph *G)
//输出邻接表G
{
    cout<<endl<<endl;
    cout<<"当前的航班信息为:"<<endl;
    int i;
    ArcNode *p;
    for (i=0; i<G->n; i++)
    {
        p=G->adjlist[i].firstarc;
        printf("%5s: ",G->adjlist[i].data.start);//首先输出起始地点
        while (p!=NULL)
        {
            printf("-->终止地:%s/里程:%dkm/余票:%d/票价:%0.2f ",G->adjlist[i].data.arrive,p->info,G->adjlist[i].data.count,G->adjlist[i].data.price);//按格式输出
            p=p->nextarc;//实现循环
        }
        printf("\n");
    }
}

7.main.cpp

//*Copyright  (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :main.cpp*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:主函数,用于初始化某些存储结构,并对各个源文件进行传值*
//*输入描述:各类初始数据*
//*程序输出:无*
#include <iostream>
#include <cstdio>
#include <malloc.h>
#include <conio.h>
#include "mainFram.h"
#include "linklist.h"
#include "graph.h"
using namespace std;
/***********************************************************
* 功能描述:主函数
* 输入参数:无
* 输出参数:无
* 返回值  :int
* 其他说明:给所有功能实现主界面函数传值,并初始化一些数据
************************************************************/
int main()
{
    ALGraph *G;//图结构传值使用该指针,ALGraph型
    int gr[4][4]=   //此数组存储航班路线信息,弧权值为里程
    {
        {0,200,300,0},
        {0,0,0,50},
        {0,0,0,100},
        {700,0,0,0}
    };
    air *conver;//传递航班信息
    air a[flight_max]=
    {
        {"SD001",200,0,"烟台","德州",22,10},//航班信息SD001烟台-->德州,SD002德州-->菏泽,SD003德州-->烟台
        {"SD002",200,0,"烟台","聊城",17,55},
        {"SD003",200,0,"聊城","菏泽",01,16},
        {"SD004",200,0,"德州","菏泽",06,30},
        {"SD005",200,0,"菏泽","烟台",02,22},
    };//初始化赋值
    conver=a;
    ArrayToList(gr[0],4,G,conver);   //将数组转换为邻接表形式,存储航班路线信息,其顶点信息为航班信息
    pass p[5]=
    {
        {"tch","37256464467464655",300,0,"无",1,"17888888888"},
        {"zx","372458199823236636",1000,1,"无",1,"17899999999"},
        {"hcj","375864645531154566",600,1,"无",0,"17854545454"},
        {"zqb","376545555578951323",500,0,"无",0,"17877777777"},
        {"zkw","371165456486453125",1500,1,"无",0,"17892229222"}
    };//初始化乘客链表
    DLinkList *l;
    InitList(l);
    CreateListR(l,p,5);  //创建双链表
    while(1)
        mainFram(l,p,a,G);
    return 0;
}

运行结果截图如下:

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

相关文章
|
12天前
|
存储 机器学习/深度学习 供应链
数据结构课程设计 仓储管理系统
数据结构课程设计 仓储管理系统
10 0
|
4月前
|
存储 算法 数据可视化
江服校园导游咨询系统-数据结构课程设计
江服校园导游咨询系统-数据结构课程设计
73 0
|
9月前
|
Java
Java数据结构54:图的深度优先遍历与广度优先遍历数据结构课程设计
给出一个无向图顶点和边的信息,输出这个无向图的深度优先遍历序列和广度优先遍历序列。从一个顶点出发如果有2个以上的顶点可以访问时,我们约定先访问编号大的那个顶点。示例输入对应的图如下图所示:
47 0
|
10月前
|
Shell C语言 C++
C语言数据结构课程设计(可运行)
C语言数据结构课程设计(可运行)
46 0
|
存储 算法 Java
图的操作和应用之景区信息管理系统(数据结构课程设计)
0001:图的操作和应用之景区信息管理系统(C++版数据结构课程设计) 现有一个景区,景区里面有若干个景点,景点之间满足以下条件: (1) 某些景点之间铺设了道路(相邻) (2) 这些道路都是可以双向行驶的(无向图) (3) 从任意一个景点出发都可以游览整个景区(连通图) 开发景区信息管理系统,对景区的信息进行管理。使用图的数据结构来保存景区景点信息,为用户提供创建图、查询景点信息、旅游景点导航、搜索最短路径、铺设电路规划等功能。 文章目录0001:图的操作和应用之景区信息管理系统(C++版数据结构课程设
图的操作和应用之景区信息管理系统(数据结构课程设计)
|
计算机视觉
校园交通导游系统 数据结构课程设计
校园交通导游系统 数据结构课程设计
114 0
校园交通导游系统 数据结构课程设计
|
机器学习/深度学习 算法 C语言
《数据结构与课程设计》大作业 汉诺塔问题
《数据结构与课程设计》大作业 汉诺塔问题
261 0
《数据结构与课程设计》大作业 汉诺塔问题
数据结构课程设计实战
这是学完数据结构后的上机任务,对于想学数据结构的人还有学完的人帮助都很大,废话不多说了 ,我直接上效果图。 项目下载地址:http://download.csdn.net/detail/qq_34337272/9861902(需要3积分) 需要后面思维导图和思维导图软件破解安装的给我说一下,我发给你们。 界面图: 部分效果图: 部分思维导图
1620 0