数据结构客运航空系统设计(链表)

现在人们更多地使用飞机作为交通出行工具,因此机票票务市场也在快速发展。国内外航空事业在飞速发展,各航空公司对票务管理的要求也在不断提高,对航空信息管理系统提出了更高的要求。

本系统主要采用链表存储航班信息。其中,航班链表的数据域有包括航班号航班起点及目的地(因为是长沙航空,所以起点都为长沙)航班出发时间及到达时间、航班票价及余票、航班限额人数还有包括已购票乘客链表的头结点及候补乘客链表的头结点。乘客链表除了头结点外的每个结点代表一位乘客的信息,包括姓名、身份证号、电话号码及航班号。此外,本系统还设置了两个全局变量航班链表的头结点L和航班总数n。

 

客运航空系统设计如下:

 


#include 
#include 
#include 
#include 
using namespace std;
#define MAX1 20
#define MAX2 30
typedef struct passenger        //定义客户信息的结构体
{
    char name[MAX1];            //乘客名字
    char id[20];                //乘客身份证号
    char tel[15];               //乘客手机号
    int airnum;                 //乘客航班号
    struct passenger *next;     //指向下一节点
}pass,*Pas;
typedef struct airplane         //定义航班信息的结构体
{
    int airnum;                 //飞机航班号
    char start[MAX2];           //飞机起始地
    char arrive[MAX2];          //飞机目的地
    int price;                  //飞机票价
    int limitpeople;            //飞机限额人数
    int remain;                 //飞机余票数
    char begintime[50];         //飞机起飞时间
    char endtime[50];           //飞机到达时间
    Pas clients;                //乘客名单链表
    Pas waitclient;             //候补乘客名单链表
    struct airplane *next;      //指向下一节点
}air,*Linklist;

void Login(Linklist &L,int n);              //选择以乘客或管理员登录的界面
void Client(Linklist &L,int n);             //乘客登录界面函数
void Handler(Linklist &L,int n);            //管理员登录界面函数
void Inputmassage(Linklist &L,int n);       //录入航班信息函数
void Altermessage(Linklist &L,int n);       //修改航班信息函数
void Booking(Linklist &L,int n);            //订票函数
void Canceling(Linklist &L,int n);          //退票函数
void Print(Linklist L,int n);               //打印航班信息函数
void Search(Linklist L);                    //查询航班信息函数



int main()
{
    //用头插法建立航班链表
    Linklist L = (Linklist) malloc (sizeof(air)); //航班链表的头结点
    int n;       //总航班数
    printf("****************************************************录入航班信息*******************************************************\n\n");
    printf("输入航班总数:\n");
    scanf("%d",&n);
    Inputmassage(L,n);
    Print(L,n);       //将输入的航班信息打印出来
    Login(L,n);
    return 0;
}



//登录界面
void Login(Linklist &L,int n)
{
    int a;
    int password;
    printf("**************************************************欢迎登录长沙航空******************************************************\n\n");
    printf("                                                   1.乘客登录\n");
    printf("                                                   2.管理员登录\n");
    printf("                                                   请输入用户身份:");
    scanf("%d",&a);
    switch(a)
    {
        case 1:
            printf("\n");
            printf("                                                    登录成功!\n");
            printf("\n");
            Client(L,n);
        break;
        case 2:
            printf("                                                请输入密码:(提示:666)");
            scanf("%d",&password);
            if(password==666)
            {
                printf("\n");
                printf("                                                    登录成功!\n");
                printf("\n");
                Handler(L,n);
            }
            else
            {
                printf("密码错误!请重新输入\n");
                Login(L,n);
            }
        break;
        default:
            printf("输入无效!请重新输入\n");
            Login(L,n);
        break;
    }
}


//用户界面
void Client(Linklist &L,int n)
{
    int b;
    printf("****************************************************用户功能菜单*******************************************************\n\n");
    printf("                                                   1.查询航班\n");
    printf("                                                   2.订票\n");
    printf("                                                   3.退票\n");
    printf("                                                   4.打印所有航班信息\n");
    printf("                                                   5.退出登录\n");
    printf("                                                  请选择需要进行的操作:");
    scanf("%d",&b);
    switch(b)
    {
        case 1:
            printf("\n");
            printf("****************************************************查询航班************************************************************\n\n");
            Search(L);
            Client(L,n);
        break;
        case 2:
            printf("\n");
            printf("*******************************************************订票*************************************************************\n\n");
            Booking(L,n);
            Client(L,n);
        break;
        case 3:
            printf("\n");
            printf("*******************************************************退票************************************************************\n\n");
            Canceling(L,n);
            Client(L,n);
        break;
        case 4:
            printf("\n");
            printf("*************************************************打印所有航班信息*******************************************************\n\n");
            Print(L,n);
            Client(L,n);
        break;
        case 5:
            printf("\n");
            printf("                                                   欢迎下次使用!\n");
            printf("\n");
            Login(L,n);
        break;
        default:
            printf("输入无效!请重新输入\n");
            Client(L,n);
        break;
    }
}



//管理员界面
void Handler(Linklist &L,int n)
{
    int c;
    int Airnum;
    Linklist p=L->next;
    printf("**************************************************管理员功能菜单********************************************************\n\n");
    printf("                                                 1.录入航班信息\n");
    printf("                                                 2.修改航班信息\n");
    printf("                                                 3.查看乘客名单\n");
    printf("                                                 4.打印所有航班信息\n");
    printf("                                                 5.退出登录\n");
    printf("                                                请选择需要进行的操作:");
    scanf("%d",&c);
    switch(c)
    {
        case 1:
            printf("*************************************************录入航班信息*******************************************************\n\n");
            Inputmassage(L,n);
            Print(L,n);
            Handler(L,n);
        break;
        case 2:
            printf("**************************************************修改航班信息*******************************************************\n\n");
            Altermessage(L,n);
            printf("\n");
            printf("修改后航班信息如下:\n");
            Print(L,n);
            Handler(L,n);
        break;
        case 3:
            printf("***************************************************查看乘客名单*******************************************************\n\n");
            printf("输入航班号:");
            scanf("%d",&Airnum);
            while(p->airnum!=Airnum)
            {
                p=p->next;
            }
            if(p)
            {
                Pas m=p->clients->next;       //输出该航班的乘客名单
                printf("已成功购票乘客名单如下:\n");
                while(m)
                {
                    printf("乘客姓名:%s\t",m->name);
                    printf("乘客身份证号:%s\t",m->id);
                    printf("乘客电话号码:%s\n",m->tel);
                    m=m->next;
                }
                printf("\n\n");
                Pas v=p->waitclient->next;       //输出该航班的候补乘客名单
                printf("候补乘客名单如下:\n");
                while(v)
                {
                    printf("乘客姓名:%s\t",v->name);
                    printf("乘客身份证号:%s\t",v->id);
                    printf("乘客电话号码:%s\n",v->tel);
                    v=v->next;
                }
            }
            else
                printf("航班号输入有误,找不到该航班!\n");
            Handler(L,n);
        break;
        case 4:
            printf("***********************************************打印所有航班信息*****************************************************\n\n");
            Print(L,n);
            Handler(L,n);
        break;
        case 5:
            printf("*****************************************************退出登录**********************************************************\n\n");
            printf("                                                    欢迎下次使用!\n");
            printf("\n");
            Login(L,n);
        break;
        default:
            printf("输入无效!请重新输入\n");
            Handler(L,n);
        break;
    }
}



//录入航班信息
void Inputmassage(Linklist &L,int n)
{
    L->next=NULL;
    for(int i=0;inext=L->next;
        printf("输入飞机航班号:\n");
        scanf("%d",&p->airnum);
        printf("输入飞机起始地:\n");
        scanf("%s",p->start);
        printf("输入飞机目的地:\n");
        scanf("%s",p->arrive);
        printf("输入飞机起飞时间:\n");
        scanf("%s",p->begintime);
        printf("输入飞机到达时间:\n");
        scanf("%s",p->endtime);
        printf("输入飞机限额人数:\n");
        scanf("%d",&p->limitpeople);
        printf("输入飞机票价:\n");
        scanf("%d",&p->price);
        printf("输入飞机余票数:\n");
        scanf("%d",&p->remain);
        p->clients=(Pas) malloc(sizeof(pass));
        p->waitclient=(Pas) malloc(sizeof(pass));
        p->clients->next=NULL;
        p->waitclient->next=NULL;
        L->next=p;
    }
    printf("\n\n");
}



//查询航班信息
void Search(Linklist L)  //输入航班抵达终点
{
    Linklist p = (Linklist) malloc (sizeof(air));
    p=L->next;
    char Arrive[20];
    int flag=0;
    printf("输入旅途终点:\n");
    scanf("%s",Arrive);
    while(p)
    {
        if(!strcmp(Arrive,p->arrive))
        {
            printf("飞机航班号:%d\n",p->airnum);
            printf("飞机起始地:%s\t\t",p->start);
            printf("飞机目的地:%s\t\t",p->arrive);
            printf("飞机起飞时间:%s\t\t",p->begintime);
            printf("飞机到达时间:%s\n",p->endtime);
            printf("飞机限额人数:%d\t",p->limitpeople);
            printf("飞机票价:%d\t\t",p->price);
            printf("飞机余票数:%d\n",p->remain);
            flag=1;
            printf("\n\n");
        }
        p=p->next;
    }
    if(!flag)
    {
        printf("本航空公司没有到%s的航班!\n",Arrive);
    }
}




//修改航班信息
void Altermessage(Linklist &L,int n)
{
    int d;
    int Airnum;
    Linklist p=L->next;
    printf("输入要修改的航班号:");
    scanf("%d",&Airnum);
    printf("修改项目:\n");
    printf("1.修改航班起飞时间及到达时间\n");
    printf("2.修改航班票价\n");
    while(p->airnum!=Airnum&&p)
    {
        p=p->next;
    }
    if(p)
    {
        printf("输入要修改的项目序号:\n");
        scanf("%d",&d);
        switch(d)
        {
            case 1:
                printf("输入调整后起飞的时间:\n");
                scanf("%s",p->begintime);
                printf("输入调整后到达的时间:\n");
                scanf("%s",p->endtime);             //在该航班的信息中修改时间
                printf("修改成功!\n");
            break;
            case 2:
                printf("输入调整后的票价:\n");
                scanf("%d",&p->price);            //在该航班的信息中修改票价
                printf("修改成功!\n");
            break;
            default:
                printf("输入无效!请重新输入\n");
                Altermessage(L,n);
            break;
        }

    }
}



