代码可以直接复制粘贴即可使用,本文借鉴于这篇文章航空客运订票系统(数据结构课设)_Czc超的博客-CSDN博客_航空客运订票系统数据结构
做了一些改动,将这个项目的实现变得更简单了一点
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#define OK 1
#define ERROR 0
#define OVERFLOW -1
#define FALSE -1
#define TRUE 1
typedef int Status;
//已订票乘客的线性链表
typedef struct CustomerNode {
char name[10];//乘客姓名
char identification[20];//乘客身份证号码
int seat;//乘客座位号
CustomerNode *next;
}CustomerNode, *CusLinkList;
//排队的客户的链队列
typedef struct WaitPassenger {
char name[10];//排队等候的客户的姓名
char identification[20];//乘客身份证号码
struct WaitPassenger *next;
} WaitQNode, *PWait;
typedef struct Queue {
PWait front;//等候客户名单域的头指针
PWait rear;//等候客户名单域的尾指针
} LinkQueue;
//航班的线性链表
typedef struct Flight {
char startPoint[20];//起点站名
char destination[20];//终点站名
char flightCodeID[20];//航班ID(相当于主键)
char planeNum[20];//飞机号
char day[20];//飞行日期(星期几)
int totalTickets;//乘员定额(总票数)
int left;//总余票量
CusLinkList cusLinkList;//已订票的客户名单
LinkQueue waitQueue1;//预约登记的客户名单
Flight *next;
} Flight, FlightNode, *PFlight;
//声明函数
Flight *find();
Status InitQueue(LinkQueue &q);
Status InitCusLinkList(CusLinkList &cusLinkList);
int MenuSelect();
void BookTickets();
void ReturnTicket();
void BookticketFace();
void ReturnTicketsFace();
void PrintFilghtlist(Flight *flight);
Status Create(PFlight flight1);
void InitFlight();
CusLinkList insertlink(CusLinkList &head, char name[], char identification[], int seat);
LinkQueue Appendqueue(LinkQueue &q, char name[], char identification[]);
Flight *pFlight;//全局变量
//目前的航班
Flight flight1[6] = {
{"广州", "北京", "1", "B3333", "星期一", 10, 10},
{"广州", "北京", "2", "D5555", "星期二", 8, 8},
{"广州", "北京", "3", "L6666", "星期天", 10, 10},
{"上海", "广州", "4", "K9999", "星期三", 8, 8},
{"广州", "成都", "5", "K7777", "星期三", 10, 10},
{"成都", "广州", "6", "K8888", "星期三", 8, 8}
};
//查询航班时输出航班信息
void PrintFilghtlist(Flight *pflight) {
system("cls");//清屏操作
Flight *p;
p = pflight->next;//p指向第一个结点
//遍历输出
while (p != NULL) {
printf("起点站名:%s\n终点站名:%s\n航班ID:%s\n飞机号:%s\n飞行日期:%s\n乘员定额:%d\n余票量:%d\n\n",p->startPoint, p->destination, p->flightCodeID,p->planeNum, p->day,p->totalTickets, p->left);
p = p->next;
}
printf("\n");
}
//寻找符合客户查找的航班并返回结点的函数
Flight *find() {
char number[10];
printf("请输入航班ID: ");
scanf("%s", number);
//从第一个结点开始遍历
Flight *p = pFlight->next;
while (p != NULL) {
if (!strcmp(number, p->flightCodeID))
return p;
p = p->next;
}
return NULL;
}
//订票函数
void BookTickets() {
system("cls");
PrintFilghtlist(pFlight);
struct Flight *info;
int tickets;
char name[10];
char identification[20];
int loop1;
loop1:
{
info = find();
};
if (info == NULL){
printf("没有这个航班, 请重新输入\n");
goto loop1;
}
int loop2;
loop2:
{ printf("您订票的数量:1\n ");
};
tickets = info->left;
if (1 <= tickets) {
int i;
printf("请输入您的姓名:");
scanf("%s", name);
printf("请输入您的身份证号码:");
scanf("%s", identification);
CusLinkList head = info->cusLinkList;
//订票成功,插入成员名单链表
insertlink(head, name, identification, info->totalTickets - info->left + 1);
printf("%s 的座位号是: %d\n", name, info->totalTickets - info->left + 1);
info->left -=1;
printf("\n祝您旅途愉快!欢迎再次光临\n");
} else
loop0:
{
char r;
printf("该航班的票不足,订票失败,是否需要重新选择航班(Y/N)\n");
r = getch();
printf("%c", r);
if (r == 'Y' || r == 'y') {//改变计划,重新选择航班
BookTickets();
} else {
printf("\n您是否需要排队等候(Y/N)");
r = getch();
printf("%c", r);
if (r == 'Y' || r == 'y') {//不改变计划,排队候票
printf("\n请输入您的姓名(排队订票客户):");
scanf("%s", name);
printf("\n请输入您的身份证(排队订票客户):");
scanf("%s", identification);
info->waitQueue1 = Appendqueue(info->waitQueue1, name, identification);
printf("\n排队成功!\n");
} else {
printf("\n欢迎您下次再次订购!\n");
}
}
}
}
void BookticketFace() {
system("cls");
int a3;
printf("\n");
printf("\n");
printf("订票模块\n");
printf("1.客户订票\n");
printf("2.返回上一级菜单\n");
printf("请输入您的选择:");
scanf("%d", &a3);
switch (a3) {
case 1:
PrintFilghtlist(pFlight);
BookTickets();
system("PAUSE");
BookticketFace();
break;
case 2:
system("cls");
MenuSelect();
break;
}
}
void ReturnTicketsFace() {
int a3;
system("cls");
printf("\n");
printf("\n");
printf(" 退票模块\n");
printf(" 1.办理退票手续 \n");
printf(" 2.返回上一级菜单 \n");
printf("请输入您的选择:");
scanf("%d", &a3);
switch (a3) {
case 1:
ReturnTicket();
system("PAUSE");
ReturnTicketsFace();
break;
case 2:
MenuSelect();
break;
default:
ReturnTicketsFace();
}
}
void ReturnTicket() {
system("cls");
PrintFilghtlist(pFlight);
struct Flight *info;
int rank;
//p1为遍历指针,p2为辅助指针,指向p1的前驱
CustomerNode *p1, *p2, *head;
//客户姓名
char cusname[10];
//客户身份证
char identification[20];
//info指针,find函数根据航班ID返回该航班节点的指针
int loop;
loop:
{
info = find();
};
if (info == NULL){
printf("没有这个航班, 请重新输入\n");
goto loop;
}
//head为该航班的的乘员名单域的头指针
head = info->cusLinkList;
//带头结点的指针,从head->next开始遍历
p1 = head->next;
printf("请输入你的姓名: ");
scanf("%s", cusname);
printf("请输入你的身份证号码: ");
scanf("%s", identification);
p2 = head;
//根据客户姓名搜索客户是否订票
while (p1 != NULL) {
if ((strcmp(cusname, p1->name) == 0) && (strcmp(identification, p1->identification) == 0)) break;
p2 = p1;
p1 = p1->next;
}
//没有该客户
if (p1 == NULL) {
printf("对不起,您没有订过票或姓名和身份证不对应!\n");
return;
} else {//退票成功
//从乘客名单域中移除该节点
p2->next = p1->next;
//加回该航班的剩余票
info->left += 1;
printf("%s成功退票!\n", p1->name);
free(p1);//释放该节点
}
}
int MenuSelect(){
int select;
Status status;
flag:
{
system("cls");
printf("欢迎来到航空订票系统\n");
printf("1.查询模块\n");
printf("2.订票模块\n");
printf("3.退票模块\n");
printf("请输入(1-3)否则无效! 请输入您的选择:");
scanf("%d", &select);
}
switch (select){
case 1:
//进入查询模块
PrintFilghtlist(pFlight);
system("PAUSE");
MenuSelect();
break;
case 2:
//进入订票模块
BookticketFace();
system("PAUSE");
MenuSelect();
break;
case 3:
//进入退票模块
ReturnTicketsFace();
system("PAUSE");
MenuSelect();
break;
}
}
CusLinkList insertlink(CusLinkList &head,char name[], char identification[], int seat) {
//成员名单域新节点new1
CusLinkList new1;
new1 = (CustomerNode *) malloc(sizeof(CustomerNode));
if (new1 == NULL) {
printf("\n内存不足\n");
return NULL;
}
//将传入乘客信息赋值给new1节点
strcpy(new1->name, name);
strcpy(new1->identification, identification);
new1->seat=seat;
//头插入法加入成员名单域
new1->next = head->next;
head->next = new1;
return head;
}
LinkQueue Appendqueue(LinkQueue &q, char name[], char identification[]) {
PWait new1;
new1 = (PWait) malloc(sizeof(WaitQNode));
strcpy(new1->name, name);
strcpy(new1->identification, identification);
new1->next = NULL;
q.rear->next = new1;
q.rear = new1;
return q;
}
void InitFlight() {
pFlight = (Flight *) malloc(sizeof(Flight));//申请头结点的空间
if (pFlight == NULL) exit(0);
pFlight->next = NULL;//将头结点h的指针域置为空
}
Status Create(PFlight flight1) {
Flight *p = pFlight, *q;
for (int i=0; i < 6; i++) {
q = (Flight *) malloc(sizeof(Flight));
if (q == NULL)
return ERROR;
strcpy(q->startPoint, flight1[i].startPoint);
strcpy(q->destination, flight1[i].destination);
strcpy(q->flightCodeID, flight1[i].flightCodeID);
strcpy(q->planeNum, flight1[i].planeNum);
strcpy(q->day, flight1[i].day);
q->totalTickets = flight1[i].totalTickets;
q->left = flight1[i].left;
//初始化乘客链表
InitCusLinkList(q->cusLinkList);
//初始化等待客户链队列
InitQueue(q->waitQueue1);
q->next = p->next;
p->next = q;
}
return OK;
}
Status InitCusLinkList(CusLinkList &cusLinkList) {
CusLinkList q = cusLinkList;
cusLinkList = (CustomerNode *) malloc(sizeof(CustomerNode));
cusLinkList->next = NULL;
}
Status InitQueue(LinkQueue &q) {
WaitQNode *p;
p = (WaitQNode *) malloc(sizeof(WaitQNode));
if (p == NULL) {
printf("内存不足\n");
return ERROR;
}
p->next = NULL;
q.front = q.rear = p;
return OK;
}
int main(){
InitFlight();
Create(flight1);
MenuSelect();
}
实现后的效果如图所示