1. /* 
  2. *Copyright(c)2017,烟台大学计算机学院 
  3. *All right reserved. 
  4. *项目名:SK
  5. *作者:盛凯 
  6. *完成日期:2017年12月22日 
  7. *版本号:v1.5
  8. * 
  9. *问题描述:模拟航空订票业务,设计一个可以提供各种航班信息查询和服务的飞机订票系统。
  10. *
  11. main.cpp:

  12. /***********************************************************
    *版权所有(C)2017,Shengkai
    *
    *文件名称:main.cpp
    *文件标识:无
    *内容摘要:该文件用于存放主函数
    *其它说明:无
    *当前版本:V1.5
    *作者:盛凯
    *完成日期:20171222
    *
    **********************************************************/
    #include <stdio.h>
    #include <malloc.h>
    #include <string>
    #include <iostream>
    #include "linlist.h"
    #include "function.h"
    #include "graph.h"
    using namespace std;


    int main()
    {


        CLinkList *L1;   // 初始化航班1
        InitList(L1);
        CreateListR(L1,0,"烟台至北京",200);//航班的票数地点价格


        CLinkList *L2;  // 初始化航班2
        InitList(L2);
        CreateListR(L2,0,"烟台至上海",500);


        CLinkList *L3;  // 初始化航班3
        InitList(L3);
        CreateListR(L3,0,"烟台至乌鲁木齐",900);


        show2(L1,L2,L3);


        return 0;
    }

    function.cpp:

  13. /***********************************************************
    *版权所有(C)2017,Shengkai
    *
    *文件名称:function.cpp
    *文件标识:无
    *内容摘要:该文件用于执行主页面下的功能函数
    *其它说明:无
    *当前版本:V1.5
    *作者:盛凯
    *完成日期:20171222
    *
    **********************************************************/
    #include <stdio.h>
    #include <malloc.h>
    #include <iostream>
    #include "linlist.h"
    #include "function.h"
    #include <fstream> //输出文件流
    #include <windows.h>//用到休眠函数
    #include "graph.h"
    using namespace std;
    /***********************************************************
    *功能描述:显示主界面下的欢迎界面
    *输入参数:无
    *输出参数:无
    *返回值:无
    ************************************************************/
    void show3()
    {
        system("color 8f");
        cout<<endl<<endl;
        cout<<"**        *        ** ****** *       ****    ****       *         *      ******"<<endl;
        cout<<" **      ***      **  *      *      *       *    *     * *       * *     *     "<<endl;
        cout<<"  **    ** **    **   *****  *      *       *    *    *   *     *   *    ***** "<<endl;
        cout<<"   **  **   **  **    *      *      *       *    *   *     *   *     *   *     "<<endl;
        cout<<"    ***      ***      *      *      *       *    *  *       * *       *  *     "<<endl;
        cout<<"     *        *       ****** ******  ****    ****  *         *         * ******"<<endl;
        cout<<endl<<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<<"                     ┃6.退票                    ┃\n";
        cout<<"                     ┃━━━━━━━━━━━━━┃\n";
        cout<<"                     ┃7.显示航班信息            ┃\n";
        cout<<"                     ┃━━━━━━━━━━━━━┃\n";
        cout<<"                     ┃0.退出                    ┃\n";
        cout<<"                     ┗━━━━━━━━━━━━━┛\n";
    }


    /***********************************************************
    *功能描述:显示主界面
    *输入参数:单链表L1、L2、L3,选择choice
    *输出参数:无
    *返回值:无
    ************************************************************/
    void show2(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
    {
        int choice=10;
        while(choice!=0)
        {
            show3();
            cin >> choice;
            while(!cin)
            {
                cout<<"输入错误,请重新输入:"<<endl;
                cin.sync();
                cin.clear();
                cin>>choice;
            }
            switch(choice)
            {
            case 1:
            {
                system("cls");
                yuding(L1,L2,L3);
                choice=0;
                break;
            }
            case 2:
            {
                system("cls");
                road1(L1,L2,L3);
                choice=0;
                break;
            }
            case 3:
            {
                system("cls");
                chaxun(L1,L2,L3);
                choice=0;
                break;
            }
            case 4:
            {
                system("cls");
                searchall(L1,L2,L3);
                choice=0;
                break;
            }
            case 5:
            {
                system("cls");
                gaiqian(L1,L2,L3);
                choice=0;
                break;
            }
            case 6:
            {
                system("cls");
                tuipiao(L1,L2,L3);
                choice=0;
                break;
            }
            case 7:
            {
                system("cls");
                xianshi(L1,L2,L3);
                choice=0;
                break;
            }
            case 0:
            {
                exit(0);
                break;
            }
            }
        }
    }
    /***********************************************************
    *功能描述:预定机票模块
    *输入参数:单链表L1、L2、L3、预定的航班号id、姓名y、身份证号z
    *输出参数:无
    *返回值:无
    ************************************************************/


    void yuding(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
    {
        int id,k,l1,l2,l3;
        cout<<"请输入您要预订的航班号"<<endl;
        cin>>id;
        while(!cin)
        {
            cout<<"输入错误,请重新输入:"<<endl;
            cin.sync();
            cin.clear();
            cin>>id;
        }
        if(id<1 || id>3)
        {
            cout<<"航号不存在,请重新输入"<<endl;
            cin>>id;
        }
        else
        {
            {
                int z;
                std::string y;




                cout<<"                          请填写以下信息                                 "<<endl;
                cout<<"                    姓名                      身份证号                              "<<endl;
                cin>>y>>z;


                if(id==1)
                {
                    CLinkList *p=L1;
                    while (p->next!=L1)
                    {
                        p=p->next;
                    }
                    if(p->seat==2)
                    {
                        cout<<"本次航班已卖完,请改乘其他航班"<<endl;
                        yuding(L1,L2,L3);
                    }
                    else
                    {
                        l1=ListLength(L1);
                        ListInsert(L1,l1,id,y,z,l1);
                        p->seat=p->seat+1;
                    }


                }
                else if(id==2)
                {
                    CLinkList *q=L2;
                    while (q->next!=L2)
                    {
                        q=q->next;
                    }
                    if(q->seat==2)
                    {
                        cout<<"本次航班已卖完,请改乘其他航班"<<endl;
                        yuding(L1,L2,L3);
                    }
                    else
                    {
                        l2=ListLength(L2);
                        ListInsert(L2,l2,id,y,z,l2);
                        q->seat=q->seat+1;
                    }


                }
                else if(id==3)
                {
                    CLinkList *s=L3;
                    while (s->next!=L3)
                    {
                        s=s->next;
                    }
                    if(s->seat==2)
                    {
                        cout<<"本次航班已卖完,请改乘其他航班"<<endl;
                        yuding(L1,L2,L3);
                    }
                    else
                    {
                        l3=ListLength(L3);
                        ListInsert(L3,l3,id,y,z,l3);
                        s->seat=s->seat+1;


                    }


                }
                system("cls");//清屏


                cout<<"                                                                              \n";
                cout<<"                                                                              \n";
                cout<<"                                                                              \n";
                cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
                cout<<"                                                                              \n";
                cout<<"                            订票成功                                          \n";
                cout<<"                                                                              \n";
                cout<<"             座位号            姓名                          身份证号         \n";
                cout<<"                                                                              \n";
                if(id==1)
                    cout<<"             "<<l1<<"                  "<<y<<"                          "<<z<<"              \n";
                else if(id==2)
                    cout<<"             "<<l2<<"                  "<<y<<"                          "<<z<<"              \n";
                else if(id==3)
                    cout<<"             "<<l3<<"                  "<<y<<"                          "<<z<<"              \n";
                cout<<"                                                                              \n";
                cout<<"                                                                              \n";
                cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━\n";
                cout<<"                                                                              \n";
                cout<<"                     继续购票请按1 返回主菜单请按0                            \n";
                cin>>k;
                if(k==1)
                {
                    yuding(L1,L2,L3);//继续买票
                }
                else if (k==0)
                {
                    show2(L1,L2,L3);
                }






            }


        }
    }
    /***********************************************************
    *功能描述:查询机票模块
    *输入参数:单链表L1、L2、L3、身份证号id
    *输出参数:无
    *返回值:无
    ************************************************************/
    void chaxun(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
    {
        int id,b=0,c=0,d=0;//b=0作为while循环的条件
        cout<<"请输入您的身份证号"<<endl;
        cin>>id;
        while(!cin)
        {
            cout<<"输入错误,请重新输入:"<<endl;
            cin.sync();
            cin.clear();
            cin>>id;
        }


        b=chaxun2(L1,id);
        c=chaxun2(L2,id);
        d=chaxun2(L3,id);


        if((b+c+d)==0)
        {
            cout<<"未查询到关于您的订票信息"<<endl;
            cout<<"   即将返回到主菜单     "<<endl;
            Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
            show2(L1,L2,L3);
        }
        else
        {
            cout<<"       查询完成         "<<endl;
            cout<<"   即将返回到主菜单     "<<endl;
            Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
            show2(L1,L2,L3);
        }
    }
    /***********************************************************
    *功能描述:查询机票模块的子模块
    *输入参数:单链表L 预定的航班号id
    *输出参数:座号、姓名、身份证号
    *返回值:成功返回0,不成功返回1
    ************************************************************/
    int chaxun2(CLinkList *&L,int &e)
    {
        CLinkList *p=L->next;
        int n=1;
        while (p!=L && p->ID[0]!=e)
        {
            p=p->next;
            n++;
        }


        if(p->ID[0]==e)
        {
            cout<<"------------------------------------------------------------------"<<endl;
            cout<<endl;
            cout<<"座号   姓名       身份证     "<<endl<<endl;
            cout<<p->seat<<"      "<<p->person<<"        "<<e<<endl;
            cout<<endl;
            cout<<"------------------------------------------------------------------"<<endl;
            return 1;
        }
        else
            return 0;


    }
    /***********************************************************
    *功能描述:打印乘客信息到文件模块
    *输入参数:单链表L1、L2、L3、
    *输出参数:座号、姓名、身份证号
    *返回值:无
    ************************************************************/
    void dayin(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
    {




        fstream txtfile;
        txtfile.open( "旅客信息.txt", ios::out );  //打开文件


        txtfile<<"                 旅客信息                                         "<<endl<<endl;
        txtfile<<"------------------------------------------------------------------"<<endl;
        txtfile<<"------------------------------------------------------------------"<<endl;
        txtfile<<"      航班号      座位号               姓名              身份证号                "<<endl;
        txtfile<<"------------------------------------------------------------------"<<endl;


        CLinkList *p=L1->next;
        while (p->next!=L1)
        {
            txtfile<<"      1号航班:     "<<p->seat<<"                 "<<p->person<<"                 "<<p->ID[0]<<endl;
            p=p->next;
        }


        CLinkList *q=L2->next;
        while (q->next!=L2)
        {
            txtfile<<"      2号航班:     "<<q->seat<<"                 "<<q->person<<"                 "<<q->ID[0]<<endl;
            q=q->next;
        }


        CLinkList *r=L3->next;
        while (r->next!=L3)
        {
            txtfile<<"      3号航班:     "<<r->seat<<"                 "<<r->person<<"                 "<<r->ID[0]<<endl;
            r=r->next;
        }


        txtfile<<"------------------------------------------------------------------"<<endl;
        txtfile<<"                   感谢您的信任     祝您旅途愉快                  "<<endl<<endl;//跳格,横向跳到下一制表位
        txtfile<<"------------------------------------------------------------------"<<endl;
        txtfile<<"------------------------------------------------------------------"<<endl;


        txtfile.close();


    }
    /***********************************************************
    *功能描述:查询所有乘客信息模块
    *输入参数:单链表L1、L2、L3、管理员密码passwd
    *输出参数:座号、姓名、身份证号
    *返回值:无
    ************************************************************/
    void searchall(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
    {
        char t;//状态字


        int passwd=1997,k;
        cout<<"请输入管理员密码"<<endl;
        cin>>k;
        if(k==passwd)
        {


            cout<<"   航班号    座号    姓名         身份证号"<<endl;
            cout<<endl;
            CLinkList *p=L1->next;
            while (p->next!=L1)
            {
                cout<<"  1号航班:  "<<p->seat<<"        "<<p->person<<"          "<<p->ID[0]<<endl;
                p=p->next;
            }


            CLinkList *q=L2->next;
            while (q->next!=L2)
            {
                cout<<"  2号航班:  "<<q->seat<<"        "<<q->person<<"          "<<q->ID[0]<<endl;
                q=q->next;
            }


            CLinkList *r=L3->next;
            while (r->next!=L3)
            {
                cout<<"  3号航班:  "<<r->seat<<"        "<<r->person<<"          "<<r->ID[0]<<endl;
                r=r->next;
            }


            cout<<endl;
            cout<<"是否打印所有旅客信息?"<<endl;
            cin>>t;
            if(t=='Y' || t=='y')
            {
                dayin(L1,L2,L3);
                cout<<"   旅客信息打印成功!"<<endl;
                cout<<"   即将返回到主菜单     "<<endl;
                Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
                show2(L1,L2,L3);//返回主菜单
            }
            else
            {
                cout<<"   即将返回到主菜单     "<<endl;
                Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
                show2(L1,L2,L3);//返回主菜单
            }




        }
        else
        {
            cout<<"密码错误!"<<endl;
            cout<<"   即将返回到主菜单     "<<endl;
            Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
            show2(L1,L2,L3);//返回主菜单
        }




    }
    /***********************************************************
    *功能描述:退票模块
    *输入参数:单链表L1、L2、L3、航班号a
    *输出参数:座号、姓名、身份证号
    *返回值:无
    ************************************************************/
    void tuipiao(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
    {
        int id,a,b;
        string name;
        cout<<"请输入您的身份证号、退订的航班号和姓名"<<endl;
        cin>>id>>a>>name;
        if(a<1 || a>3)
        {
            cout<<"航号不存在,请重新输入"<<endl;
            cin>>a;
        }


        while(!cin)
        {
            cout<<"输入错误,请重新输入:"<<endl;
            cin.sync();
            cin.clear();
            cin>>id;
        }


        switch(a)
        {
        case 1:
        {
            b=chaxun2(L1,id);
            if(b==0)
            {
                cout<<"未查询到关于您的订票信息"<<endl;
                cout<<"   即将返回到主菜单     "<<endl;
                Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
                show2(L1,L2,L3);
            }
            else
            {
                CLinkList *p=L1;
                while (p->next!=L1)
                {
                    p=p->next;
                }
                p->seat=p->seat-1;


                delet(L1,id);//删除
                cout<<"已成功将您的订票删除"<<endl;
                cout<<"   即将返回到主菜单     "<<endl;
                Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
                show2(L1,L2,L3);
            }
            break;
        }


        case 2:
        {
            b=chaxun2(L2,id);
            if(b==0)
            {
                cout<<"未查询到关于您的订票信息"<<endl;
                cout<<"   即将返回到主菜单     "<<endl;
                Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
                show2(L1,L2,L3);
            }
            else
            {
                CLinkList *q=L2;
                while (q->next!=L2)
                {
                    q=q->next;
                }
                q->seat=q->seat-1;


                delet(L2,id);//删除
                cout<<"已成功将您的订票删除"<<endl;
                cout<<"   即将返回到主菜单     "<<endl;
                Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
                show2(L1,L2,L3);
            }
            break;
        }


        case 3:
        {
            b=chaxun2(L3,id);
            if(b==0)
            {
                cout<<"未查询到关于您的订票信息"<<endl;
                cout<<"   即将返回到主菜单     "<<endl;
                Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
                show2(L1,L2,L3);
            }
            else
            {
                CLinkList *s=L3;
                while (s->next!=L3)
                {
                    s=s->next;
                }
                s->seat=s->seat-1;


                delet(L3,id);//删除
                cout<<"已成功将您的订票删除"<<endl;
                cout<<"   即将返回到主菜单     "<<endl;
                Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
                show2(L1,L2,L3);
            }
            break;
        }
        }
    }


    /***********************************************************
    *功能描述:退票模块下的一个子模块
    *输入参数:单链表L、身份证号g
    *输出参数:无
    *返回值:无
    ************************************************************/
    void delet(CLinkList *&L,int &g)//退票功能
    {
        CLinkList *p=L->next,*q=L;


        while (p!=L && p->ID[0]!=g)
        {
            q=p;
            p=p->next;
        }
        q->next=p->next;    //从单链表中删除p结点
        free(p);
    }
    /***********************************************************
    *功能描述:显示所有航班信息模块
    *输入参数:单链表L1、L2、L3
    *输出参数:座号、姓名、身份证号
    *返回值:无
    ************************************************************/
    void xianshi(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)//显示航班信息
    {


        cout<<"                  航班信息查询      "<<endl;
        cout<<"                        "<<endl;
        cout<<"         剩余票数      航线             票价      "<<endl;
        cout<<"                                            "<<endl;




        CLinkList *p=L1->next;
        while (p->next!=L1)
        {
            p=p->next;
        }
        cout<<"1号航班:  "<<2-(p->seat)<<"        "<<p->person<<"          "<<p->ID[0]<<endl;


        CLinkList *q=L2->next;
        while (q->next!=L2)
        {
            q=q->next;
        }
        cout<<"2号航班:  "<<2-(q->seat)<<"        "<<q->person<<"          "<<q->ID[0]<<endl;




        CLinkList *r=L3->next;
        while (r->next!=L3)
        {
            r=r->next;
        }
        cout<<"3号航班:  "<<2-(r->seat)<<"        "<<r->person<<"      "<<r->ID[0]<<endl;


        cout<<"即将返回主菜单"<<endl;
        Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
        show2(L1,L2,L3);
    }


    /***********************************************************
    *功能描述:改签模块
    *输入参数:单链表L1、L2、L3、原航班号a、改签航班号e、姓名y、身份证号id
    *输出参数:座号、姓名、身份证号
    *返回值:无
    ************************************************************/
    void gaiqian(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)
    {
        int id,a,b,c,d,e,l1,l2,l3;//id为身份证号,b、c、d用来放返回值,a为原航班号,e为改签航班号
        std::string y;//姓名


        cout<<"                          请填写以下信息                                 "<<endl;
        cout<<"                    姓名                      身份证号                              "<<endl;


        cin>>y>>id;
        while(!cin)
        {
            cout<<"输入错误,请重新输入:"<<endl;
            cin.sync();
            cin.clear();
            cin>>y>>id;
        }


        b=chaxun2(L1,id);
        c=chaxun2(L2,id);
        d=chaxun2(L3,id);


        if((b+c+d)==0)
        {
            cout<<"未查询到关于您的订票信息"<<endl;
            cout<<"   即将返回到主菜单     "<<endl;
            Sleep(2000);
            show2(L1,L2,L3);
        }
        else
        {
            cout<<"请输入您的航班号和您要改签的航班号"<<endl;
            cin>>a>>e;
            if(a<1 || a>3 || e<1 || e>3)
            {
                cout<<"航号不存在,请重新输入"<<endl;
                cin>>a>>e;
            }


            while(!cin)
            {
                cout<<"输入错误,请重新输入:"<<endl;
                cin.sync();
                cin.clear();
                cin>>a>>e;
            }


            switch(e)
            {
            case 1:
            {
                CLinkList *p=L1->next;
                while (p->next!=L1)
                {
                    p=p->next;
                }
                if(p->seat==2)
                {
                    cout<<"您改签的航班机票已售完,请重新选择航班"<<endl;
                    cout<<"   即将返回到主菜单     "<<endl;
                    Sleep(2000);
                    show2(L1,L2,L3);
                }
                else
                {
                    switch(a)
                    {
                    case 1:
                    {
                        cout<<"请输入正确的改签航班号"<<endl;
                        cout<<"   即将返回到主菜单     "<<endl;
                        Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
                        show2(L1,L2,L3);
                        break;
                    }
                    case 2:
                    {
                        delet(L2,id);//删除原航班机票
                        CLinkList *q=L2->next;
                        while (q->next!=L2)
                        {
                            q=q->next;
                        }
                        q->seat=q->seat-1;  //原机票已退


                        l2=ListLength(L1);//购买新机票
                        ListInsert(L1,l2,id,y,id,l2);
                        p->seat=p->seat+1;
                        cout<<"改签成功"<<endl;
                        cout<<"   即将返回到主菜单     "<<endl;
                        Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
                        show2(L1,L2,L3);
                        break;
                    }
                    case 3:
                    {
                        delet(L3,id);//删除原航班机票
                        CLinkList *q=L3->next;
                        while (q->next!=L3)
                        {
                            q=q->next;
                        }
                        q->seat=q->seat-1;  //原机票已退


                        l2=ListLength(L1);//购买新机票
                        ListInsert(L1,l2,id,y,id,l2);
                        p->seat=p->seat+1;
                        cout<<"改签成功"<<endl;
                        cout<<"   即将返回到主菜单     "<<endl;
                        Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
                        show2(L1,L2,L3);
                        break;
                    }


                    }


                }


                break;
            }


            case 2:
            {
                CLinkList *p=L2->next;
                while (p->next!=L2)
                {
                    p=p->next;
                }
                if(p->seat==2)
                {
                    cout<<"您改签的航班机票已售完,请重新选择航班"<<endl;
                    cout<<"   即将返回到主菜单     "<<endl;
                    Sleep(2000);
                    show2(L1,L2,L3);
                }
                else
                {
                    switch(a)
                    {
                    case 1:
                    {
                        delet(L1,id);//删除原航班机票
                        CLinkList *q=L1->next;
                        while (q->next!=L1)
                        {
                            q=q->next;
                        }
                        q->seat=q->seat-1;  //原机票已退


                        l2=ListLength(L2);//购买新机票
                        ListInsert(L2,l2,id,y,id,l2);
                        p->seat=p->seat+1;
                        cout<<"改签成功"<<endl;
                        cout<<"   即将返回到主菜单     "<<endl;
                        Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
                        show2(L1,L2,L3);
                        break;
                    }
                    case 2:
                    {
                        cout<<"请输入正确的改签航班号"<<endl;
                        cout<<"   即将返回到主菜单     "<<endl;
                        Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
                        show2(L1,L2,L3);
                        break;
                    }
                    case 3:
                    {
                        delet(L3,id);//删除原航班机票
                        CLinkList *q=L3->next;
                        while (q->next!=L3)
                        {
                            q=q->next;
                        }
                        q->seat=q->seat-1;  //原机票已退


                        l2=ListLength(L2);//购买新机票
                        ListInsert(L2,l2,id,y,id,l2);
                        p->seat=p->seat+1;
                        cout<<"改签成功"<<endl;
                        cout<<"   即将返回到主菜单     "<<endl;
                        Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
                        show2(L1,L2,L3);
                        break;
                    }
                    }
                }
                break;
            }


            case 3:
            {
                CLinkList *p=L3->next;
                while (p->next!=L3)
                {
                    p=p->next;
                }
                if(p->seat==2)
                {
                    cout<<"您改签的航班机票已售完,请重新选择航班"<<endl;
                    cout<<"   即将返回到主菜单     "<<endl;
                    Sleep(2000);
                    show2(L1,L2,L3);
                }
                else
                {
                    switch(a)
                    {
                    case 1:
                    {
                        delet(L1,id);//删除原航班机票
                        CLinkList *q=L1->next;
                        while (q->next!=L1)
                        {
                            q=q->next;
                        }
                        q->seat=q->seat-1;  //原机票已退


                        l2=ListLength(L3);//购买新机票
                        ListInsert(L3,l2,id,y,id,l2);
                        p->seat=p->seat+1;
                        cout<<"改签成功"<<endl;
                        cout<<"   即将返回到主菜单     "<<endl;
                        Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
                        show2(L1,L2,L3);
                        break;
                    }
                    case 2:
                    {


                        delet(L2,id);//删除原航班机票
                        CLinkList *q=L2->next;
                        while (q->next!=L2)
                        {
                            q=q->next;
                        }
                        q->seat=q->seat-1;  //原机票已退


                        l2=ListLength(L3);//购买新机票
                        ListInsert(L3,l2,id,y,id,l2);
                        p->seat=p->seat+1;
                        cout<<"改签成功"<<endl;
                        cout<<"   即将返回到主菜单     "<<endl;
                        Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
                        show2(L1,L2,L3);
                        break;
                    }
                    case 3:
                    {
                        cout<<"请输入正确的改签航班号"<<endl;
                        cout<<"   即将返回到主菜单     "<<endl;
                        Sleep(2000);//window下睡眠函数单位是毫秒,linux下单位是秒
                        show2(L1,L2,L3);
                        break;
                    }
                    }
                }
                break;
            }
            }
        }
    }


    linlist.cpp:

  14. /***********************************************************
    *版权所有(C)2017,Shengkai
    *
    *文件名称:linlist.cpp
    *文件标识:无
    *内容摘要:该文件用于执行有关链表功能的函数
    *其它说明:无
    *当前版本:V1.5
    *作者:盛凯
    *完成日期:20171222
    *
    **********************************************************/
    //循环单链表基本运算函数
    #include <stdio.h>
    #include <malloc.h>
    #include <iostream>
    #include "linlist.h"
    using namespace std;
    /***********************************************************
    *功能描述:头插法
    *输入参数:单链表L、机票数a、始发地和目的地b、票价c
    *输出参数:无
    *返回值:无
    ************************************************************/
    void CreateListF(CLinkList *&L,int a,std::string b,int c)//头插法建立循环单链表
    {
        CLinkList *s;


        L=(CLinkList *)malloc(sizeof(CLinkList));   //创建头结点
        L->next=NULL;
        //for (i=0; i<n; i++)
        {
            s=(CLinkList *)malloc(sizeof(CLinkList));//创建新结点
            s->seat=a;
            s->person=b;
            s->ID[0]=c;
            s->next=L->next;            //将*s插在原开始结点之前,头结点之后
            L->next=s;
        }
        s=L->next;
        while (s->next!=NULL)           //查找尾结点,由s指向它
            s=s->next;
        s->next=L;                      //尾结点next域指向头结点


    }
    /***********************************************************
    *功能描述:尾插法
    *输入参数:单链表L、机票数a、始发地和目的地b、票价c
    *输出参数:无
    *返回值:无
    ************************************************************/
    void CreateListR(CLinkList *&L,int a,std::string b,int c)//尾插法建立循环单链表
    {
        CLinkList *s,*r;
        int i;
        L=(CLinkList *)malloc(sizeof(CLinkList));   //创建头结点
        L->next=NULL;
        r=L;                    //r始终指向终端结点,开始时指向头结点
        //for (i=0; i<n; i++)
        {
            s=(CLinkList *)malloc(sizeof(CLinkList));//创建新结点
            s->seat=a;
            s->person=b;
            s->ID[0]=c;
            r->next=s;          //将*s插入*r之后
            r=s;
        }
        r->next=L;              //尾结点next域指向头结点
    }
    /***********************************************************
    *功能描述:初始化链表
    *输入参数:单链表L
    *输出参数:无
    *返回值:无
    ************************************************************/
    void InitList(CLinkList *&L) //初始化链表
    {
        L=(CLinkList *)malloc(sizeof(CLinkList));   //创建头结点
        L->next=L;
    }
    /***********************************************************
    *功能描述:删除模块
    *输入参数:单链表L
    *输出参数:无
    *返回值:无
    ************************************************************/
    void DestroyList(CLinkList *&L) //销毁链表
    {
        CLinkList *p=L,*q=p->next;
        while (q!=L)
        {
            free(p);
            p=q;
            q=p->next;
        }
        free(p);
    }
    /***********************************************************
    *功能描述:判断链表是否为空
    *输入参数:单链表L1
    *输出参数:无
    *返回值:无
    ************************************************************/
    bool ListEmpty(CLinkList *L)  //判断链表是否为空
    {
        return(L->next==L);
    }
    /***********************************************************
    *功能描述:输出链表长度
    *输入参数:单链表L1
    *输出参数:链表长度i
    *返回值:链表长度i
    ************************************************************/
    int ListLength(CLinkList *L)  //求链表长度
    {
        CLinkList *p=L;
        int i=0;
        while (p->next!=L)
        {
            i++;
            p=p->next;
        }
        return(i);
    }
    /***********************************************************
    *功能描述:输出链表
    *输入参数:单链表L
    *输出参数:链表p
    *返回值:无
    ************************************************************/
    void DispList(CLinkList *L)  //输出链表
    {
        CLinkList *p=L->next;
        while (p!=L)
        {
            printf("%d ",p->seat);
            cout<<p->person;
            printf(" %d ",p->ID[0]);
            p=p->next;
        }
        printf("\n");
    }
    /***********************************************************
    *功能描述:取链表元素
    *输入参数:单链表L1、座号e、姓名f、身份证号g
    *输出参数:无
    *返回值:真返回true,假返回false
    ************************************************************/
    bool GetElem(CLinkList *L,int i,int &e,std::string &f,int &g)  //取链表元素
    {
        int j=0;
        CLinkList *p;
        if (L->next!=L)     //单链表不为空表时
        {
            if (i==1)
            {
                e=L->next->seat;
                f=L->next->person;
                g=L->next->ID[0];
                return true;
            }
            else            //i不为1时
            {
                p=L->next;
                while (j<i-1 && p!=L)
                {
                    j++;
                    p=p->next;
                }
                if (p==L)
                    return false;
                else
                {
                    e=L->next->seat;
                    f=L->next->person;
                    g=L->next->ID[0];
                    return true;
                }
            }
        }
        else                //单链表为空表时
            return false;
    }
    /***********************************************************
    *功能描述:查找元素模块
    *输入参数:单链表L、身份证号e
    *输出参数:无
    *返回值:为真返回1或n,为假返回0
    ************************************************************/
    int LocateElem(CLinkList *L,int &e)  //查找元素
    {
        CLinkList *p=L->next;
        int n=1;
        while (p!=L && p->ID[0]!=e)
        {
            p=p->next;
            n++;
        }
        if (p==L)
            return(0);
        else
            return(n);
    }
    /***********************************************************
    *功能描述:插入节点模块
    *输入参数:单链表L、座位号e、姓名f、身份证号g
    *输出参数:无
    *返回值:无
    ************************************************************/
    bool ListInsert(CLinkList *&L,int i,int &e,std::string &f,int &g,int l)  //插入节点
    {
        int j=0;
        CLinkList *p=L,*s;
        if (p->next==L || i==1)     //原单链表为空表或i==1时
        {
            s=(CLinkList *)malloc(sizeof(CLinkList));   //创建新结点*s
            s->seat=l;
            s->person=f;
            s->ID[0]=g;
            s->next=p->next;        //将*s插入到*p之后
            p->next=s;
            return true;
        }
        else
        {
            p=L->next;
            while (j<i-2 && p!=L)
            {
                j++;
                p=p->next;
            }
            if (p==L)               //未找到第i-1个结点
                return false;
            else                    //找到第i-1个结点*p
            {
                s=(CLinkList *)malloc(sizeof(CLinkList));   //创建新结点*s
                s->seat=l;
                s->person=f;
                s->ID[0]=g;
                s->next=p->next;                        //将*s插入到*p之后
                p->next=s;
                return true;
            }
        }
    }
    /***********************************************************
    *功能描述:删除节点模块
    *输入参数:单链表L、座位号e、姓名f、身份证号g
    *输出参数:无
    *返回值:为真返回true,为假返回false
    ************************************************************/
    bool ListDelete(CLinkList *&L,int i,int &e,std::string &f,int &g)   //删除节点
    {
        int j=0;
        CLinkList *p=L,*q;
        if (p->next!=L)                 //原单链表不为空表时
        {
            if (i==1)                   //i==1时
            {
                q=L->next;              //删除第1个结点
                L->seat=e;
                L->person=f;
                L->ID[0]=g;
                L->next=q->next;
                free(q);
                return true;
            }
            else                        //i不为1时
            {
                p=L->next;
                while (j<i-2 && p!=L)
                {
                    j++;
                    p=p->next;
                }
                if (p==L)               //未找到第i-1个结点
                    return false;
                else                    //找到第i-1个结点*p
                {
                    q=p->next;          //q指向要删除的结点
                    e=q->seat;
                    f=q->person;
                    g=q->ID[0];
                    p->next=q->next;    //从单链表中删除*q结点
                    free(q);            //释放*q结点
                    return true;
                }
            }
        }
        else
            return 0;
    }

    graph.cpp:

  15. /***********************************************************
    *版权所有(C)2017,Shengkai
    *
    *文件名称:graph.cpp
    *文件标识:无
    *内容摘要:该文件用于执行关于图的函数
    *其它说明:无
    *当前版本:V1.5
    *作者:盛凯
    *完成日期:20171222
    *
    **********************************************************/
    #include <stdio.h>
    #include <malloc.h>
    #include <string>
    #include "graph.h"
    #include "function.h"
    #include <iostream>
    #include <string.h>
    #include <windows.h>//休眠函数
    #define MaxSize 100


    using namespace std;
    /***********************************************************
    *功能描述:查找路径上的顶点
    *输入参数:图g、起点、终点
    *输出参数:无
    *返回值:无
    ************************************************************/
    void Ppath(int path[],int i,int v,MGraph g)  //前向递归查找路径上的顶点
    {
        int k;
        k=path[i];
        if (k==v)  return;          //找到了起点则返回
        Ppath(path,k,v,g); //找顶点k的前一个顶点
        switch(k)
        {
        case 0 :
        {
            printf("%s,",g.vexs[0].city.c_str());
            break;
        }
        case 1 :
        {
            printf("%s,",g.vexs[1].city.c_str());
            break;
        }
        case 2 :
        {
            printf("%s,",g.vexs[2].city.c_str());
            break;
        }
        case 3 :
        {
            printf("%s,",g.vexs[3].city.c_str());
            break;
        }


        }
    }
    /***********************************************************
    *功能描述:输出路径
    *输入参数:图g、起点v,终点i
    *输出参数:起点、终点、路径
    *返回值:无
    ************************************************************/
    void Dispath(int dist[],int path[],int s[],int n,int v,MGraph g,char m[20])//v是起点,i是终点,dist[]是路径长度即权值,path是路径,S是一个状态数组,为-1则不存在,为1则代表有最短路径,m为目的地
    {


        g.vexs[0].city="烟台";
        g.vexs[1].city="济南";
        g.vexs[2].city="北京";
        g.vexs[3].city="上海";


        int i;
        for (i=0; i<n; i++)
            if (s[i]==1 )
            {
                if(g.vexs[v].city.c_str()!=g.vexs[i].city.c_str() && g.vexs[i].city==m)
                {
                    printf("          从%s到%s的最短路径长度为:%d\t路径为:",g.vexs[v].city.c_str(), g.vexs[i].city.c_str(),dist[i]);
                    printf("%s,",g.vexs[v].city.c_str());    //输出路径上的起点
                    Ppath(path,i,v,g);    //输出路径上的中间点
                    printf("%s\n",g.vexs[i].city.c_str());   //输出路径上的终点
                }


            }
    }
    /***********************************************************
    *功能描述:最小路径
    *输入参数:图g、源点v
    *输出参数:无
    *返回值:无
    ************************************************************/
    void Dijkstra(MGraph g,int v,char m[20])//迪克斯特拉最短路径算法
    {
        int dist[MAXV],path[MAXV];
        int s[MAXV];
        int mindis,i,j,u;
        for (i=0; i<g.n; i++)
        {
            dist[i]=g.edges[v][i];      //距离初始化
            s[i]=0;
            //s[]置空


            if (g.edges[v][i]<INF)      //路径初始化
                path[i]=v;
            else
                path[i]=-1;
        }
        s[v]=1;
        path[v]=0;              //源点编号v放入s中
        for (i=0; i<g.n; i++)               //循环直到所有顶点的最短路径都求出
        {
            mindis=INF;                 //mindis置最小长度初值
            for (j=0; j<g.n; j++)       //选取不在s中且具有最小距离的顶点u
                if (s[j]==0 && dist[j]<mindis)
                {
                    u=j;
                    mindis=dist[j];
                }
            s[u]=1;                     //顶点u加入s中
            for (j=0; j<g.n; j++)       //修改不在s中的顶点的距离
                if (s[j]==0)
                    if (g.edges[u][j]<INF && dist[u]+g.edges[u][j]<dist[j])
                    {
                        dist[j]=dist[u]+g.edges[u][j];
                        path[j]=u;
                    }
        }
        Dispath(dist,path,s,g.n,v,g,m);     //输出最短路径
    }




    //功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
    //参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
    //      n - 矩阵的阶数
    //      g - 要构造出来的邻接矩阵数据结构


    /***********************************************************
    *功能描述:构建邻接矩阵
    *输入参数:图g、矩阵长度n
    *输出参数:无
    *返回值:无
    ************************************************************/
    void ArrayToMat(int *Arr, int n, MGraph &g)
    {
        int i,j,count=0;  //count用于统计边数,即矩阵中非0元素个数
        g.n=n;
        for (i=0; i<g.n; i++)
            for (j=0; j<g.n; j++)
            {
                g.edges[i][j]=Arr[i*n+j]; //将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j],计算存储位置的功夫在此应用
                if(g.edges[i][j]!=0 && g.edges[i][j]!=INF)
                    count++;
            }
        g.e=count;
    }
    /***********************************************************
    *功能描述:构建邻接表
    *输入参数:图g、矩阵长度n
    *输出参数:无
    *返回值:无
    ************************************************************/
    void ArrayToList(int *Arr, int n, ALGraph *&G)
    {
        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->e=count;
    }
    /***********************************************************
    *功能描述:将邻接矩阵g转换成邻接表G
    *输入参数:邻接矩阵g、邻接表G
    *输出参数:无
    *返回值:无
    ************************************************************/
    void MatToList(MGraph g, ALGraph *&G)
    //将邻接矩阵g转换成邻接表G
    {
        int i,j;
        ArcNode *p;
        G=(ALGraph *)malloc(sizeof(ALGraph));
        for (i=0; i<g.n; i++)                   //给邻接表中所有头节点的指针域置初值
            G->adjlist[i].firstarc=NULL;
        for (i=0; i<g.n; i++)                   //检查邻接矩阵中每个元素
            for (j=g.n-1; j>=0; j--)
                if (g.edges[i][j]!=0)       //存在一条边
                {
                    p=(ArcNode *)malloc(sizeof(ArcNode));   //创建一个节点*p
                    p->adjvex=j;
                    p->info=g.edges[i][j];
                    p->nextarc=G->adjlist[i].firstarc;      //采用头插法插入*p
                    G->adjlist[i].firstarc=p;
                }
        G->n=g.n;
        G->e=g.e;
    }
    /***********************************************************
    *功能描述:将邻接表G转换成邻接矩阵g
    *输入参数:邻接表G、邻接矩阵g
    *输出参数:无
    *返回值:无
    ************************************************************/
    void ListToMat(ALGraph *G,MGraph &g)
    //将邻接表G转换成邻接矩阵g
    {
        int i,j;
        ArcNode *p;
        g.n=G->n;   //g.n未赋值,下面的初始化不起作用
        g.e=G->e;
        for (i=0; i<g.n; i++)   //先初始化邻接矩阵
            for (j=0; j<g.n; j++)
                g.edges[i][j]=0;
        for (i=0; i<G->n; i++)  //根据邻接表,为邻接矩阵赋值
        {
            p=G->adjlist[i].firstarc;
            while (p!=NULL)
            {
                g.edges[i][p->adjvex]=p->info;
                p=p->nextarc;
            }
        }
    }
    /***********************************************************
    *功能描述:输出邻接矩阵g
    *输入参数:邻接矩阵g
    *输出参数:邻接矩阵g
    *返回值:无
    ************************************************************/
    void DispMat(MGraph g)
    //输出邻接矩阵g
    {
        int i,j;
        for (i=0; i<g.n; i++)
        {
            for (j=0; j<g.n; j++)
                if (g.edges[i][j]==INF)
                    printf("%3s","∞");
                else
                    printf("%3d",g.edges[i][j]);
            printf("\n");
        }
    }
    /***********************************************************
    *功能描述:输出邻接表G
    *输入参数:邻接表G
    *输出参数:邻接表G
    *返回值:无
    ************************************************************/
    void DispAdj(ALGraph *G)
    //输出邻接表G
    {
        int i;
        ArcNode *p;
        for (i=0; i<G->n; i++)
        {
            p=G->adjlist[i].firstarc;
            printf("%3d: ",i);
            while (p!=NULL)
            {
                printf("-->%d/%d ",p->adjvex,p->info);
                p=p->nextarc;
            }
            printf("\n");
        }
    }


    /***********************************************************
    *功能描述:最小路径模块
    *输入参数:单链表L1、单链表L2、单链表L3、始发地c、目的地m
    *输出参数:所有城市的出度、最大出度、始发地和目的地之间的最短路径
    *返回值:无
    ************************************************************/
    void road1(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3)//最小路径
    {
        char xz;
        MGraph g;
        ALGraph *G;
        int A[4][4]=             //初始化城市距离
        {
            {0,2,INF,4},
            {INF,0,3,INF},
            {INF,INF,0,INF},
            {INF,INF,5,0}


        };


        int B[4][4]=             //初始化城市距离
        {
            {0,2,0,4},
            {0,0,3,0},
            {0,0,0,0},
            {0,0,5,0}


        };
        char c[20],m[20];//为什么 string c,m不行?
        cout<<"                                                                              "<<endl;
        cout<<"                                                                              "<<endl;
        cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
        cout<<"                                                                              "<<endl;
        cout<<"                                                                              "<<endl;
        cout<<"                         欢迎进入观光航线订票界面                             "<<endl;
        cout<<"                                                                              "<<endl;
        cout<<"    我们共有2种路线供您选择                                                   "<<endl;
        cout<<"                                                                              "<<endl;
        cout<<"                                                                              "<<endl;
        cout<<"           航线1:          烟台——济南——北京                                  "<<endl;
        cout<<"                                                                              "<<endl;
        cout<<"           航线2:          烟台——上海——北京                                  "<<endl;
        cout<<"                                                                              "<<endl;
        cout<<"                                                                              "<<endl;
        cout<<"   附:                                                                       "<<endl;
        cout<<"        烟台——济南: 2小时             济南——北京: 3小时                     "<<endl;
        cout<<"                                                                              "<<endl;
        cout<<"        烟台——上海: 4小时             上海——北京: 5小时                     "<<endl;
        cout<<"                                                                              "<<endl;
        cout<<"                                                                              "<<endl;
        cout<<"                                                                              "<<endl;
        ArrayToList(B[0],4,G);
        OutDs(G);
        cout<<"                                                                              "<<endl;
        cout<<"   可到达城市最多的是:                                                       "<<endl;
        cout<<"                                                                              "<<endl;
        OutMaxDs(G);
        cout<<"                                                                              "<<endl;
        cout<<"                                                                              "<<endl;
        cout<<"━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━"<<endl;
        cout<<"                                                                              "<<endl;
        cout<<"                   请输入您的出发地和目的地                                   "<<endl;
        cin>>c>>m;//出发地和目的地
        cout<<"                                                                              "<<endl;
        if(strcmp(c,"烟台")==0)
        {
            ArrayToMat(A[0],4,g);
            Dijkstra(g,0,m);
            cout<<"                      "<<endl;
            cout<<"           是否退出飞机订票系统?"<<endl;
            cin>>xz;
            if(xz=='Y' || xz=='y')
            {
                cout<<"感谢您的使用!"<<endl;
                Sleep(2000);
                exit(0);
            }
            else if (xz=='N' || xz=='n')
            {
                cout<<"即将返回主界面!"<<endl;
                Sleep(2000);
                show2(L1,L2,L3);


            }
            else
            {
                cout<<"请正确输入!"<<endl;
                cin>>xz;
            }
        }
        else if(strcmp(c,"济南")==0)
        {
            ArrayToMat(A[0],4,g);
            Dijkstra(g,1,m);
            cout<<"           是否退出飞机订票系统?"<<endl;
            cin>>xz;
            if(xz=='Y' || xz=='y')
            {
                cout<<"感谢您的使用!"<<endl;
                Sleep(2000);
                exit(0);
            }
            else if (xz=='N' || xz=='n')
            {
                cout<<"即将返回主界面!"<<endl;
                Sleep(2000);
                show2(L1,L2,L3);
            }
            else
            {
                cout<<"请正确输入!"<<endl;
                cin>>xz;
            }
        }
        else if(strcmp(c,"上海")==0)
        {
            ArrayToMat(A[0],4,g);
            Dijkstra(g,3,m);
            cout<<"         是否退出飞机订票系统?"<<endl;
            cin>>xz;
            if(xz=='Y' || xz=='y')
            {
                cout<<"感谢您的使用!"<<endl;
                Sleep(2000);
                exit(0);
            }
            else if (xz=='N' || xz=='n')
            {
                cout<<"即将返回主界面!"<<endl;
                Sleep(2000);
                show2(L1,L2,L3);
            }
            else
            {
                cout<<"请正确输入!"<<endl;
                cin>>xz;
            }
        }
        else
        {
            cout<<"抱歉您输入的地点暂不提供航班服务"<<endl;
        }

    }
    /***********************************************************
    *功能描述:输出图G中编号为v的顶点的出度
    *输入参数:图G、顶点v
    *输出参数:顶点v的出度n
    *返回值:无
    ************************************************************/
    //返回图G中编号为v的顶点的出度
    int OutDegree(ALGraph *G,int v)
    {
        ArcNode *p;
        int n=0;
        p=G->adjlist[v].firstarc;
        while (p!=NULL)
        {
            n++;
            p=p->nextarc;
        }
        return n;
    }
    /***********************************************************
    *功能描述:输出图G中出度最大的一个顶点
    *输入参数:图G
    *输出参数:出度最大的顶点maxds
    *返回值:无
    ************************************************************/
    //输出图G中出度最大的一个顶点
    void OutMaxDs(ALGraph *G)
    {
        int maxv=0,maxds=0,i,x;
        for (i=0; i<G->n; i++)
        {
            x=OutDegree(G,i);
            if (x>maxds)
            {
                maxds=x;
                maxv=i;
            }
        }
        if(maxv==0)
            printf("   烟台,可到城市为 %d 个\n",maxds);
        else if(maxv==1)
            printf("   济南,可到城市为 %d 个\n",maxds);
        else if(maxv==2)
            printf("   北京,可到城市为 %d 个\n",maxds);
        else if(maxv==3)
            printf("   上海,可到城市为 %d 个\n",maxds);
    }
    /***********************************************************
    *功能描述:输出图G中每个顶点的出度
    *输入参数:图G
    *输出参数:每个顶点的出度
    *返回值:无
    ************************************************************/
    //输出图G中每个顶点的出度
    void OutDs(ALGraph *G)
    {
        int i;
        for (i=0; i<G->n; i++)
        {
            if(i==0)
                printf("  烟台可到达 %d 个城市\n",OutDegree(G,i));
            else if(i==1)
                printf("  济南可到达 %d 个城市\n",OutDegree(G,i));
            else if(i==2)
                printf("  北京可到达 %d 个城市\n",OutDegree(G,i));
            else if(i==3)
                printf("  上海可到达 %d 个城市\n",OutDegree(G,i));
        }

    }

  16. function.h:

  17. /***********************************************************
    版权所有(C)2017,Shengkai
    *
    *文件名称:function.h
    *文件标识:无
    *内容摘要:该代码用于存放主页面下所有功能函数的函数声明
    *其它说明:无
    *当前版本:V1.5
    *作者:盛凯
    *完成日期:20171222
    *
    **********************************************************/
    #ifndef FUNCTION_H_INCLUDED
    #define FUNCTION_H_INCLUDED

    #include "linlist.h"
    void show3();//主界面下的欢迎界面
    void show2(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//主界面
    void yuding(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//订票
    void chaxun(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//查询订票
    int chaxun2(CLinkList *&L,int &e);//查询模块下具体进行查询的函数
    void dayin(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//打印信息
    void searchall(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//查询所有旅客信息
    void tuipiao(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//退票
    void delet(CLinkList *&L,int &g);//退票模块下具体进行删除信息的函数
    void xianshi(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//显示航班信息
    void gaiqian(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);//改签

    #endif // FUNCTION_H_INCLUDED

  18. graph.h:

  19. /***********************************************************
    版权所有(C)2017,Shengkai
    *
    *文件名称:graph.h
    *文件标识:无
    *内容摘要:该代码用于存放有关图的函数声明
    *其它说明:无
    *当前版本:V1.5
    *作者:盛凯
    *完成日期:20171222
    *
    **********************************************************/
    #ifndef GRAPH_H_INCLUDED
    #define GRAPH_H_INCLUDED
    #include<string>
    #include "linlist.h"
    #define MAXV 100                //最大顶点个数
    #define INF 32767       //INF表示∞
    typedef int InfoType;

    //以下定义邻接矩阵类型
    typedef struct
    {
        int no;                     //顶点编号
        InfoType info;  //顶点其他信息,在此存放带权图权值
        std::string city;       //存放城市的名字
    } VertexType;                   //顶点类型

    typedef struct                  //图的定义
    {
        int edges[MAXV][MAXV];      //邻接矩阵
        int n,e;                    //顶点数,弧数
        VertexType vexs[MAXV];      //存放顶点信息
    } MGraph;                       //图的邻接矩阵类型

    //以下定义邻接表类型
    typedef struct ANode            //弧的结点结构类型
    {
        int adjvex;                 //该弧的终点位置
        struct ANode *nextarc;      //指向下一条弧的指针
        InfoType info;              //该弧的相关信息,这里用于存放权值
    } ArcNode;

    typedef int 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 ArrayToMat(int *Arr, int n, MGraph &g); //用普通数组构造图的邻接矩阵
    void ArrayToList(int *Arr, int n, ALGraph *&); //用普通数组构造图的邻接表
    void MatToList(MGraph g,ALGraph *&G);//将邻接矩阵g转换成邻接表G
    void ListToMat(ALGraph *G,MGraph &g);//将邻接表G转换成邻接矩阵g
    void DispMat(MGraph g);//输出邻接矩阵g
    void DispAdj(ALGraph *G);//输出邻接表G
    void Dijkstra(MGraph g,int v,char m[20]);
    void road1(CLinkList *&L1,CLinkList *&L2,CLinkList *&L3);
    int OutDegree(ALGraph *G,int v);
    void OutMaxDs(ALGraph *G);
    void OutDs(ALGraph *G);

    #endif // GRAPH_H_INCLUDED

  20. linlist.h:

  21. /***********************************************************
    版权所有(C)2017,Shengkai
    *
    *文件名称:linlist.h
    *文件标识:无
    *内容摘要:该代码用于存放关于链表的函数声明
    *其它说明:无
    *当前版本:V1.5
    *作者:盛凯
    *完成日期:20171222
    *
    **********************************************************/
    #ifndef CLINKLIST_H_INCLUDED
    #define CLINKLIST_H_INCLUDED
    #include <string>
    //循环单链表基本运算函数

    typedef struct LNode        //定义单链表结点类型
    {
        int seat;
        std::string person;
        int ID[10];
        struct LNode *next;
    } CLinkList;

    void CreateListF(CLinkList *&L,int a,std::string b,int c);//头插法建立循环单链表
    void CreateListR(CLinkList *&L,int a,std::string b,int c);//尾插法建立循环单链表
    void InitList(CLinkList *&L); //初始化链表
    void DestroyList(CLinkList *&L); //销毁链表
    bool ListEmpty(CLinkList *L);  //判断链表是否为空
    int ListLength(CLinkList *L);  //求链表长度
    void DispList(CLinkList *L);  //输出链表
    bool GetElem(CLinkList *L,int i,int &e,std::string &f,int &g);  //取链表元素
    int LocateElem(CLinkList *L,int &e);  //查找元素
    bool ListInsert(CLinkList *&L,int i,int &e,std::string &f,int &g,int l);  //插入节点
    bool ListDelete(CLinkList *&L,int i,int &e,std::string &f,int &g);   //删除节点

    #endif // CLINKLIST_H_INCLUDED

  22. 程序运行结果图:
  23. 数据结构课程设计——飞机订票系统



相关文章: