#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<malloc.h>
#include<conio.h>          typedef struct flightnode         //定义飞机航班链表
{char flight_num[10];  char start_time[10];  char end_time[10];    char start_place[20]; char end_place[20];   float price;          float price_discount; int left;          int isFull;           struct flightnode *next;
}flightnode;typedef struct passengernode      //定义乘客链表
{char name[20];             char ID_num[20];           char flight_num[10];       int order_num;             int ticket_num;            struct passengernode *next;
}passengernode;               typedef struct passengerList      //乘客链表的头指针,尾指针
{passengernode *head;passengernode *rear;
}passengerList;void init_flight(flightnode *&h)  //初始化航班链表为空表 定义并引用h为头结点
{h = (flightnode *)malloc(sizeof(flightnode));            if(h==NULL) exit(0);          h->next = NULL;
}void init_passengerList(passengerList *&pList)                   //定义乘客链表为空链表
{pList = (passengerList *)malloc(sizeof(passengerList));pList->head = (passengernode *)malloc(sizeof(passengernode)); pList->rear = pList->head;                                           pList->rear->order_num = 0;                                       pList->head->next = NULL;
}void save_passenger(passengerList *PList)           //保存文件(以二进制形式保存 存到.dat文件中)   passenger.dat
{FILE* fp = fopen("passenger.dat","wb");if(fp == NULL)return;passengernode *temp = PList->head->next;        //temp指针指向链表的首节点while(temp!=NULL){fwrite(temp,sizeof(passengernode),1,fp);temp = temp->next;}fclose(fp);
}void load_passenger(passengerList *PList)           //把文件中的乘客信息导入到乘客链表中
{FILE* fp = fopen("passenger.dat","rb");if(fp == NULL)return;passengernode *q;int n;                                          //是否成功写入的标志量while(!feof(fp)){q = (passengernode *)malloc(sizeof(passengernode));n = fread(q,sizeof(passengernode),1,fp);if(n!=1)break;PList->rear->next=q;             //头插法PList->rear=q;}PList->rear->next = NULL;fclose(fp);
}void save_flight(flightnode *h)
{FILE* fp = fopen("flightList.dat","wb");if(fp == NULL)return;flightnode *temp = h->next;while(temp != NULL){fwrite(temp,sizeof(flightnode),1,fp);temp = temp->next;}fclose(fp);
}void load_flight(flightnode *&h)               //从文件中将信息导入到航班链表中
{flightnode *pt = h;FILE* fp = fopen("flightList.dat","rb");if(fp == NULL)return;flightnode *q;int n;while(!feof(fp)){q = (flightnode *)malloc(sizeof(flightnode));n = fread(q,sizeof(flightnode),1,fp);if(n!=1)break;pt->next = q;pt = q;}pt->next = NULL;fclose(fp);
}void insert_flight(flightnode *&h,char* flight_num,char* start_place,char* end_place,char *start_time,char* end_time,float price,float price_discount,int left,int isFull)
{flightnode *q;                                      //q指向新节点flightnode *p = h;                                  //p指向航班链表的头节点q = (flightnode *)malloc(sizeof(flightnode));strcpy(q->flight_num,flight_num);strcpy(q->start_place,start_place);strcpy(q->end_place,end_place);strcpy(q->start_time,start_time);strcpy(q->end_time,end_time);q->price = price;q->price_discount = price_discount;q->left = left;q->isFull = isFull;q->next = p->next;                                  //头插法p->next = q;                                    p = p->next;
}void insert_passengerList(flightnode *&h,passengerList *&PList,char *name,char *ID_num,char *flight_num,int ticket_num)
{flightnode *p = h->next;                         //p指向乘客链表的首节点for(; p!= NULL; p=p->next){if(strcmp(p->flight_num,flight_num) == 0){p->left = p->left - ticket_num;          //更新实时的剩余座位数if(p->left == 0){p->isFull = 1;}}}passengernode *q  = (passengernode *)malloc(sizeof(passengernode));   //新建q节点,存放新的客户信息strcpy(q->name, name); strcpy(q->ID_num, ID_num);strcpy(q->flight_num, flight_num);q->ticket_num = ticket_num;q->next = NULL;PList->rear->next = q;         //尾插法q->order_num = PList->rear->order_num+1;PList->rear = q;
}void add_flight(flightnode *&h)
{flightnode *p = h;char flight_num[10],start_time[10],end_time[10],start_place[20],end_place[20];int left,isFull,mark = 1;float price,price_discount;for(;p->next!=NULL;p=p->next){}     //p指针指向尾节点 尾插法while(mark == 1){printf("\t\t 请输入您需要增加的航班号: ");scanf("%s",flight_num);printf("\t\t 请输入出发地: ");scanf("%s",start_place);printf("\t\t 请输入目的地: ");scanf("%s",end_place);printf("\t\t 请输入出发时间: ");scanf("%s",start_time);printf("\t\t 请输入结束时间: ");scanf("%s",end_time);printf("\t\t 请输入航班价格: ");scanf("%f",&price);printf("\t\t 请输入是否有折扣信息(例:7折 输入0.7): ");scanf("%f",&price_discount);printf("\t\t 请输入剩余座位数: ");scanf("%d",&left);printf("\t\t 请输入是否满仓:(0表示没有满仓  1表示满仓) ");scanf("%d",&isFull);insert_flight(p,flight_num,start_place,end_place,start_time,end_time,price,price_discount,left,isFull);printf("\t\t 增加航班%s 成功!\n",flight_num);printf("\t\t 是否继续录入航班信息(1 表示继续录入;0 表示停止录入).\n");printf("\t\t 请输入: ");scanf("%d",&mark);}
}int flight_num_check(flightnode *h,char *flight_num)
{flightnode *p=h;              //p指针指向航班链表的首节点printf("%-8s%-12s%-12s%-10s%-10s%-8s%-8s%-8s%-10s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","折扣","空座数","是否满仓");    //提示输入信息格式for(;p!=NULL;p = p->next) {if(strcmp(p->flight_num,flight_num) == 0){printf("%-8s%-12s%-12s%-10s%-10s%-8.2f%-8.2f%-8d%-10d\n",p->flight_num, p->start_place, p->end_place, p->start_time,p->end_time, p->price, p->price_discount, p->left, p->isFull);  //找到航班号 进行输出return 1;}}printf("\t\t  抱歉,没有航班为%s 的航班信息!\n",flight_num);return 0;
}int place_check(flightnode *h,char *start_place,char *end_place)    //按照起始地点 结束地点查询
{flightnode *p = h;            //p指针 指向航班链表的首节点int mark = 0;printf("%-8s%-12s%-12s%-10s%-10s%-8s%-8s%-8s%-10s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","折扣","空座数","是否满仓");    //提示输入信息格式for(;p!=NULL;p = p->next){if(strcmp(p->start_place, start_place) == 0 && (strcmp(p->end_place, end_place) == 0)){printf("%-8s%-12s%-12s%-10s%-10s%-8.2f%-8.2f%-8d%-10d\n",p->flight_num, p->start_place, p->end_place, p->start_time,p->end_time, p->price, p->price_discount, p->left, p->isFull);    //相等 输出航班相关信息mark = 1;}}if(mark == 0){printf("\t\t 抱歉,没有从%s 到%s 的航班信息!\n",start_place,end_place);return 0;}return 1;
}void check_all_flight(flightnode *h)            //浏览所有航班
{flightnode *p = h;int mark = 0;printf("%-8s%-12s%-12s%-10s%-10s%-8s%-8s%-8s%-10s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","折扣","空座数","是否满仓");    //提示输入信息格式for(;p!=NULL; p=p->next){printf("%-8s%-12s%-12s%-10s%-10s%-8.2f%-8.2f%-8d%-10d\n",p->flight_num, p->start_place, p->end_place, p->start_time,p->end_time, p->price, p->price_discount, p->left, p->isFull);    //输出相关信息mark = 1;}if(mark == 0)printf("\t\t  航班信息为空!\n");
}void flight_check(flightnode *h)
{flightnode *p=h->next;                      //p指针指向航班链表的首节点char flight_num[10],start_place[20],end_place[20];char a; printf("\t\t 请选择航班查询方式:\n");printf("\t\t 1表示按航班号进行查询;\n");printf("\t\t 2表示按起飞到达城市进行查询;\n");printf("\t\t 3表示浏览全部航班信息.\n\t\t 请选择输入:");a = getch();printf("%c\n",a);if(a ==  '1') {printf("\t\t 请输入航班号:");scanf("%s",flight_num);flight_num_check(p,flight_num);}else if(a == '2'){printf("\t\t 请输入起飞城市:");scanf("%s",start_place);printf("\t\t 请输入抵达城市:");scanf("%s",end_place);place_check(p,start_place,end_place);}else if(a == '3'){check_all_flight(p);}elsereturn;
} int find_same_flight(flightnode *h,char *flight_num)  //如果没有你选择的航班满了的话 提示的可选择的其他航班
{flightnode *t = h->next,*p = h->next;            //t指针指向航班链表的首节点 p指针指向乘客链表的首节点int mark = 0;printf("%-8s%-12s%-12s%-10s%-10s%-8s%-8s%-8s%-10s\n","航班号","起飞城市","抵达城市","起飞时间","抵达时间","价格","折扣","空座数","是否满仓");        //提示输入信息格式while(t != NULL && strcmp(t->flight_num,flight_num)!=0) t=t->next;     //遍历到了最后一个节点 或者查找到第一个目标节点while(p != NULL){if((strcmp(t->start_place,p->start_place) == 0) && (strcmp(t->end_place,p->end_place) == 0) && (strcmp(t->flight_num,p->flight_num)!=0))   //出发点和目的地相同 并且和那个满的航班号还不相同{printf("%-8s%-12s%-12s%-10s%-10s%-8.2f%-8.2f%-8d%-10d\n",p->flight_num, p->start_place, p->end_place, p->start_time,p->end_time, p->price, p->price_discount, p->left, p->isFull);   //输出所有可选航班mark = 1;}p = p->next;}if(mark == 0)             //没有其他航班的时候该怎么做{printf("\t\t 抱歉, 没有可选航班!");return 0;}return 1;
}int book(flightnode *&h,passengerList *&PList)
{char name[20];char ID_num[20];char flight_num[10];char start_place[20];char end_place[20];int ticket_num;int k;                              //没票的时候 想不想买别的票的时候  标志量flightnode *p = h->next;            //p指向航班链表的首节点printf("\t\t 请输入信息:\n");printf("\t\t 请输入起飞城市:");scanf("%s",start_place);printf("\t\t 请输入抵达城市:");scanf("%s",end_place);if(place_check(h,start_place,end_place) == 1)          //place_check同时会输出所有符合用户需求的航班{printf("\t\t 航班号:");scanf("%s",flight_num);while(p != NULL){if(strcmp(p->flight_num,flight_num) == 0){printf("\t\t 姓名:");scanf("%s",name);printf("\t\t 证件号码:");scanf("%s",ID_num);printf("\t\t 订票数量:");scanf("%d",&ticket_num);if(p->left > 0 && p->left >= ticket_num)   //判断是否剩余充足的座位{insert_passengerList(h,PList,name,ID_num,flight_num,ticket_num);printf("\t\t 你应付金额¥%6.2f.\n",p->price * p->price_discount * ticket_num);getch();printf("\t\t 恭喜您,订票成功啦!\n");return 1;}else{printf("\t\t ***很遗憾,该航班已满:!***\n");printf("\t\t ***如您想要选择其他航班请输入---1\n\t\t *** 不选则输入---0***\n");printf("\t\t 请输入数字进行选择:");scanf("%d",&k);if(k==1){printf("\t\t 此航线上的其他航班有:\n");if(find_same_flight(h,flight_num) == 1)              //该航班已经没有了座位 开始查找下一个节点 此时进行传参flight_num{printf("\t\t 请输入您选的航班:");scanf("%s",flight_num);insert_passengerList(h, PList, name, ID_num, flight_num, ticket_num);    //选择成功进行插入操作printf("\t\t 恭喜你,订票成功!\n");return 1;}}return 0;}}elsep = p->next;}if(p==NULL)                            //遍历到了乘客链表的尾节点printf("\t\t 对不起,您输入的航班不存在!\n");}return 0;
}void delete_flight(flightnode *&h, passengerList *&PList)
{flightnode *p,*pr;    //p指向航班链表的首节点 pr指向航班链表的头结点 定义的p即为需要删除的节点 下同passengernode *q,*qr;char flight_num[10];int mark = 1;qr = PList->head;q = qr->next;pr = h;p = pr->next;printf("\t\t 请输入您要删除的航班号:");scanf("%s",flight_num);while(p != NULL){if(strcmp(flight_num, p->flight_num) == 0){pr->next = p->next;   //需要删除的节点 的前一个节点直接指向 需要删除节点的后一个节点free(p);printf("\t\t 删除%s 航班成功!\n",flight_num);mark = 0;p = NULL;}if(pr->next != NULL){pr = pr->next;p = pr->next;}}if(mark == 1)printf("\t\t 无此航班,无法删除!\n");else                         //删除顾客链表中的信息  删除了航班信息同时还需要删除{while(q != NULL){if(strcmp(flight_num, q->flight_num) == 0){qr->next = q->next;     //要删除的乘客节点的前一个节点 直接指向要删除节点的后一个节点 进行删除操作free(q);q = NULL;}if(qr->next != NULL){qr = qr->next;q = qr->next;}}}
}int delete_passenger(passengerList *&PList, flightnode *&h, char *name,char *ID_num)      //退票  删除顾客信息
{passengernode *p, *pr = PList->head;     //p指向乘客链表的首节点 pr相当于乘客链表的头指针p = pr->next;while(p!=NULL){if((strcmp(name, p->name)==0) && strcmp(ID_num,p->ID_num)==0){for(flightnode *f=h->next; f!=NULL; f=f->next){if(strcmp(p->flight_num,f->flight_num) == 0){ f->left = f->left + p->ticket_num;f->isFull = 0;break;}}pr->next = p->next;              //链表中删除顾客节点free(p);printf("\t\t 乘客%s,%s 退票成功!\n",name,ID_num);return 1;}pr = pr->next;p = pr->next;}printf("\t\t 无此顾客,无法退票!\n");return 0;
}int check_passenger(passengerList *&PList, char *name, char *ID_num)
{passengernode *p, *pr = PList->head;         //p指针指向乘客链表的首节点 pr相当乘客链表的头指针p = pr->next;while(p != NULL){if((strcmp(name, p->name)==0) && strcmp(ID_num,p->ID_num)==0){printf("\n\t\t %s您已成功购买过票,您购买的航班号为:%s,您的订单号为:%d",p->name, p->flight_num, p->order_num);return 0;}else{pr = pr->next;p = pr->next;}}printf("\n\t\t %s您没有购票记录,谢谢您的查询", name);return 0;
}void cancel(passengerList *&PList,flightnode *&h)
{char name[20],ID_num[20];printf("\t\t 请输入您的姓名:");scanf("%s",name);printf("\t\t 请输入您的证件号:");scanf("%s",ID_num);delete_passenger(PList, h, name, ID_num);
}void passenger_check(passengerList *&PList)
{char name[20],ID_num[20];printf("\t\t 请输入您的名字:");scanf("%s",name);printf("\t\t 请输入您的证件号:");scanf("%s",ID_num);check_passenger(PList, name, ID_num);
}void modify_flight(flightnode *&h,passengerList *&PList)
{flightnode *p=h->next;                                    //p指针航班链表的首节点char flight_num[10],start_time[10],end_time[10];char a;printf("\t\t********航班信息修改*******************\n");printf("\t\t***************************************\n");printf("\t\t*         增加航班------1             *\n");printf("\t\t*         删除航班------2             *\n");printf("\t\t*         修改航班时间---3            *\n");printf("\t\t****************************************");printf("\t\t 请选择:");a = getch();printf("%c\n",a);if(a == '1')add_flight(h);else if(a == '2')delete_flight(h,PList);else if(a == '3'){printf("\t\t 请输入要修改的航班的航班号:");scanf("%s",flight_num);if(flight_num_check(p, flight_num) == 1){printf("\t\t 请输入修改后的起飞时间:");scanf("%s",start_time);printf("\t\t 请输入修改后的抵达时间:");scanf("%s",end_time);for(; p!=NULL; p=p->next){if(strcmp(flight_num, p->flight_num) == 0){strcpy(p->start_time, start_time);strcpy(p->end_time, end_time);printf("\t\t 航班%s 时间修改成功!\n",flight_num);}}}}elsereturn;
}int main()
{int t = 1;char choice;flightnode *flight;    //定义航班链表的结构体指针passengerList *PList;init_flight(flight);init_passengerList(PList);load_flight(flight);load_passenger(PList);while(t==1){printf("\n"); printf("\t\t\t***************飞机订票系统菜单***********************\n"); printf("\t\t\t******************************************************\n"); printf("\t\t\t*                录入航班信息----------1             *\n"); printf("\t\t\t*                查询航班信息----------2             *\n"); printf("\t\t\t*                订购    机票----------3             *\n"); printf("\t\t\t*                退订    机票----------4             *\n"); printf("\t\t\t*                查询订票信息----------5             *\n");printf("\t\t\t*                修改航班信息----------6             *\n"); printf("\t\t\t*                退出    系统----------0             *\n"); printf("\t\t\t******************************************************\n"); printf("\t\t\t 请选择服务:"); choice = getch();printf("%c\n",choice);system("cls");if(choice == '1'){add_flight(flight);getch();system("cls");}else if(choice == '2'){flight_check(flight);getch();system("cls");}else if(choice == '3'){book(flight,PList);getch();system("cls");}else if(choice == '4'){cancel(PList,flight);getch();system("cls"); }else if(choice == '5'){passenger_check(PList);getch();system("cls");}else if(choice == '6'){modify_flight(flight,PList);getch();system("cls");}else if(choice == '0'){printf("\t\t\t 欢迎您使用本系统  再见");t = 0; }}save_flight(flight);save_passenger(PList);return 0;
}

【c语言】航班订票系统相关推荐

  1. C语言—航班订票系统

       航空订票系统 第一章  绪    论 任务:通过此系统可以实现如下功能: 1).录入: 可以录入航班情况(数据可以存储在一个数据文件中,数据结构.具体数据自定) 2).查询: 可以查询某个航线的 ...

  2. 数据结构课设航班订票系统(C语言版)

    数据结构课设航班订票系统(C语言版) 课设要求 (1) 航班管理.每条航线设计出合理的信息,包括:起点和终点站名,航班号,成员额定,飞行周期.飞机型号.余票量.航班票价等 (2) 客户管理.订票的客户 ...

  3. c语言航班订票管理系统源代码,简易C语言航空订票系统

    代码片段和文件信息 属性            大小     日期    时间   名称 ----------- ---------  ---------- -----  ---- 目录        ...

  4. c语言飞机订票信息查询,C语言飞机订票系统

    <C语言飞机订票系统>由会员分享,可在线阅读,更多相关<C语言飞机订票系统(11页珍藏版)>请在人人文库网上搜索. 1.课程设计课程:数据结构专业班级:XX软件工程XX班姓名: ...

  5. JAVA在线航班订票系统计算机毕业设计Mybatis+系统+数据库+调试部署

    JAVA在线航班订票系统计算机毕业设计Mybatis+系统+数据库+调试部署 JAVA在线航班订票系统计算机毕业设计Mybatis+系统+数据库+调试部署 本源码技术栈: 项目架构:B/S架构 开发语 ...

  6. C语言-飞机航班订票系统

    #include<stdio.h> #include<stdlib.h> #include<string.h> static int airnum=0;//静态变量 ...

  7. c语言航空订票系统流程图,飞机订票系统(C语言代码及流程图).doc

    FILENAME 飞机订票系统流程图 PAGE 19 第 PAGE 19 页 共 NUMPAGES 25 页 DATE \@ "yyyy-M-d" 2010-12-22 目录 目录 ...

  8. C语言飞机订票系统(数组版)

    (1)建立航班信息和乘客信息,每次航班的信息包括:航班号.起飞城市.到达城市.起飞时间.到达时间.机票价格.机票折扣.机票剩余数量: 每位乘客的信息包括:姓名.身份证号.性别.购买机票数.乘坐航班航班 ...

  9. c语言航空订票系统程序设计,航空订票系统C语言版.doc

    #include #include #include #include #define ok 1 #define error 0 #define overflow -2 int select2(); ...

