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

/***********************************************************  
*版权所有(C)2017  
*  
*文件名称:head.h,graph.h  
*文件标识:无  
*内容摘要:各类函数的头文件
*其它说明:无  
*当前版本:V1.5  
*作者:王硕  
*完成日期:2017,12,22 
***********************************************************/ 

#ifndef HEAD_H_INCLUDED
#define HEAD_H_INCLUDED

#include 
#include 
using namespace std;
#include 
#include 
#include 
#include 
#include 
#include 
#include 
/************************************
* 功能描述:关于链表和链队和文件的头文件
* 输入参数:无
* 输出参数:无
************************************/
typedef struct Yidingkehu
{
    //单链表
    char name[15];//已订票的客户姓名
    int dingpiaoshu;//已订票数量
    struct Yidingkehu *next1;//
} Link;


typedef struct Weidingkehu
{
    //单链队
    char name[15];//预订票的客户姓名
    int yudingpiao;// 要订票数量
    struct Weidingkehu *next2;//下一个链队结点指针
} Qptr;


typedef struct//链队头结点
{
    Qptr *front;
    Qptr *rear;
} LinkQuNode;


typedef struct Hangxian
{
    //创建一个含有六个信息的结构体
    char hangbanhao[15];//航班号-
    char feijihao[15];//飞机号
    int feixingriqi;//起飞时间
    int chenkerenshu;//座位数
    int yupiao;//余票
    char zhongdianzhan[15];//降落城市
    struct Hangxian *next;//指向下一个链结点的指针
    struct Yidingkehu *yiding;//定义一个指向已订票客户的头结点指针,一个航班节点可以指向多个已订票客户节点
    struct Weidingkehu *yudingqueue1;
    struct Weidingkehu *yudingqueue2;
} Linklist;


void InitLinklist(Linklist *&L);//初始化单链表
void menu(Linklist *&L);//主菜单
void initqueue(LinkQuNode *&q);//初始化单链队
void hbhchaxun(Linklist *&L);//通过航班号查询
void mddchaxun(Linklist *&L);//通过目的地查询
void lurugongneng(Linklist *&L);//选择录入方法
void lurugongneng1(Linklist *&L);//初始化录入功能
void chaxungongneng(Linklist *&L);//查询功能
void dingpiaogongneng(Linklist *&L);//订票功能
void tuipiaogongneng(Linklist *&L);//退票功能
void Read(Linklist *&L);
void Write(Linklist *&L);

#endif // HEAD_H_INCLUDED
#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED
#include 
#include 
using namespace std;
#define MAXV 100                //最大顶点个数
#define INF 32767       //INF表示∞

/************************************
* 功能描述:关于图和最短路径的头文件
* 输入参数:无
* 输出参数:无
************************************/
typedef int InfoType;

//以下定义邻接矩阵类型
typedef struct
{
    int no;                     //顶点编号
    char name[30];                //名称
    InfoType info;
    //string cname;              //顶点其他信息,在此存放带权图权值
} 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);
void Dispath(int dist[],int path[],int s[],int n,int v);
void Ppath(int path[],int i,int v);

#endif // GRAPH_H_INCLUDED

实现函数功能的cpp文件:

/***********************************************************  
*版权所有(C)2017  
*  
*文件名称:head.h,graph.h  
*文件标识:无  
*内容摘要:实现函数功能的cpp文件
*其它说明:无  
*当前版本:V1.5  
*作者:王硕  
*完成日期:2017,12,22 
***********************************************************/ 
#include 
using namespace std;
#include 
#include 
#include 
#include "head.h"
/************************************
* 功能描述:菜单函数,提供选择界面
* 输入参数:无
* 输出参数:无
************************************/
void menu(Linklist *&L)
{
    int n;
    system("color f8");
    do  //打印主界面
    {
        printf("             ------------欢迎使用烟台航空客运订票系统------------\n");
        printf("                               *************\n");
        printf("                 ---------------1. 录入功能 ---------------\n");
        printf("                 ---------------2. 查询功能 ---------------\n");
        printf("                 ---------------3. 订票功能 ---------------\n");
        printf("                 ---------------4. 退票功能 ---------------\n");
        printf("                 ---------------5.   退出   ---------------\n");
        printf("                               *************\n");
        printf("\t请选择:");
        scanf("%d",&n);
        printf("\n");
        switch(n)
        {
        case 1:
            lurugongneng(L);//录入功能
            break;
        case 2:
            chaxungongneng(L);//查询功能
            break;
        case 3:
            dingpiaogongneng(L);//订票功能
            break;
        case 4:
            tuipiaogongneng(L);//退票功能
            break;
        default :
            exit(0);//退出
        }
    }
    while(n==1||n==2||n==3||n==4);
}

#include 
#include 
using namespace std;
#include 
#include 
#include 
#include 
#include 
#include 
#include "head.h"

/************************************
* 功能描述:从已有文件中录入航班信息
* 输入参数:无
* 输出参数:无
************************************/
void Read(Linklist *&L)
{
    Linklist *p,*r;
    r=L;
    ifstream file("航班信息.txt",ios::in);

    while(file)
    {
        LinkQuNode *q;
        p=(Linklist *)malloc(sizeof(Linklist));
        file>>p->hangbanhao>>p->feijihao>>p->feixingriqi>>p->chenkerenshu>>p->yupiao>>p->zhongdianzhan;
        if(!file) break;
        r->next=p;
        r=p;

        p->yiding=(Link *)malloc(sizeof(Link));
        p->yiding->next1=NULL;

        initqueue(q);
        p->yudingqueue1=q->front;
        p->yudingqueue2=q->rear;
    }
    r->next=NULL;
    file.close();
}
/************************************
* 功能描述:将手动录入的航班信息写到文件里
* 输入参数:无
* 输出参数:无
************************************/
void Write(Linklist *&L)
{
    Linklist *p;
    p=L->next;
    ofstream file("航班信息.txt",ios::out);
    while(p!=NULL)
    {
        file<hangbanhao<<"    "<feijihao<<"    "<feixingriqi<<"    "<chenkerenshu<<"    "<yupiao<<"    "<zhongdianzhan<<"\n";
        p=p->next;
    }
    file.close();
}
/************************************
* 功能描述:录入航班信息函数,分为文件录入,手动录入,并且录入后自动保存到文件
* 输入参数:航班号,飞机号,终点站,飞行日期,座位数,余票数
* 输出参数:无
************************************/
void lurugongneng(Linklist *&L)
{
    int n;
    printf("\t+++++++++++++++++++++++++++++\n");
    printf("\t==>1. 通过文件录入 ==\n");
    printf("\t==>2. 通过手动输入 ==\n");
    printf("\t+++++++++++++++++++++++++++++\n");
    printf("\t请选择:");
    scanf("%d",&n);
    printf("\n");
    switch(n)
    {
    case 1:
        Read(L);
        break;
    case 2:
        lurugongneng1(L);
        break;
    default :
        break;
    }
}
void lurugongneng1(Linklist *&L)//初始化的单链表*********************************************************录入功能
{
    Linklist *p,*r;
    LinkQuNode *q;
    p=(Linklist *)malloc(sizeof(Linklist));
    printf("\t请依次输入下面几项内容:\n\n");//这里的输入采用一个个单独输入,避免了乱赋值的现象
    printf("航班号\n");
    gets(p->hangbanhao);//这里的二个gets主要是因为在回车键的输入,其中的第一个是来接收上次的回车
    gets(p->hangbanhao);
    printf("飞机号\n");
    printf("终点站\n");
    gets(p->feijihao);
    gets(p->zhongdianzhan);
    printf("飞行日期\n");
    scanf("%d",&p->feixingriqi);
    printf("座位数\n");
    scanf("%d",&p->chenkerenshu);
    printf("余票数\n");
    scanf("%d",&p->yupiao);//录入内容

    p->yiding=(Link *)malloc(sizeof(Link));
    p->yiding->next1=NULL;

    initqueue(q);
    p->yudingqueue1=q->front;
    p->yudingqueue2=q->rear;

    if(L->next==NULL)
    {
        r=L;
        r->next=p;
        r=p;
    }
    else
    {
        r=L;
        while(r->next!=NULL)
        {
            r=r->next;
        }
        r->next=p;
        r=p;
    }
    r->next=NULL;//尾插法插入
    Write(L);

}

#include 
#include 
#include 
#include 
#include 
#include 
#include "head.h"

/************************************
* 功能描述:查询航班信息函数,分为终点站查询,航班号查询
* 输入参数:1或2
* 输出参数:无
************************************/
void chaxungongneng(Linklist *&L)//******************************************************************查询功能
{
    int n;
    printf("\t 查 找 航 线 信 息 \n");
    printf("\t+++++++++++++++++++++++++++++\n");
    printf("\t==>1. 通过目的地查询 ==\n");
    printf("\t==>2. 通过航班号查询 ==\n");
    printf("\t+++++++++++++++++++++++++++++\n");
    printf("\t请选择:");
    scanf("%d",&n);
    printf("\n");
    switch(n)
    {
    case 1:
        mddchaxun(L);
        break;
    case 2:
        hbhchaxun(L);
        break;
    default :
        break;
    }
}
/************************************
* 功能描述:查询航班信息函数,分为终点站查询,航班号查询
* 输入参数:终点站
* 输出参数:无
************************************/
void mddchaxun(Linklist *&L)//通过目的地查询
{
    char c[15];
    int m;
    Linklist *p=L;
    printf("\t请输入要查询的目的地:");
    gets(c);
    gets(c);//原因同上
    do
    {
        p=p->next;
        if(p)
        {
            m=strcmpi((*p).zhongdianzhan,c);//如果==的话则m=0;
            if(m==0)
            {
                printf("\t航班信息:\n");
                printf("\t航班号:%s\n",p->hangbanhao);
                printf("\t飞机号:%s\n",p->feijihao);
                printf("\t飞行时间:周%d\n",p->feixingriqi);
                printf("\t余票量:%d\n",p->yupiao);
            }
        }
        else
        {
            //如果不匹配的话就做
            printf("\t对不起没有你要找的目的地:\n\n");
            m=0;
        }
    }
    while(m!=0);
}


/************************************
* 功能描述:查询航班信息函数,分为终点站查询,航班号查询
* 输入参数:航班号
* 输出参数:无
************************************/
void hbhchaxun(Linklist *&L)//通过航班号查询
{
    char c[15];
    int m;
    Linklist *p=L;
    printf("\t请输入要查询的航班号:");
    gets(c);
    gets(c);
    printf("\n");
    do
    {
        p=p->next;
        if(p)
        {
            m=strcmpi((*p).hangbanhao,c);//如果==的话则m=0;这里的(*p).与p->的作用是一样的
            if(m==0)
            {
                printf("\t航班信息:\n");
                printf("\t航班号:%s\n",p->hangbanhao);
                printf("\t飞机号:%s\n",p->feijihao);
                printf("\t飞行时间:周%d\n",p->feixingriqi);
                printf("\t余票量:%d\n\n",p->yupiao);
            }
        }
        else
        {
            //如果不匹配的话就做
            printf("\t对不起没有你要找的航班号:\n");
            m=0;
        }
    }
    while(m!=0);
}

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "head.h"
#include "graph.h"
/************************************
* 功能描述:订票功能函数,先为乘客展示航班线路图和最优路径,再提供购票服务
 ,若余票不足,可以为客户预订,并将其排到链队中。
* 输入参数:无
* 输出参数:无
************************************/
void dingpiaogongneng(Linklist *&L)//订票功能
{
    MGraph g1;
    int A[5][5]=
    {
        {0,2,INF,1,4},
        {INF,0,3,INF,3},
        {INF,INF,0,INF,INF},
        {INF,INF,INF,0,INF},
        {INF,INF,INF,INF,0}

    };

    ArrayToMat(A[0], 5, g1);  //
    printf("这里是烟台航空,下面展示飞行路线图:\n");
    printf("0:烟台-----2h--------1:北京-------3h--------2:上海\n");
    printf("0:烟台-----2h--------1:北京-------3h--------4:广东\n");
    printf("0:烟台-----4h--------4:广东\n");
    printf("0:烟台-----1h--------3:南京\n");
    printf("输出抵达最快路径:\n");
    Dijkstra(g1,0);


    char c[15];
    int m=1,piao,n;
    gets(c);
    printf("请输入终点站名:");
    gets(c);
    printf("\n");
    Linklist *p;
    p=L->next;


    do     //查找一下,是否有这个航班
    {
        if(!p)
        {
            printf("对不起,没有你要找的航班:\n\n");
            return ;
        }
        m=strcmpi(p->zhongdianzhan,c);
        if(m==0)
        {
            printf("航班信息:\n");
            printf("航班号:%s\n",p->hangbanhao);
            printf("飞机号:%s\n",p->feijihao);
            printf("飞行时间:周%d\n",p->feixingriqi);
            printf("余票量:%d\n",p->yupiao);
        }
        else
            p=p->next;
    }
    while(m!=0);    //当m=0,即匹配到了航班,退出。





    if(m==0)//航班被找到
    {
        do
        {
            printf("\n请输入你要订的票数:");
            scanf("%d",&piao);
            if(piao<=p->yupiao)   //可以订票
            {

                Link *h,*s;//要插入节点和尾节点  ,航班的节点就是它的头结点
                h=(Link*)malloc(sizeof(Link));
                printf("请输入你的名字:");
                gets(h->name);
                gets(h->name);
                h->dingpiaoshu=piao;
                p->yupiao=p->yupiao-piao;
                printf("订票成功!!!\n");


                if(p->yiding->next1==NULL)//尾插法插入
                {
                    s=p->yiding;
                    s->next1=h;
                    s=h;

                }
                else
                {

                    s=p->yiding;
                    while(s->next1!=NULL)
                    {
                        s=s->next1;
                    }
                    s->next1=h;
                    s=h;

                }
                s->next1=NULL;
                m=2;

            }


            else
            {
                printf("余票量:%d\n",p->yupiao);
                printf("对不起,余票 %d 张不足,不能完成订票\n\n",p->yupiao);
                printf(" 是否要重新订票?\n");
                printf("需要请输入1 否则请按2 预订请输入3 : ");
                scanf("%d",&m);
                printf("\n");
            }

            if(m==2) return ;
        }
        while(m==1);    //此为do,while()循环,当m=1的时候,再订票一遍,m=2退出,m=3进入loop3;

    }



    if(p->yudingqueue1==NULL) printf("没有人预订票,是否要预订?\n");
    else if(p->yudingqueue1!=NULL) printf("已有人预订票,是否要预订?\n");
    printf("预订请输入1 否则输入2 : ");
    scanf("%d",&n);
    printf("\n");


    if(n==1)
    {
        Qptr *z;//创建新节点
        z=(Qptr *)malloc(sizeof(Qptr));

        printf("请输入你的姓名");
        gets(z->name);
        gets(z->name);
        printf("请输入订票数");
        scanf("%d",&z->yudingpiao);
        z->next2=NULL;

        if(p->yudingqueue1==NULL)//若队链为空
        {
            p->yudingqueue1=p->yudingqueue2=z;
        }

        else              //队链不为空
        {
            p->yudingqueue2->next2=z;
            p->yudingqueue2=z;
        }
        printf(" 你预订成功!!!\n");
    }

}





#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "head.h"
/************************************
* 功能描述:退票功能函数,完成信息匹配即可退票,并且自动将预定(链队)客户插入到已定客户节点中
* 输入参数:无
* 输出参数:无
************************************/
void tuipiaogongneng(Linklist *&L)//***************************************************************退票功能
{
    Linklist *p;
    Yidingkehu *h,*h2,*h3;
    char c[15],name1[15];
    int m=1,piao,n;//
    gets(c);
    printf("请输入航班号:");
    gets(c);
    p=L;

    do  //使用do while来查找是否有此航班
    {
        if(!p)           //如果到了表尾并且没有匹配
        {
            printf("\n对不起,没有你要找的航班:\n");
            return ;
        }
        m=strcmpi(p->hangbanhao,c);//如果匹配的话,m=0
        if(m==0)
        {
            printf("\t航班信息:\n");
            printf("航班号:%s\n",p->hangbanhao);
            printf("飞机号:%s\n",p->feijihao);
            printf("飞行时间:周%d\n",p->feixingriqi);
            printf("余票量:%d\n",p->yupiao);
        }
        else p=p->next;
    }
    while(m!=0);


    if(m==0)
    {
        //如果找到了,就来给他退票
        do
        {
            h=p->yiding;
            printf("请输入你的姓名:");
            gets(name1);//gets(name1);
            printf("请输入你订的票数:");
            scanf("%d",&piao);
            printf("\n");

            while((strcmpi(h->next1->name,name1)!=0&&h->next1->dingpiaoshu!=piao)&&h!=NULL)
            {
                h=h->next1;
            }
            if(strcmpi(h->next1->name,name1)==0&&h->next1->dingpiaoshu==piao)//如果名字和订的票数相等,则就给他取消订票
            {
                p->yupiao+=h->next1->dingpiaoshu;
                h2=h->next1;
                h->next1=h2->next1;
                free(h2);
                printf("你取消订票成功:\n\n");
            }
            else//如果没有找到,即系统中没有该人的信息,提示是否来重新查找
            {
                printf("对不起,该航班没有人订票或者是你没有订该航班的票\n");
                printf("是否要重新查找并取消订票?\n");
                printf("需要请输入1   否则请按2 ");
                scanf("%d",&m);
                printf("\n");
            }

            Qptr *q3;
            if(p->yudingqueue1==NULL)
            {
                printf("没有人预订票:\n");    //没人预订就返回
                return ;
            }


            if((p->yupiao)>=(p->yudingqueue1->yudingpiao))  //票数足够
            {
                h2=(Link*)malloc(sizeof(Link));//先将第一个预定的节点内容复制给h2
                strcpy(h2->name,p->yudingqueue1->name);
                h2->dingpiaoshu=p->yudingqueue1->yudingpiao;
                n=p->yupiao-p->yudingqueue1->yudingpiao;
                p->yupiao=n;
                //接下来把这个节点出队
                q3=p->yudingqueue1;//P3指向首节点原来指向的位置
                if(p->yudingqueue1==p->yudingqueue2)
                    p->yudingqueue1=p->yudingqueue2=NULL;
                else
                    p->yudingqueue1=p->yudingqueue1->next2;
                free(q3);//释放空间
                //printf("链队中删除成功\n");


                if(p->yiding->next1==NULL)
                {
                    h3=p->yiding;
                    h3->next1=h2;
                    h3=h2;

                }
                else
                {

                    h3=p->yiding;
                    while(h3->next1!=NULL)
                    {
                        h3=h3->next1;
                    }
                    h3->next1=h2;
                    h3=h2;

                }
                h2->next1=NULL;//尾插法插入
                printf("为预订的客户订票成功\n");
            }

            else printf("余票数不够,不能为预订客户订票!\n");

        }
        while(m==1);
    }

}

