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

航空客运订票系统
本次课程设计做的航空客运订票系统,主要用到了,线性表、链表、图的存储结构,本次课程设计仍然使用多文件组织工程,点击此处参考(编码工具:code::blocks 12.04)
工程文件视角图如下:
数据结构课程设计--航空客运订票系统_第1张图片
实现源代码如下:
1.mainFram.h
//*Copyright  (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :mainFram.h*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:定义界面实现的部分宏定义、要实现算法的函数的声明*
//*输入描述:无*
//*程序输出:无*
#ifndef MAINFRAM_H_INCLUDED
#define MAINFRAM_H_INCLUDED
#define flight_max 5//最大航班数
struct passanager //乘客信息结构体
{
    char name[10];//名字
    char id[20];//身份证号
    float money; //资产
    int ifstu;  //是否学生认证
    char airnum[10];  //航班号
    int sex;   //性别,男1女0
    char phone[15]; //预留手机号
};
typedef struct passanager pass;
 struct airplane//航班信息
{
    char num[10];  //航班号
    float price;   //票价
    float discount;  //折扣
    char start[10];  //起始地
    char arrive[10];  //目的地
    int count;    //余票数
    int min,sec;   //时间
};
typedef struct airplane air;
int setdiscount(air *a);    //设定折扣函数,只需要传递air指针即可,包含这些函数的模块只能对航班操作
void disairline(air *a);//显示航班信息,顺序结构,顾客用
bool stu_confrim(pass *p);   //学生认证函数,传递pass指针,只需对乘客操作
#endif // MAINFRAM_H_INCLUDED


 
2.mainFram.cpp
//*Copyright  (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :mainFrame.h*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:界面实现函数以及各模块功能的实现函数代码*
//*输入描述:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
//*程序输出:各模块实现功能*
#include "mainFram.h"
#include "linklist.h"
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include "graph.h"
using namespace std;
/***********************************************************
* 功能描述:主函数
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数:无
* 返回值  :无
* 其他说明:入口函数
************************************************************/
void mainFram(DLinkList *L,pass *p,air *a,ALGraph *&G)
{
    system("cls");//清屏
	system("color 9f");//改变界面颜色,管理颜色为红色背景,普通服务为蓝色背景
    cout<>n;
	switch(n)
	{
    case 1:
        mainFram_pa(L,p,a,G);//调用用户服务认证界面
        break;
    case 2:
        if(rootlog(L,p,a,G))  //由函数返回的布尔值继续进行
        {
            getch();
            mainFram_ma(L,p,a,G); //登录成功之后,进入管理主界面
        }
        else
        {
            cout<<"密码或用户名不对!登陆失败"<>pa1.id;
    i1=LocateElem(L,1,pa1);
    if(i1!=0)
    {
        cout<<"已确认身份合法,请输入您的姓名完成身份鉴定。"<>name1;
        int j=0;
        DLinkList *c=L;
        while (jnext;
        }
            strcpy(pa1.name,c->data.name);
        if(!strcmp(name1,pa1.name))
        {
            pass *wo;
            wo=&c->data;
            cout<<"鉴定成功,您的信息如下:"<>me;
	switch(me)
	{
    case 0:
        break;
    case 1:
        system("cls");
        if(!purtic(p,a))//根据返回的布尔值进行下列程序
        {
            cout<<"购买失败,给自己节省点时间吧,看看别的航班,请不要购买没有余票的航班!"<ifstu=1;
            cout<<"认证成功,您在购买机票的时候将享受半价优惠。\n";
            getch();
            mainFram_pa_su(L,p,a,G);
        }
        else
        {
            cout<<"您所在的大学不存在或者未与我方合作,认证失败!\n";
            getch();
            mainFram_pa_su(L,p,a,G);
        }
        break;

	}
}
/***********************************************************
* 功能描述:学生认证函数
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 认证界面
* 返回值  :认证结果
* 其他说明:使用文件输入流
************************************************************/
bool stu_confrim(pass *p)//学生认证函数
{
    ifstream infile;
    infile.open("G://大学.txt");  //此处文件保存学校信息,只有在文件中的学校才能获得认证资格
    if(!infile) cout<<"error"<>input;
    while(infile.getline(school,sizeof(school))) //以循环的方式
    {
        if(!strcasecmp(school,input))
            return true;
    }
    return false;
}

bool purtic(pass *p,air *a)//购票函数
{
    system("cls");
    int i;
    cout<num<<"  "<<(a+i-1)->start<<"-->"<<(a+i-1)->arrive<<"  票数剩余:"<<(a+i-1)->count<price<>i;
    if(i==0)
    {
        return true;
    }
    if((a+i-1)->count!=0)
    {
        float in;//purchase sucess
        if((strcmp(p->airnum,"无"))!=0)//判断该用户是否已经购买机票
        {
            cout<<"您已经买过票了,给别人个机会吧,有钱也不要任性啊!"<ifstu==1)//判断是否是在校学生
        {

            cout<<"您是在校学生,享有半价优惠。"<money-(a+i-1)->price*0.5;
            if(in<0)//确保不赊账
            {
                cout<<"大哥,没钱就别出来混了,快去充点钱吧,要不连家都回不去了。\n";
                return false;
            }
            in=p->money;
            cout<<"购买成功,账单明细:";
            p->money=p->money-(a+i-1)->price*0.5;
            strcpy(p->airnum,(a+i-1)->num);
            printf("\n您购票前账户余额:%0.2f\n您花费的金额为:%0.2f\n您当前余额为:%0.2f\n",in,(a+i-1)->price,p->money);
            cout<<"Press any key to continue..."<count--;
            getch();
            return true;
        }
            in=p->money-(a+i-1)->price;
            if(in<0)
            {
                cout<<"大哥,没钱就别出来混了,快去充点钱吧,要不连家都回不去了。\n";
                return false;
            }
            in=p->money;
            cout<<"购买成功,账单明细:";
            p->money=(p->money-(a+i-1)->price);
            strcpy(p->airnum,(a+i-1)->num);
            printf("\n您购票前账户余额:%0.2f\n您花费的金额为:%0.2f\n您当前余额为:%0.2f\n",in,(a+i-1)->price,p->money);
            cout<<"Press any key to continue..."<count--;
            getch();
            return true;

    }
    else
        return false;
}
/*g管理界面系统*/
/***********************************************************
* 功能描述:管理系统主界面
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 主界面
* 返回值  :无
* 其他说明:管理员入口函数
************************************************************/
void mainFram_ma(DLinkList *&L,pass *p,air *a,ALGraph *&G)//管理界面
{
    system("cls");//清屏
	system("color 4f");//改变界面颜色
    cout<>m;
    switch(m)
    {
    case 1:
        chapass(L,p,a,G); //更改用户信息
        break;
    case 2:
        float pr;
        pr=setdiscount(a);//设置折扣
        if(pr!=0)
        {
           cout<<"打折之后的票价为:"<num,(a+i)->price,(a+i)->discount,(a+i)->start,(a+i)->arrive,(a+i)->min,(a+i)->sec,(a+i)->count);
    }
    printf("\nPress any key to continue...");
}
/* 用户信息管理界面 */
/***********************************************************
* 功能描述:用户信息更改实现界面
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 选择功能
* 返回值  :无
* 其他说明:更改信息,实现增删改查
************************************************************/
void chapass(DLinkList *L,pass *p,air *a,ALGraph *&G)//更改顾客信息
{
    system("cls");//清屏
    cout<>m;
    switch(m)
    {
    case 1:
        system("cls");//清屏
        DispList(L);
        getch();
        chapass(L,p,a,G);
        break;
    case 2:
        system("cls");
        int i;
        cout<<"请输入您要插入的位置:"<>i;
        pass e;
        if(ListInsert(L,i,e))
            cout<<"信息添加成功,请按任意键返回。。。"<>mode;     //此处的mode变量为模式,将模式的值传递给LocateElem函数,进行相应的操作
        if(mode==1)
        {
            cout<<"请输入您要删除用户的身份证号:"<>e1.id;
            i1=LocateElem(L,mode,e1); //查找一个节点
            if(i1!=0)
            {
                if(ListDelete(L,i1,e1)) //删除一个节点
                {
                    cout<<"删除该用户信息成功!按任意键退回。。。"<>e1.phone;
            i1=LocateElem(L,mode,e1); //查找一个节点
            if(i1!=0)
            {

                if(ListDelete(L,i1,e1)) //删除一个节点
                {
                    cout<<"删除该用户信息成功!按任意键退回。。。"<>e3.id;
        i3=LocateElem(L,1,e3);
        if(i3!=0)
        {
            cout<<"查找成功,可以进行修改操作,请谨慎进行!"<>mode2;
        cout<>e2.id;
            i2=LocateElem(L,mode2,e2);
            if(i2!=0)
            {
                cout<<"查找成功!以下是身份证为"<>e2.phone;
            i2=LocateElem(L,mode2,e2);
            if(i2!=0)
            {
                cout<<"查找成功!以下是手机号为"<>hang;
    for(i=0;inum),hang))
        {
            cout<<"请输入您要设置的优惠:"<>dis;
            (a+i)->discount=dis;
            cout<<"设置成功。"<price=(a+i)->price*(a+i)->discount;
            getch();
            return (a+i)->price;
        }
    }
    cout<<"没有该航班。"<>me5;
    switch(me5)
    {
    case 0:
        break;
    case 1:
        chairline(a,L,G);
        getch();
        break;
    case 2:
        DispAdj(G);
        getch();
        break;
    default:
        cout<<"您的指令有误,请重新输入。"<>me4;
    switch(me4)
    {
    case 0:
        break;
    case 1:
        system("cls");
        if(chline(a,L,G))
            cout<<"修改成功!按任意键继续!"<>hangn;
        int i;
        ArcNode *p;  //创建节点
        for (i=0; in; i++)   //用循环进行遍历
        {
            p=G->adjlist[i].firstarc;
            while (p!=NULL)
            {
                if(!strcmp(G->adjlist[i].data.num,hangn))
                {
                    char nnum[10];
                    cout<<"请输入新的航班号:"<>nnum;
                    strcpy(G->adjlist[i].data.num,nnum);
                    strcpy(a[i].num,nnum);
                    cout<<"修改成功!";
                    return true;
                }
                p=p->nextarc;
            }
        }
        return false;
}
/*变更航班票数函数*/
/***********************************************************
* 功能描述:放票收票函数
* 输入参数:air型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 实现界面
* 返回值  :实现结果
* 其他说明:
************************************************************/
bool chticcount(air *a,struct DNode *L,ALGraph *&G)
{
    system("cls");
        cout<>hangn;
        int i;
        ArcNode *p;
        for (i=0; in; i++)
        {
            p=G->adjlist[i].firstarc;//给p初始值
            while (p!=NULL)
            {
                if(!strcmp(G->adjlist[i].data.num,hangn))
                {
                    int ncount;
                    cout<<"请选择模式:1.放票 2.收票"<adjlist[i].data.count<>sel;
                    if(sel==1)
                    {
                        cout<<"请输入放票数量:"<>sel;
                        ncount=G->adjlist[i].data.count+sel; //条件判断值
                        if(ncount>60)
                        {
                            cout<<"大哥,飞机不是货车,哪有那么多票啊!"<adjlist[i].data.count=ncount;//同步图结构的值与线性表中的一致!!!!重要
                        a[i].count=ncount;
                        cout<<"放票成功!"<>sel;
                        ncount=G->adjlist[i].data.count-sel;
                        if(ncount<0)
                        {
                            cout<<"大哥,票都收没了,别收了!"<adjlist[i].data.count=ncount;
                        a[i].count=ncount;
                        cout<<"收票成功!"<nextarc;
            }
        }
        return false;
}
/*管理员登录函数*/
/***********************************************************
* 功能描述:管理员登录
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 认证界面
* 返回值  :无
* 其他说明:管理员入口函数
************************************************************/
bool rootlog(struct DNode *L,pass *p,air *a,ALGraph *&G)
{
    system("cls");
    char username[10]="root";
    char password[10]="123456";
    char username1[10];
    char password1[10];
    cout<>username1;
    cout<>password1;
    if((!strcmp(username1,username))&& (!strcmp(password1,password)))  //匹配固定密码
    {
        cout<<"登录成功!"<

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

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

 
5.graph.h
//*Copyright  (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :graph.h*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:定义图数据结构的代码、宏定义、要实现算法的函数的声明*
//*输入描述:无*
//*程序输出:无*
#ifndef GRAPH_H_INCLUDED
#define GRAPH_H_INCLUDED
#define MAXV 5               //最大顶点个数
#define INF 32767       //INF表示∞
#include "mainFram.h"
#include "linklist.h"
//0烟1德2聊3菏
//0-1 0-2 1-3 2-3 3-0
typedef char InfoType;

//以下定义邻接矩阵类型
typedef struct
{
    int no;                     //顶点编号
    InfoType info[10];              //顶点其他信息,在此存放带权图权值
} VertexType;                   //顶点类型

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

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

typedef struct airplane Vertex;

typedef struct Vnode            //邻接表头结点的类型
{
    Vertex data;                //顶点信息
    int count;                  //存放顶点入度,只在拓扑排序中用
    ArcNode *firstarc;          //指向第一条弧
} VNode;

typedef VNode AdjList[MAXV];    //AdjList是邻接表类型

typedef struct
{
    AdjList adjlist;            //邻接表
    int n,e;                    //图中顶点数n和边数e
} ALGraph;                      //图的邻接表类型

//功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
//      n - 矩阵的阶数
//      g - 要构造出来的邻接矩阵数据结构
void ArrayToList(int *Arr, int n, ALGraph *&,air *&a); //用普通数组构造图的邻接表
void MatToList(MGraph g,ALGraph *&G);//将邻接矩阵g转换成邻接表G
void DispAdj(ALGraph *G);//输出邻接表G
/*航班信息管理函数声明*/
//此处函数传值为airline结构体类型指针,将存放航班信息的头指针传递过来,进而可以实现遍历操作,增删改查
//传值还有DNode型指针,由于使用别名会造成其他头文件无法识别,故此处用前向声明,解决此矛盾,此为顾客链表的头结点
//图结构ALGraph型指针,传递此参数便于对图结构存储的信息进行操作,要注意与airline的数据统一
void maairline(air *a,struct DNode *L,ALGraph *&G);//航班管理界面,界面函数无需返回值
void chairline(air *a,struct DNode *L,ALGraph *&G);//更改航班信息界面
bool chline(air *a,struct DNode *L,ALGraph *&G);//更改航班号实现,返回布尔值判断是否修改成功
bool chticcount(air *a,struct DNode *L,ALGraph *&G);//放票收票实现,返回布尔值判断是否修改成功
/*主界面函数声明*/
//此处函数传值多一个passanager型指针,将乘客的头结点传入可以,对乘客进行修改及其他操作
void mainFram(struct DNode *L,pass *p,air *a,ALGraph *&G);  //系统主界面
void mainFram_ma(struct DNode *&L,pass *p,air *a,ALGraph *&G);//管理员管理主界面
void chapass(struct DNode *L,pass *p,air *a,ALGraph *&G); //用户信息管理界面
void mainFram_pa(struct DNode *L,pass *p,air *a,ALGraph *&G);//顾客服务主界面认证
void mainFram_pa_su(struct DNode *L,pass *p,air *a,ALGraph *&G);//顾客服务主界面
bool rootlog(struct DNode *L,pass *p,air *a,ALGraph *&G);//管理员登录函数,此处声明为布尔型,返回登录成功与否的状态
bool purtic(pass *p,air *a); //购票实现,返回布尔型值判断是否购票成功
#endif // GRAPH_H_INCLUDED

 
6.graph.cpp
//*Copyright  (c)2017,烟台大学计算机与控制工程学院*
//*All rights reservrd.*
//*文件名称 :graph.cpp*
//*作者:田长航*
//*完成时间:2017年12月21日*
//*版本号:v1.0*
//*问题描述:定义栈数据结构的代码、宏定义、要实现算法的函数的声明*
//*输入描述:ALgraph型指针*
//*程序输出:各种实现*
#include 
#include 
#include "graph.h"
#include 
using namespace std;
//功能:由一个反映图中顶点邻接关系的二维数组,构造出用邻接矩阵存储的图
//参数:Arr - 数组名,由于形式参数为二维数组时必须给出每行的元素个数,在此将参数Arr声明为一维数组名(指向int的指针)
//      n - 矩阵的阶数
//      g - 要构造出来的邻接矩阵数据结构
/***********************************************************
* 功能描述:数组转邻接表
* 输入参数:air型指针,pass型指针,Dlinklist型指针,ALGRAPH型指针
* 输出参数: 认证界面
* 返回值  :无
* 其他说明:入口函数
************************************************************/
void ArrayToList(int *Arr, int n, ALGraph *&G, air *&a)
{
    int i,j,count=0;  //count用于统计边数,即矩阵中非0元素个数
    ArcNode *p;
    G=(ALGraph *)malloc(sizeof(ALGraph));
    G->n=n;
    for (i=0; iadjlist[i].firstarc=NULL;
    for (i=0; i=0; j--)
            if (Arr[i*n+j]!=0)      //存在一条边,将Arr看作n×n的二维数组,Arr[i*n+j]即是Arr[i][j]
            {
                p=(ArcNode *)malloc(sizeof(ArcNode));   //创建一个节点*p
                p->adjvex=j;
                p->info=Arr[i*n+j];
                p->nextarc=G->adjlist[i].firstarc;      //采用头插法插入*p
                G->adjlist[i].firstarc=p;
                G->adjlist[i].data=a[i];
            }

    G->e=count;
}
/***********************************************************
* 功能描述:
* 输入参数:Dlinklist 型引用指针
* 输出参数:Dlinklist 型指针引用
* 返回值  :无
* 其他说明:图算法库
************************************************************/
void DispAdj(ALGraph *G)
//输出邻接表G
{
    cout<n; i++)
    {
        p=G->adjlist[i].firstarc;
        printf("%5s: ",G->adjlist[i].data.start);//首先输出起始地点
        while (p!=NULL)
        {
            printf("-->终止地:%s/里程:%dkm/余票:%d/票价:%0.2f ",G->adjlist[i].data.arrive,p->info,G->adjlist[i].data.count,G->adjlist[i].data.price);//按格式输出
            p=p->nextarc;//实现循环
        }
        printf("\n");
    }
}

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

 

 
运行结果截图如下:
数据结构课程设计--航空客运订票系统_第2张图片 数据结构课程设计--航空客运订票系统_第3张图片 数据结构课程设计--航空客运订票系统_第4张图片数据结构课程设计--航空客运订票系统_第5张图片数据结构课程设计--航空客运订票系统_第6张图片数据结构课程设计--航空客运订票系统_第7张图片数据结构课程设计--航空客运订票系统_第8张图片数据结构课程设计--航空客运订票系统_第9张图片数据结构课程设计--航空客运订票系统_第10张图片 数据结构课程设计--航空客运订票系统_第11张图片 数据结构课程设计--航空客运订票系统_第12张图片数据结构课程设计--航空客运订票系统_第13张图片数据结构课程设计--航空客运订票系统_第14张图片数据结构课程设计--航空客运订票系统_第15张图片数据结构课程设计--航空客运订票系统_第16张图片数据结构课程设计--航空客运订票系统_第17张图片

你可能感兴趣的:(数据结构学习实践项目,c++,课程设计,数据结构)