数据结构_航空客运订票系统(C实现)

数据结构_航空客运订票系统(C实现)
⽂章⽬录
总述
在这⾥插⼊代码⽚
1.问题描述:(题⽬复述)
题⽬复述如下:使⽤缩进使要求直观.
(⼀)试设计⼀个航空客运定票系统。基本要求如下:
1.设计数据结构
a)每条航线所涉及的信息有:
i.终点站名、
ii.航班号、
iii.飞机号、
iv.飞机周⽇(星期⼏)、
v.乘员定额、
vi.余票量、
b)订定票的客户名单(包括
i.姓名、
ii.订票量、(显然取决于客户的需求)
iii.舱位等级1,2或3)
c)等候替补的客户名单(包括
iv.姓名、
v.所需数量)。
2.数据结构的基础上设计算法,使系统能实现的操作和功能如下:
1)查询航线:根据客户提出的终点站名输出如下信息:
i.航班号、
ii.飞机号、
鱼塘全自动增氧控制器
iii.星期⼏飞⾏,
iv.最近⼀天航班的⽇期和
v.余票额;
2)承办订票业务:根据客户提出的要求(航班号、订票数额)查询该航班票额情况,
i.若有余票,则为客户办理订票⼿续,输出座位号;
ii.若已满员或余票少余订票额,则需重新询问客户要求。
a)若需要,可登记排队候补;
3)承办退票业务:根据客户提出的情况(⽇期、航班号),为客户办理退票⼿续,
i.然后查询该航班是否有⼈排队候补,⾸先询问排在第⼀的客户,若所退票额能满⾜他的要求,则为他办理订票⼿续,
ii.否则依次询问其它排队候补的客户。
2.设计:
(1)数据结构设计和核⼼算法设计描述;
主要描述程序采⽤的逻辑结构(线性表、队列、堆栈、树、图)和存储结构(顺序存储和链式存储),以及核⼼算法设计(⽐如Kruskal算法、Prim算法、Dijkst ra、Floyd算法)
1.本程序主要采⽤了单链表+链队列的逻辑结构;且都是基于链式存储的存储结构;
/* 订定票的客户链表结点结构 */
老婆饼机typedef struct LNode_Cer {
char name[MAXNAME];/*客户名字(订票的时候输⼊)名字的排序建议⽤插⼊排序以保持有序*/
int num_tickets;/*订票量*/
int rank;/*仓位等级class是保留字,⽤rank*/
LNode_Cer* link;/*指针域*/
}LNode_Cer;/*link node of Certain */
/*航线链表的结点结构*/
投料机
typedef struct LFlightNode {
char name_des[MAX];/*终点站名*/
char flight_num[MAX];/*航班号:航班号某时某刻从某地飞往另⼀地的航班航程的编号*/
char plane_num[MAX];/*飞机号:飞机号相当于飞机的⾝份证*/
char plane_num[MAX];/*飞机号:飞机号相当于飞机的⾝份证*/
int plane_weekday;/*星期⼏的航班*/
int plane_crew;/*乘员定额(最⼤乘客量)*/
int remaining_tickets;/*剩余票量*/
/*三种等级仓位的价格int price[3]*/
/*此外,可考虑还能够查出该航线由哪些乘客以及候补乘客
LNode_Cer* customerName;
LNode_Cer* candidateName;*/
LFlightNode* next;
}LFlightNode;
/*等候替补客户链队列节点*//*与顺序队列相⽐,就是队列结构⾥把数组⽤链表(头指针)替代(链表外置),虚拟指针⽤真正的指针替代*/
typedef struct  LQueueNode_Can {
/*数据域(不同场景下条⽬可多可少,类型可以多样)*/
char name[MAXNAME];/*候补客户名字*/
int num_tickets;/*该客户需要的票数*/
char flightNo[MAX];/*候补乘客想要的航班*/
/*附加的指针域*/
LQueueNode_Can* link;
}LQueueNode_Can;/*can指candidate的缩写*/
/*等待候补客户链队列整体结构*/
typedef struct LQueue_Can {
LQueueNode_Can* front;
LQueueNode_Can* rear;
}LQueue_Can;
2.涉及的算法有:基于链表的主关键字排序;链队列的以及链表的增加记录+删除记录+检索记录.
(2)主控及功能模块层次结构;
(4)功能模块之间的调⽤与被调⽤关系等。
4.使⽤说明和作业⼩结:
(1)使⽤说明主要描述如何使⽤你的程序以及使⽤时的主要事项;
1.约定:本程序⾥的名字是指是个⼈名字+⾝份ID号综合体的简称(⽐如 chaoxin_1375,是具有唯⼀性的主关键词
2.本程序所指的座舱等级(1,2,3)是在飞机中额外提供的服务的品质,与坐位坐垫⽆关.(当然与实际⽣活中的标准不相同)
3.本程序⽣成座位号只⽣成第⼀张票的座位号(如果该乘客订了多张票,那么就默认是连续的号.(与实际⽣活的座位号有别)
(2)在⼩结中说明程序的改进思想、经验和体会;
1.由于要求实现的功能较多,在安排主函数时应注意将各模块的功能分配到各个函数中,是主函数更简洁,逻辑更清晰.
⼀上来就急于实现数据结构的基本操作使我感到吃⼒⽽且低效
2.建⽴全局变量(在不⾄于混淆的情况下可以减少参数的传递);
在本实验中,纠正了我对全局变量传参的错误认识.
3.对带头结点的链表进⾏排序操作⽐较统⼀,得益于表头结点的使⽤;此外在使⽤同⼀算法对不带头结点的链表进⾏关键字排序时,⽤化归思想,补偿⼀个临时头结点给不带头结点的链表,待排序结束后,修正表头指针,并释放后期加设的头结点实现排序.;链队列⽐循环队列要更加灵活,虽然定义结构体稍加复杂,单实际基本操作却很⽅便.
4.编写本程序时,由于涉及的功能⽐较多,尤其是对异常处理的编写占了较多篇幅,刚开始写的时候⽐较担⼼⾃⼰能否组织好各个模块,花了较多时间在调试上,⽐较考验耐⼼.同时,我也收获了不少,尤其是对vs这个IDE的使⽤更加熟练,调试较长代码的经验使我受益匪浅.
5.本程序参照⽣活中的场景作了简化处理,留⼼⽣活中的各种应⽤,与写好程序不⽆关系.
3. 测试
测试范例,测试结果,测试结果的分析与讨论,测试过程中遇到的主要问题及所采⽤的解决措施。
///以下实例测试包括测试错误处理的可⽤性,但其中多出使⽤getch()来读出⽤户的功能选项,(输⼊没有显⽰在屏幕上,⽽是直接确认选项,⽐如: “输⼊y/Y确定继续”“按键1,2,3,4,5直接进⼊功能”)
代码
粗糙版
#define _CRT_SECURE_NO_WARNINGS
#define _CRT_SECURE_NO_DEPRECATE
#define _CRT_NONSTDC_NO_DEPRECATE
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<ctype.h>
#include<conio.h>/*getch()所在头⽂件是conio.h。⽽不是stdio.h*/
#define MAXLEN 100
#define MAX  60
#define MAXNAME 10
/*  run  this
#define N 5/*航班号数量*/
/* 订定票的乘客链表结点结构 */
typedef struct LNode_Cer {
char name[MAXNAME];/*乘客名字(订票的时候输⼊)名字的排序可以⽤插⼊的⽅式以保持有序*/
int num_tickets;/*订票量*/
int rank;/*仓位等级class是保留字,⽤rank*/
LNode_Cer* link;/*指针域*/
}LNode_Cer;/*link node of Certain */
/*航线链表的结点结构*/
typedef struct LFlightNode {
char name_des[MAX];/*终点站名*/
char flight_num[MAX];/*航班号:航班号某时某刻从某地飞往另⼀地的航班航程的编号*/
char plane_num[MAX];/*飞机号:飞机号相当于飞机的⾝份证*/
int plane_weekday;/*星期⼏的航班*/
int plane_crew;/*乘员定额(最⼤乘客量)*/
int remaining_tickets;/*剩余票量*/
/*三种等级仓位的价格int price[3]*/
/*此外,可考虑还能够查出该航线由哪些乘客以及候补乘客
LNode_Cer* customerName;
数控转塔冲床模具LNode_Cer* candidateName;*/
LFlightNode* next;
}LFlightNode;
/*等候替补乘客链队列节点*//*与顺序队列相⽐,就是队列结构⾥把数组⽤链表(头指针)替代(链表外置),虚拟指针⽤真正的指针替代*/ typedef struct  LQueueNode_Can {
/*数据域(不同场景下条⽬可多可少,类型可以多样)*/
char name[MAXNAME];/*候补乘客名字*/
int num_tickets;/*该乘客需要的票数*/
/**/
char flightNo[MAX];/*候补乘客想要的航班*/
/*附加的指针域*/
LQueueNode_Can* link;
}LQueueNode_Can;/*candidate*/
/*等待候补乘客链队列整体结构*/
typedef struct LQueue_Can {
// LQueueNode_Can LQueue[MAXLEN];
LQueueNode_Can* front;
LQueueNode_Can* rear;
}LQueue_Can;
/*建⽴全局变量(在不⾄于混淆的情况下可以减少参数的传递)*/
/*任何函数都可访问到全局变量(不需要通过传参即可之间从内部访问)*/
LFlightNode* Head =NULL;/*第⼀个航班结点,初始化为NULL*/
LFlightNode* p2;/*航班辅助指针(指向表尾结点)(如果不设⽴该全局变量,要使⽤表尾时也可以同从头遍历到表尾*/
LNode_Cer* LHead =0;/*乘客链表表头表头*/
LNode_Cer* LHead =0;/*乘客链表表头表头*/
LNode_Cer* pLnow =0;/*乘客链表表尾指针*/
LQueue_Can LQ ={0,0};/*//这⾥的LQ不设置为指针,⽽是⼀个链队列类型的变量,
会分配⼀个LQueue_Can类型变量⼤⼩的内存给LQ.(内部含有两个指针的变量类型),不⽅便直接初始赋值*/
/*编写⾃定义基本操作函数时*/
/*假设函数的功能都能够实现,内容的具体实现待逻辑框架设计好后再作填充编写(函数原型的调整)
(如果某个预想函数不易⼀步实现,则届时可以拆分实现(复合实现)还原到研究问题的本质上*/
/*f初始化链表(可以让它构建⼀个头结点并返回节点的指针创建链表(可以考虑将他写为复合函数(包含插⼊函数))*/ /*初始化订定票乘客链表(建⼀个头结点,返回头结点指针)*/
//LNode_Cer* InitLNode_Cer()/*//⽆参有返回值带出结果的函数版本(也可以使有参(间接传参保存结果)的版本)*/ //{
//    LNode_Cer* LNode;/*只分配了⼀个指针的空间*/
//    LNode = (LNode_Cer*)malloc(sizeof(LNode_Cer));/*申请⼀个节点的空间*/
//    if (!LNode)
//    {
//        printf("malloc failed!\n");
//        exit(1);
//    }
//    LNode->name[0] = 0;
//    LNode->num_tickets = 0;
//    LNode->rank = 0;
//    LNode->link = NULL;
//    return LNode;
//}
/*初始化链队列(申请⼀个表头结点,并且将处理结果保存再LQ中)
void InitLQueue_Can(LQueue_Can* LQ )
{
LQ->front = LQ->rear = (LQueueNode_Can*)malloc(sizeof(LQueueNode_Can));
if (!LQ->front)
{
exit(1);
}
LQ->front->link = 0;
}
*/
/*备⽤的基本操作函数算法*/
/*插⼊新结点到队列尾*/
//void EnQueue(/**/LQueue_Can* LQ, char* name, int num_tickets)
/
/{
//    /*LQ->rear->link = (LQueueNode_Can*)malloc(sizeof(LQueueNode_Can));//直接挂钩新结点
//    scanf("%s", LQ->rear->name);
//    LQ->rear = LQ->rear->link;*/
//    /*如果引⼊辅助指针s,可以使得表达式更简洁(尽管步骤肯多点.*/
//    LQueueNode_Can* s = (LQueueNode_Can*)malloc(sizeof(LQueueNode_Can));
//    if (!s) exit(1);
//    strcpy(s->name, name);
//    s->num_tickets = num_tickets;
糖蜜酒精//    s->link = 0;
//
/
/    LQ->rear->link = s;
//    LQ->rear = s;
//}
/*初始化队列节点
LQueueNode_Can* InitLQueueNode_Can()
{
LQueueNode_Can* LQNode;
LQNode = (LQueueNode_Can*)malloc(sizeof(LQueueNode_Can));
LQNode->name[0] = '\0';
LQNode->num_tickets = 0;
LQNode->link = NULL;
return LQNode;
}*/
/*插⼊新元素到链表尾*/
//void InsertToLinkTail(LNode_Cer* pHead)
//void InsertToLinkTail(LNode_Cer* pHead)
//{
//    LNode_Cer* LNode = (LNode_Cer*)malloc(sizeof(LNode_Cer));
//    if (!LNode)
//    {
//        printf("malloc failed!\n");
//        exit(1);
/
/    }
//    /*新结点内容写⼊*/
//    scanf("%s", LNode->name);
//    scanf("%d", &LNode->num_tickets);
//    scanf("%d", &LNode->rank);
//    /*到链表尾部*/
//    while (pHead->link)
//    {
//        pHead = pHead->link;
//    }/*指向当前表尾元素*/
//    /*插⼊新节点*/
/
/    pHead->link = LNode;
//}
/*检查输⼊的航班号是否早已被占⽤,返会是/否*/
int is_aready_have(LFlightNode* Head,char* flight_num)
{
LFlightNode* p1 = Head;
while(p1)
{
if(!strcmp(p1->flight_num, flight_num))
{
return1;
鹰眼监控系统
}
p1 = p1->next;
}
return0;
}
/*f录⼊航班号(在停⽌之前⼀直录⼊)
需要注意的的是,航班号必须唯⼀,若发现重复录⼊,应给予提⽰:*/
void input_flights()/*line_add*/
{
LFlightNode* p1;
LFlightNode* ptemp;/*保存新申请的结点内存的指针*/
/
/p1 = Head;
p2 = Head;
char temp_flight_name[MAX];/*暂存输⼊的航班号名*/
char c;/*接收是否继续录⼊的指令*/
while(1)
{
printf("继续执⾏录⼊操作?(按y/Y以外的键退出.)\n");
c =getch();
if((c !='y'&& c !='Y'))
{
break;
}
/*创建并写⼊头结点*/
if(Head ==NULL)
{
p2 =(LFlightNode*)malloc(sizeof(LFlightNode));
p2->next =NULL;
Head = p2;/*获得表头结点(这⼀步只需执⾏⼀次)*/
}
else
{
p2 = p2->next =(LFlightNode*)malloc(sizeof(LFlightNode));/*shen'qing申请+插⼊到表尾+更新表尾结点指针*/ //p2 = p2->next;/*gengxin更新表尾指针*/
p2->next =NULL;

本文发布于:2024-09-21 16:27:30,感谢您对本站的认可!

本文链接:https://www.17tex.com/tex/4/248524.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:链表   结点   指针
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议