#include 
#include 
#include "graph.h"
#include 
#include 
using namespace std;
//功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
//      n - 矩阵的阶数
//      g - 要构造出来的邻接矩阵数据结构
void ArrayToMat(int *Arr, int n, MGraph &g)
{
    int i,j,count=0;  //count用于统计边数,即矩阵中非0元素个数
    g.n=n;
    for (i=0; i

#include 
#include 
#include 
#include "head.h"

/************************************
* 功能描述:初始化单链表
* 输入参数:无
* 输出参数:无
************************************/
void InitLinklist(Linklist *&L)//单链表的初始化,创建头指针
{
    L=(Linklist *)malloc(sizeof(Linklist));
    L->next=NULL;
}
/************************************
* 功能描述:初始化单链队
* 输入参数:无
* 输出参数:无
************************************/
void initqueue(LinkQuNode *&q)//初始化单链队
{
    q=(LinkQuNode *)malloc(sizeof(LinkQuNode));

    q->front=q->rear=NULL;
}
main函数:

#include 
using namespace std;
#include 
#include 
#include 
#include 
#include "head.h"
/***********************************
* 功能描述:主函数,初始化了航班信息的链表,调用菜单函数
* 输入参数:无
* 输出参数:无
************************************/
int main()
{
    Linklist *L;
    InitLinklist(L);
    menu(L);
    return 0;
}

程序运行截图:

1:初始界面

数据结构课程设计--飞机订票系统_第1张图片
2:录入航班信息

数据结构课程设计--飞机订票系统_第2张图片

数据结构课程设计--飞机订票系统_第3张图片

数据结构课程设计--飞机订票系统_第4张图片

3:查询功能

数据结构课程设计--飞机订票系统_第5张图片

数据结构课程设计--飞机订票系统_第6张图片

4:订票功能

数据结构课程设计--飞机订票系统_第7张图片

5:预定功能

数据结构课程设计--飞机订票系统_第8张图片

6:退票功能

数据结构课程设计--飞机订票系统_第9张图片

7:最短路径提示功能

数据结构课程设计--飞机订票系统_第10张图片

8:退出系统

数据结构课程设计--飞机订票系统_第11张图片

你可能感兴趣的:(数据结构课程设计--飞机订票系统)