//订票系统
void Booking(Linklist &L,int n)
{
    Linklist p=L->next;
    Pas f=(Pas)malloc(sizeof(pass));
    char Arrive[50];
    printf("输入终点站:\n");
    scanf("%s",Arrive);
    while(strcmp(p->arrive,Arrive)!=0)
    {
        p=p->next;
    }
    if(p)      //找到该航班
    {
        printf("飞机航班号:%d\n",p->airnum);
        printf("飞机起始地:%s\t\t",p->start);
        printf("飞机目的地:%s\t\t",p->arrive);
        printf("飞机起飞时间:%s\t\t",p->begintime);
        printf("飞机到达时间:%s\n",p->endtime);
        printf("飞机限额人数:%d\t",p->limitpeople);
        printf("飞机票价:%d\t",p->price);
        printf("飞机余票数:%d\n",p->remain);
        if(p->remain>0)     //有余票
        {
            //将该客户加入乘客名单中
            Pas q=p->clients;
            while(q->next)
            {
                q=q->next;
            }
            Pas q1=(Pas)malloc(sizeof(pass));
            printf("请输入你的姓名:\n");
            scanf("%s",q1->name);
            printf("请输入你的身份证号:\n");
            scanf("%s",q1->id);
            while(strlen(q1->id)!=18)
            {
                 printf("输入有误!请重新输入(提示:正确输入应为18位\n");
                 scanf("%s",q1->id);
            }
            printf("请输入你的电话号码:\n");
            scanf("%s",q1->tel);
            q1->airnum=p->airnum;
            q->next=q1;
            q1->next=NULL;
            q=q1;
            p->remain--;
            printf("购票成功!\n");
        }
       else
       {
            int x;
            f=p->waitclient;
            printf("票已售空,是否愿意加入候补名单?1.是 2.否\n");
            printf("请输入你的选择(1 or 2):");
            scanf("%d",&x);
            Pas f1=(Pas)malloc(sizeof(pass));
            switch(x)
            {
                case 1:
                //将乘客加入候补名单
                    while(f->next)
                    {
                        f=f->next;
                    }
                    printf("请输入你的姓名:\n");
                    scanf("%s",f1->name);
                    printf("请输入你的身份证号:\n");
                    scanf("%s",f1->id);
                    while(strlen(f1->id)!=18)
                    {
                        printf("输入有误!请重新输入(提示:正确输入应为18位\n");
                        scanf("%s",f1->id);
                    }
                    printf("请输入你的电话号码:\n");
                    scanf("%s",f1->tel);
                    f1->airnum=p->airnum;
                    f->next=f1;
                    f1->next=NULL;
                    f=f1;
                    printf("已加入候补名单,有票会及时通知你!\n");
                break;
                case 2:
                    printf("已取消加入候补名单!\n");
                break;
                default:
                    printf("输入无效!请重新输入\n");
                break;
            }
       }
    }
    else
    {
        printf("输入有误!找不到该航班信息\n");
    }
}



//退票系统
void Canceling(Linklist &L,int n)
{
    Linklist p=L->next;
    char name[20];
    int Airnum;
    printf("请输入你的名字:\n");
    scanf("%s",name);
    printf("输入要取消的航班号:\n");
    scanf("%d",&Airnum);
    while(p->airnum!=Airnum&&p)
    {
        p=p->next;
    }
    if(p)
    {
        Pas y=p->clients;
        while(strcmp(y->next->name,name))
        {
            y=y->next;
        }
        Pas k=y->next;
        y->next=k->next;
        free(k);
        printf("取消航班成功!\n");
        if(p->remain>0)
        {
            p->remain++;
        }
        else
        {
            Pas g=p->waitclient->next;
            p->waitclient->next=g->next;
            Pas s=p->clients;
            while(s->next)
            {
                s=s->next;
            }
            s->next=g;
            g->next=NULL;
            s=g;
        }
    }
    else
    {
        printf("输入有误,没有此航班!\n");
    }
}



//打印所有航班信息
void Print(Linklist L,int n)
{
    for(int i=0;inext;
       printf("航班号:%d\n",p->airnum);
       printf("起始点:%s\t\t",p->start);
       printf("目的地:%s\t\t",p->arrive);
       printf("起飞时间:%s\n",p->begintime);
       printf("到达时间:%s\t",p->endtime);
       printf("限额人数:%d\t\t",p->limitpeople);
       printf("票价:%d\t",p->price);
       printf("余票:%d\n",p->remain);
       printf("\n\n");
       L=p;
    }
}


 

航班链表的建立

数据结构客运航空系统设计(链表)_第1张图片

乘客管理员登录界面

乘客登录界面

数据结构客运航空系统设计(链表)_第2张图片

管理员登录界面

数据结构客运航空系统设计(链表)_第3张图片

该系统分乘客登录和管理员登录两种能实现录入航班信息,查询航班信息,购票候补,退票,修改航班信息,打印航班信息,查看乘客名单等功能,管理员登录需要密码,对有些输入如身份证号能进行合法检查。但还是有很多缺陷,开始要录入航班信息才能使用系统,对乘客身份信息不能核实,管理员不能随意增加或取消一个航班等等。

你可能感兴趣的:(Data,Structure)