最新文章

  1. python【蓝桥杯vip练习题库】BASIC-5查找整数
  2. Java静态变量与静态方法与成员变量成员方法的区别
  3. ECC椭圆曲线算法(2)初步介绍
  4. 2016.9.24 の 測試
  5. python学习之路(九)
  6. ffmpeg avformat_open_input返回失败的解决办法
  7. Centos 上的chrome 如何启用Java
  8. 2021沭阳中学高考成绩查询,沭阳建陵中学2020高考喜报!
  9. CakePHP你必须知道的21条技巧
  10. [河南省ACM省赛-第三届] AMAZING AUCTION (nyoj 251)
  11. maven缺失ojdbc6解决方案 :Missing artifact com.oracle:ojdbc6:jar:11.2.0.1.0问题解决 ojdbc包pom.xml出错
  12. Java逐帧动画播放器V0.1.0
  13. 彻底解决--“未能加载文件或程序集“xxx.dll”或它的某一个依赖项”
  14. 2021租房合同样板
  15. T40之小黑不能充电记
  16. Inferring Motion Direction using Commodity Wi-Fi for Interactive Exergames (WiDrancd)论文翻译
  17. 计算机网络(五):IPv6
  18. 【疯壳·无人机开发教程1】开源编队无人机-开机测试
  19. lisp绘制棱锥_椭圆轴棱锥,elliptical axicon,音标,读音,翻译,英文例句,英语词典
  20. LeCun论文被指「洗稿」? LSTM之父发文怒怼:抄我的还标原创

热门文章

  1. 多肽介导PEG磷脂——靶向功能材料之DSPE-PEG-RGD/TAT/NGR/APRPG
  2. ALevel数学P1重难点三角函数(Trigonometry)
  3. 77句唯美爱情语录,很多人已经不相信爱情了,你也是吗?
  4. 计算机专业考cisa,考CISA证书都有什么条件?(比如:学历?流程?)
  5. mix2s android p功能,小米MIX2S升级Android P教程 小米mix2s安卓9.0下载地址
  6. 择时方法综述【广发金融工程研究】
  7. Python_介绍_环境搭建_第一个程序_基本语法结构(1)
  8. linux图形化文本对比工具
  9. libgrape-lite: 提供 GraphScope 的图分析能力
  10. linux下微信不能同步,Linux下微信安装