您的位置:首页 > 理论基础 > 数据结构算法

数据结构课程设计——飞机订票系统

2017-12-22 09:56 393 查看
/* 

*Copyright(c)2017,烟台大学计算机学院 

*All right reserved. 

*项目名:SK

*作者:盛凯 

*完成日期:2017年12月22日 

*版本号:v1.5



*问题描述:模拟航空订票业务,设计一个可以提供各种航班信息查询和服务的飞机订票系统。

*

main.cpp:

/***********************************************************

*版权所有(C)2017,S
1fb17
hengkai

*

*文件名称: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:

/***********************************************************

*版权所有(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:

/***********************************************************

*版权所有(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:

/***********************************************************

*版权所有(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));

    }

}

function.h:

/***********************************************************

版权所有(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

graph.h:

/***********************************************************

版权所有(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

linlist.h:

/***********************************************************

版权所有(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

程序运行结果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: