操作使用链表实现,编译器使用vs2019
用户进入操作界面,选择添加机票信息,包括(飞机航班号,出发地,目的地,起飞时间,降落时间,飞机票价,当日折扣,机票总数)
进入订票系统,输入起飞地,目的地,调用查询函数会打印机票信息到屏幕,若没有则告知,如果有,订票人开始订票。输入(姓名,身份证号,性别,订购航班,购票数量)
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
struct AirPlane
{
char acFlight[10];//航班号
char acOrigin[10];//出发地
char acDest[10];//目的地
char acTakeOffTime[10];//起飞时间
char acReverveTime[10];//降落时间
float fPrice;//票价
char acDiscount[4];//折扣
int iNum;//票数
};
struct Man
{
char acName[20];//姓名
char acID[20];//身份证号
char acSex[10];//性别
int iBookNum;//购票数量
char acBookFilight[10];//订购的航班号
};
//定义机票信息结点的结构体
typedef struct PlaneNode
{
struct AirPlane data;
struct PlaneNode* next;
}PlaneNode, * PLNode;
//定义订票人信息结点的结构体
typedef struct ManNode
{
struct Man data;
struct ManNode* next;
}ManNode, * MANNode;
int iSave = 0;//作为数据是否改动的标志
void Menu()
{
puts("***********************************************************");
puts("****** Welcome to the airplane tickets booking system *****");
puts("-----------------------------------------------------------");
puts("****** Choose the following operations(0-9) *****");
puts("-----------------------------------------------------------");
puts("** 1.Insert fligths 2.Search fligths **");
puts("** 3.Book fligths 4.Modify fligths **");
puts("** 5.Show fligths 6.Recommed fligths **");
puts("** 7.Refund fligths 8.NowTime fligths **");
puts("** 9.Save Messages 0.Exist **");
puts("-----------------------------------------------------------");
}
int main()
{
PlaneNode pstPlaneNodeHead;//机票信息头结点
pstPlaneNodeHead.next = NULL;
ManNode pstManNodeHead; //订票人头结点
pstManNodeHead.next = NULL;
int res;
res = Init(&pstPlaneNodeHead, &pstManNodeHead);//将文件的数据加载到内存中
if (res < 0)
{
return 0;
}
int iSel;//用于接收用户对于功能的选择
char c1; //是否保存
while(1)
{
system("cls");
Menu();
printf("Input 0-9 operations:");
scanf("%d", &iSel);
getchar();
system("cls");
switch(iSel)
{
case 1:
//Insert(&pstPlaneNodeHead);//添加机票信息
break;
case 2:
//Search(&pstPlaneNodeHead);//查询机票信息
break;
case 3:
//Book(&pstManNodeHead, &pstPlaneNodeHead);//预定机票系统
break;
case 4:
//Modify(&pstPlaneNodeHead);//修改机票信息
break;
case 5:
//Show(&pstPlaneNodeHead);//显示所有机票信息
break;
case 6:
//Recommed(&pstPlaneNodeHead);//推荐机票信息
break;
case 7:
//Refund(&pstManNodeHead, &pstPlaneNodeHead);//退票操作
break;
case 8:
//NowTime();//显示当前时间
break;
case 9:
//SaveMan(&pstManNodeHead);//保存订票人信息
//SavePlane(&pstPlaneNodeHead);//保存机票信息
case 0:
if (iSave == 1)
{
printf("Do you want to save message (y/n)");
scanf("%c", &c1);
getchar();
if (c1 == 'y' || c1 == 'Y')
{
//SaveMan(&pstManNodeHead);//保存订票人的信息
//SavePlane(&pstPlaneNodeHead);//保存机票信息
}
}
//Destroy(pstManNodeHead,pstPlaneNodeHead);
return 0;
}
printf("please press any key continue...");
_getch();
}
//Destroy(pstManNodeHead,pstPlaneNodeHead);
return 0;
}
将添加的机票信息文件写入内存中,之后的每次操作都在内存中进行
int Init(PLNode pstPlaneNodeHead, MANNode pstManNodeHead)//将文件的数据加载到内存中
{
//先加载飞机机票信息
FILE* pfplane;//定义飞机机票文件指针
PlaneNode* pstPlaneNodeTemp, * pstPlaneNodeCur;
pstPlaneNodeCur = pstPlaneNodeHead;
pstPlaneNodeTemp = NULL;
pfplane = fopen("plane.txt", "ab+");
if (pfplane == NULL)
{
printf("Can't open plane.txt!\n");
return -1;
}
else
{
//把文件数据读入链表中
while (!feof(pfplane))
{
pstPlaneNodeTemp = (PlaneNode*)malloc(sizeof(PlaneNode));//申请临时结点
if (fread(pstPlaneNodeTemp, sizeof(PlaneNode), 1, pfplane) == 1)
{
pstPlaneNodeTemp->next = NULL;
pstPlaneNodeCur->next = pstPlaneNodeTemp;
pstPlaneNodeCur = pstPlaneNodeTemp;
}
}
free(pstPlaneNodeTemp);
fclose(pfplane);
}
//2.再加载订票人信息
FILE* pfman;//定义文件指针
ManNode* pstManNodeTemp, * pstManNodeCur;
pstManNodeCur = pstManNodeHead;
pstManNodeTemp = NULL;
pfman = fopen("man.txt", "ab+");
if (pfman == NULL)
{
printf("Can't open man.txt!\n");
return -1;
}
else
{
//把文件数据读入链表中
while (!feof(pfman))
{
pstManNodeTemp = (ManNode*)malloc(sizeof(ManNode));//申请临时结点
if (fread(pstManNodeTemp, sizeof(ManNode), 1, pfman) == 1)
{
pstManNodeTemp->next = NULL;
pstManNodeCur->next = pstManNodeTemp;
pstManNodeCur = pstManNodeTemp;
}
}
free(pstManNodeTemp);
fclose(pfman);
}
return 0;
}
void Insert(PLNode pstPlaneNodeHead)//添加机票信息
{
PlaneNode* pstHead, * pstTail, * pstCur, * pstNew;
char acFlight[10];//保存航班号
pstHead = pstTail = pstPlaneNodeHead;
//找尾巴
//让pstTail指向最后一个结点
while (pstTail->next != NULL)
{
pstTail = pstTail->next;
}
while (1)
{
printf("Input the new flight number(-1 to end):");
scanf("%s", acFlight);
getchar();
if (strcmp(acFlight, "-1") == 0)
{
break;
}
//判断航班号是否重复
pstCur = pstPlaneNodeHead->next;
while (pstCur != NULL)
{
if (strcmp(pstCur->data.acFlight, acFlight) == 0)
{
printf("this flight %s exists!\n", acFlight);
return;
}
pstCur = pstCur->next;
}
//如果航班号没有和现有纪录重复,则新建一个链表结点
pstNew = (PlaneNode*)malloc(sizeof(PlaneNode));
strcpy(pstNew->data.acFlight, acFlight);
printf("Input the Start City:");
scanf("%s", pstNew->data.acOrigin);
printf("Input the Dest City:");
scanf("%s", pstNew->data.acDest);
printf("Input the Departure time (Format 00:00):");
scanf("%s", pstNew->data.acTakeOffTime);
printf("Input the Arrival time (Format 00:00):");
scanf("%s", pstNew->data.acReverveTime);
printf("Input the price of ticket:");
scanf("%f", &pstNew->data.fPrice);
printf("Input the discount of ticket(Format 0.0):");
scanf("%s", pstNew->data.acDiscount);
printf("Input the number of tickets:");
scanf("%d", &pstNew->data.iNum);
pstNew->next = NULL;
pstTail -> next = pstNew;
pstTail = pstNew;
iSave = 1;
//有新的航班信息,保存标志为1
}
}
选择航班号查询,目的地,出发地查询,可自行添加其他查询
void Search(PLNode pstPlaneNodeHead)//查询机票信息
{
PlaneNode* pstPlaneNode;
int Sel = 0;
int count = 0;//计数器
char acFlight[10], acDes[10],acstart[10];//航班号和目的地
pstPlaneNode = pstPlaneNodeHead->next;
if (pstPlaneNode == NULL)
{
printf("is not have data");
return;
}
//按航班号查询
//按目的地查询
//按起始地查询
printf("Choose one way according to:\n1.flight number 2.Dest 3.Start\n");
scanf("%d", &Sel);
if (Sel == 1)
{
//按航班号查询
printf("input the right flight number:");
scanf("%s", acFlight);
PrintfHead();//机票信息头部打印
while (pstPlaneNode != NULL)
{
if (strcmp(pstPlaneNode->data.acFlight, acFlight) == 0)
{
PrintData(pstPlaneNode);
break;//航班号唯一
}
else
{
pstPlaneNode = pstPlaneNode->next;
}
}
//遍历结束,没有break,则没有用户记录
if (pstPlaneNode == NULL)
{
printf("Sorry,no record!\n");
return;
}
}
else if (Sel == 2)
{
//按目的地查询
printf("input the right Dest:");
scanf("%s", acDes);
PrintfHead();//机票信息头部打印
while (pstPlaneNode != NULL)
{
if (strcmp(pstPlaneNode->data.acDest, acDes) == 0)
{
PrintData(pstPlaneNode);
count++;
}
pstPlaneNode = pstPlaneNode->next;
}
//遍历结束,计数器为0,则没有记录
if (count ==0)
{
printf("Sorry,no record!\n");
return;
}
}
else if (Sel == 3)
{
//按起始地查询
printf("input the right Start:");
scanf("%s", acstart);
PrintfHead();//机票信息头部打印
while (pstPlaneNode != NULL)
{
if (strcmp(pstPlaneNode->data.acOrigin, acstart) == 0)
{
PrintData(pstPlaneNode);
count++;
}
pstPlaneNode = pstPlaneNode->next;
}
//遍历结束,计数器为0,则没有记录
if (count == 0)
{
printf("Sorry,no record!\n");
return;
}
}
else
{
printf("Sorry,please input right number 1-3:\n");
return;
}
}
思路:输入起始地和目的地,显示是否有票若有,多条航班(存入数据到结构体中) 订票:输入订票人信息
订票:选择航班号
void Book(MANNode pstManNodeHead, PLNode pstPlaneNodeHead)//订票
{
//思路:输入起始地和目的地,显示是否有票若有,多条航班(存入数据到结构体中)
//订票:输入订票人信息
//订票:选择航班号
PlaneNode * pstPlaneNodeCur,*astPlane[10]; //保存数据临时结构体数组
ManNode* pstManNodeCur,*pstManNodeTemp=NULL;
char acOrigin[10], acDest[10], acID[20], acName[20], acSex[10], acDescision[2], acFlight[10];
int iNum = 0, Record = 0, k = 0, flg = 0;
//接受订票人信息头指针
pstManNodeCur=pstManNodeHead;
while (pstManNodeCur->next != NULL)
{
pstManNodeCur = pstManNodeCur->next;
}//将订票人结构体指向尾巴
//输入起始地和目的地
printf("input the start city:");
scanf("%s",acOrigin);
printf("input the Dest city:");
scanf("%s",acDest);
//查找起始地和目的地,存入临时结构体数组中
pstPlaneNodeCur = pstPlaneNodeHead->next;
while (pstPlaneNodeCur != NULL)
{
if (strcmp(pstPlaneNodeCur->data.acOrigin,acOrigin) == 0&&strcmp(pstPlaneNodeCur->data.acDest,acDest) == 0)
{
astPlane[Record++] = pstPlaneNodeCur;
}
pstPlaneNodeCur = pstPlaneNodeCur->next;
}
//打印数据
printf("there are %d flights you can choose!\n",Record);
PrintfHead();
for (k = 0; k < Record; k++)
{
PrintData(astPlane[k]);
}
if (Record == 0)
{
printf("Sorry,no flights you can book\*/\n");
}
//订票
else
{
printf("do you want to book it?(y(Y))/n(N))\n");
scanf("%s", acDescision);
getchar();
if (strcmp(acDescision, "y") == 0 || strcmp(acDescision, "Y") == 0)
{
printf("input your information!\n");
pstManNodeTemp = (ManNode*)malloc(sizeof(ManNode));
printf("input your name:");
scanf("%s", acName);
strcpy(pstManNodeTemp->data.acName, acName);
printf("input your id:");
scanf("%s", acID);
strcpy(pstManNodeTemp->data.acID, acID);
printf("input your sex(M/W):");
scanf("%s", acSex);
strcpy(pstManNodeTemp->data.acSex, acSex);
printf("input your want to book flight number:");
scanf("%s", acFlight);
strcpy(pstManNodeTemp->data.acBookFilight,acFlight);
for (k = 0; k < Record; k++)
{
if (strcmp(astPlane[k]->data.acFlight, acFlight) == 0)
{
if (astPlane[k]->data.iNum < 1)
{
printf("no ticket!");
return;
}
printf("remain %d tickets!\n", astPlane[k]->data.iNum);
flg = 1;
break;
}
}
if (flg == 0)
{
printf("error\n");
return;
}
printf("Input the book number:");
scanf("%d", &iNum);//订购几张票
astPlane[k]->data.iNum = astPlane[k]->data.iNum - iNum;
pstManNodeTemp->data.iBookNum = iNum;
pstManNodeCur->next = pstManNodeTemp;
pstManNodeTemp->next = NULL;
pstManNodeCur = pstManNodeTemp;//可以不要
printf("success!\n");
iSave = 1;
}
}
}
为了方便,此处我并未创建新的子菜单,想要更加美观可以自行创建各个函数的子菜单页面
void Modify(PLNode pstPlaneNodeHead)//修改机票信息
{
PlaneNode* pstPlaneNodeCur;
char acFlight[10];
pstPlaneNodeCur = pstPlaneNodeHead->next;
if (pstPlaneNodeCur == NULL)
{
printf("no flight to be modify!");
return;
}
else
{
printf("Input the flight number you want to modify!:");
scanf("%s", acFlight);
while (pstPlaneNodeCur)
{
if (strcmp(pstPlaneNodeCur->data.acFlight, acFlight) == 0)
{
break;
}
else
{
pstPlaneNodeCur = pstPlaneNodeCur->next;
}
}
if (pstPlaneNodeCur)
{
printf("input the new start city:");
scanf("%s", pstPlaneNodeCur->data.acOrigin);
printf("input the new arrval city:");
scanf("%s", pstPlaneNodeCur->data.acDest);
printf("input the new dicount:");
scanf("%s", pstPlaneNodeCur->data.acDiscount);
printf("input the new acTakeOffTime:");
scanf("%s", pstPlaneNodeCur->data.acTakeOffTime);
printf("input the new acReverveTime:");
scanf("%s", pstPlaneNodeCur->data.acReverveTime);
printf("input the new fPrice:");
scanf("%f", &pstPlaneNodeCur->data.fPrice);
printf("input the new iNum:");
scanf("%d", &pstPlaneNodeCur->data.iNum);
printf("modify successful!\n");
iSave = 1;
//此处可以封装一个函数,让这块代码不这么冗杂
}
}
}
void PrintfHead()//打印机票头部信息
{
printf("|------------------------------------------------------------------------------|\n");
printf("|***********************************************************************|******|\n");
printf("|Flight|StartCity|DseCity|DepertureTime|ArrivalTime|***price***|Discount|number|\n");
printf("|******|*********|*******|*************|***********|***********|********|******|\n");
printf("|------------------------------------------------------------------------------|\n");
}
void PrintData(PLNode pstPlaneNodeCur)
{
PlaneNode* pst = pstPlaneNodeCur;
printf(" %3s%8s%8s%12s%12s%16f%7s%8d\n", pst->data.acFlight, pst->data.acOrigin, pst->data.acDest, pst->data.acTakeOffTime,
pst->data.acReverveTime, pst->data.fPrice, pst->data.acDiscount, pst->data.iNum);
}
void Show(PLNode pstPlaneNodeHead)//显示所有机票信息
{
PlaneNode* pstPlaneNodeCur = pstPlaneNodeHead->next;
PrintfHead();
if (pstPlaneNodeHead->next == NULL)
{
printf("no flight ticket!\n");
}
else
{
while (pstPlaneNodeCur != NULL)
{
PrintData(pstPlaneNodeCur);
pstPlaneNodeCur = pstPlaneNodeCur->next;
}
}
}
根据用户输入的出发地,目的地以及用户可以乘坐最早的时间(系统会给出这个时间后所有符合信息的机票信息)
void Recommed(PLNode pstPlaneNodeHead)//推荐机票信息
{
PlaneNode* pstPlaneNodeCur;
char acDest[10], acTime[10],acOrigin[10];
int iNum=0;
pstPlaneNodeCur = pstPlaneNodeHead->next;
printf("input your take city:");
scanf("%s", acOrigin);
printf("input your destination city:");
scanf("%s", acDest);
printf("input the earlist time you can take:");
scanf("%s", acTime);
PrintfHead();
while (pstPlaneNodeCur != NULL)
{
if (strcmp(pstPlaneNodeCur->data.acOrigin, acOrigin) == 0 && strcmp(pstPlaneNodeCur->data.acDest, acDest) == 0&& strcmp(acTime, pstPlaneNodeCur->data.acTakeOffTime) < 0)
{
PrintData(pstPlaneNodeCur);
iNum++;
}
pstPlaneNodeCur = pstPlaneNodeCur->next;
}
printf("there are %d flights you can choose!\n", iNum);
if (iNum != 0)
{
printf("please choose 3rd operation to book it!\n");
}
}
输入订票人身份证号,显示相应的订票信息,选择退票
//找到id号相同的订票人记录,返回订票人节点
MANNode FindMan(MANNode pstManNodeHead, char acID[20])
{
ManNode* pstManNodeCur = pstManNodeHead->next;
while (pstManNodeCur)
{
if (strcmp(pstManNodeCur->data.acID, acID) == 0)
{
return pstManNodeCur;
}
pstManNodeCur = pstManNodeCur->next;
}
return NULL;
}
//找到订票人信息中的航班号记录,找到相应机票信息节点
PLNode FindPlane(PLNode pstPlaneNodeHead, char* acBookFlight)
{
PlaneNode* pstPlaneNodeCur = pstPlaneNodeHead->next;
while (pstPlaneNodeCur)
{
if (strcmp(pstPlaneNodeCur->data.acFlight, acBookFlight) == 0)
{
return pstPlaneNodeCur;
}
pstPlaneNodeCur = pstPlaneNodeCur->next;
}
return NULL;
}
void Refund(MANNode pstManNodeHead, PLNode pstPlaneNodeHead)//退票
{
ManNode* pstManNodeCur, * pstManNodeFind = NULL;
PlaneNode* pstPlaneNodeFind = NULL;
char acID[20],acdescison[2];
int iNum;//剩余票数
int iBooknum;//定了几个票
printf("input your id number :");
scanf("%s", acID);
//找到订票人的结构体
pstManNodeFind = FindMan(pstManNodeHead, acID);
if (pstManNodeFind == NULL)
{
printf("can't find!\n");
}
else//退票
{
printf("this is your tickets:\n");
printf("id number is :%s\n", pstManNodeFind->data.acID);
printf("name is :%s\n", pstManNodeFind->data.acName);
printf("sex is :%s\n", pstManNodeFind->data.acSex);
printf("book flights :%s\n", pstManNodeFind->data.acBookFilight);
printf("book number :%d\n", pstManNodeFind->data.iBookNum);
printf("if you want to cancel it (y/n)?: ");
scanf("%s", acdescison);
if (strcmp(acdescison, "y") == 0 || strcmp(acdescison, "Y") == 0)
{
//找到前驱
pstManNodeCur = pstManNodeHead;
while (pstManNodeCur->next != pstManNodeFind)
{
pstManNodeCur = pstManNodeCur->next;
}
//找到该订票人对应航班记录
pstPlaneNodeFind =FindPlane(pstPlaneNodeHead, pstManNodeFind->data.acBookFilight);
//退票
if (pstPlaneNodeFind != NULL)
{
iNum = pstPlaneNodeFind->data.iNum;//机票剩余票数
iBooknum = pstManNodeFind->data.iBookNum;//订购人定票数
pstPlaneNodeFind->data.iNum = iNum + iBooknum;
}
//删除订票人节点
pstManNodeCur->next = pstManNodeFind->next;
free(pstManNodeFind);
printf("successful refund!\n");
iSave = 1;
}
}
}
void NowTime()//显示当前时间
{
time_t It;
It = time(NULL);
printf("现在的时间是:%s ", ctime(&It));
}
如果没有在操作界面选择保存信息,在退出系统时,主函数调用该函数,问用户是否选择保存刚刚录入内存的信息
void SaveMan(MANNode pstManNodeHead)//保存订票人信息
{
FILE* pfMan;
ManNode* pstManNodeCur;
int count = 0; //保存多少条信息
int iflg = 1; //是否写入信息
pfMan = fopen("man.txt", "wb");
if (pfMan == NULL)
{
printf("the file can't be opened!");
return;
}
pstManNodeCur = pstManNodeHead->next;
while (pstManNodeCur != NULL)
{
if (fwrite(pstManNodeCur, sizeof(ManNode), 1, pfMan) == 1)
{
pstManNodeCur = pstManNodeCur->next;
count++;
}
else
{
iflg = 0;
break;
}
}
fclose(pfMan);
}
void SavePlane(PLNode pstPlaneNodeHead)//保存机票信息
{
FILE* pfPlane; //机票文件信息
PlaneNode* pstPlaneNodeCur;
int count = 0; //保存多少条信息
int iflg = 1; //是否写入信息
pfPlane = fopen("plane.txt", "wb");
if (pfPlane == NULL)
{
printf("the file can't be opened!");
return;
}
pstPlaneNodeCur = pstPlaneNodeHead->next;
while (pstPlaneNodeCur != NULL)
{
if (fwrite(pstPlaneNodeCur,sizeof(PlaneNode) ,1, pfPlane)==1)
{
pstPlaneNodeCur = pstPlaneNodeCur->next;
count++;
}
else
{
iflg = 0;
break;
}
}
if (iflg)
{
printf("you have save %d flights", count);
iSave = 0;
}
fclose(pfPlane);
}
#define _CRT_SECURE_NO_WARNINGS
#include
#include
#include
#include
#include
struct AirPlane
{
char acFlight[10];//航班号
char acOrigin[10];//出发地
char acDest[10];//目的地
char acTakeOffTime[10];//起飞时间
char acReverveTime[10];//降落时间
float fPrice;//票价
char acDiscount[4];//折扣
int iNum;//票数
};
struct Man
{
char acName[20];//姓名
char acID[20];//身份证号
char acSex[10];//性别
int iBookNum;//购票数量
char acBookFilight[10];//订购的航班号
};
//定义机票信息结点的结构体
typedef struct PlaneNode
{
struct AirPlane data;
struct PlaneNode* next;
}PlaneNode, * PLNode;
//定义订票人信息结点的结构体
typedef struct ManNode
{
struct Man data;
struct ManNode* next;
}ManNode, * MANNode;
int iSave = 0;//作为数据是否改动的标志
int Init(PLNode pstPlaneNodeHead, MANNode pstManNodeHead)//将文件的数据加载到内存中
{
//先加载飞机机票信息
FILE* pfplane;//定义飞机机票文件指针
PlaneNode* pstPlaneNodeTemp, * pstPlaneNodeCur;
pstPlaneNodeCur = pstPlaneNodeHead;
pstPlaneNodeTemp = NULL;
pfplane = fopen("plane.txt", "ab+");
if (pfplane == NULL)
{
printf("Can't open plane.txt!\n");
return -1;
}
else
{
//把文件数据读入链表中
while (!feof(pfplane))
{
pstPlaneNodeTemp = (PlaneNode*)malloc(sizeof(PlaneNode));//申请临时结点
if (fread(pstPlaneNodeTemp, sizeof(PlaneNode), 1, pfplane) == 1)
{
pstPlaneNodeTemp->next = NULL;
pstPlaneNodeCur->next = pstPlaneNodeTemp;
pstPlaneNodeCur = pstPlaneNodeTemp;
}
}
free(pstPlaneNodeTemp);
fclose(pfplane);
}
//2.再加载订票人信息
FILE* pfman;//定义文件指针
ManNode* pstManNodeTemp, * pstManNodeCur;
pstManNodeCur = pstManNodeHead;
pstManNodeTemp = NULL;
pfman = fopen("man.txt", "ab+");
if (pfman == NULL)
{
printf("Can't open man.txt!\n");
return -1;
}
else
{
//把文件数据读入链表中
while (!feof(pfman))
{
pstManNodeTemp = (ManNode*)malloc(sizeof(ManNode));//申请临时结点
if (fread(pstManNodeTemp, sizeof(ManNode), 1, pfman) == 1)
{
pstManNodeTemp->next = NULL;
pstManNodeCur->next = pstManNodeTemp;
pstManNodeCur = pstManNodeTemp;
}
}
free(pstManNodeTemp);
fclose(pfman);
}
return 0;
}
void Insert(PLNode pstPlaneNodeHead)//添加机票信息
{
PlaneNode* pstHead, * pstTail, * pstCur, * pstNew;
char acFlight[10];//保存航班号
pstHead = pstTail = pstPlaneNodeHead;
//找尾巴
//让pstTail指向最后一个结点
while (pstTail->next != NULL)
{
pstTail = pstTail->next;
}
while (1)
{
printf("Input the new flight number(-1 to end):");
scanf("%s", acFlight);
getchar();
if (strcmp(acFlight, "-1") == 0)
{
break;
}
//判断航班号是否重复
pstCur = pstPlaneNodeHead->next;
while (pstCur != NULL)
{
if (strcmp(pstCur->data.acFlight, acFlight) == 0)
{
printf("this flight %s exists!\n", acFlight);
return;
}
pstCur = pstCur->next;
}
//如果航班号没有和现有纪录重复,则新建一个链表结点
pstNew = (PlaneNode*)malloc(sizeof(PlaneNode));
strcpy(pstNew->data.acFlight, acFlight);
printf("Input the Start City:");
scanf("%s", pstNew->data.acOrigin);
printf("Input the Dest City:");
scanf("%s", pstNew->data.acDest);
printf("Input the Departure time (Format 00:00):");
scanf("%s", pstNew->data.acTakeOffTime);
printf("Input the Arrival time (Format 00:00):");
scanf("%s", pstNew->data.acReverveTime);
printf("Input the price of ticket:");
scanf("%f", &pstNew->data.fPrice);
printf("Input the discount of ticket(Format 0.0):");
scanf("%s", pstNew->data.acDiscount);
printf("Input the number of tickets:");
scanf("%d", &pstNew->data.iNum);
pstNew->next = NULL;
pstTail -> next = pstNew;
pstTail = pstNew;
iSave = 1;
//有新的航班信息,保存标志为1
}
}
void Menu()
{
puts("***********************************************************");
puts("****** Welcome to the airplane tickets booking system *****");
puts("-----------------------------------------------------------");
puts("****** Choose the following operations(0-9) *****");
puts("-----------------------------------------------------------");
puts("** 1.Insert fligths 2.Search fligths **");
puts("** 3.Book fligths 4.Modify fligths **");
puts("** 5.Show fligths 6.Recommed fligths **");
puts("** 7.Refund fligths 8.NowTime fligths **");
puts("** 9.Save Messages 0.Exist **");
puts("-----------------------------------------------------------");
}
void SaveMan(MANNode pstManNodeHead)//保存订票人信息
{
FILE* pfMan;
ManNode* pstManNodeCur;
int count = 0; //保存多少条信息
int iflg = 1; //是否写入信息
pfMan = fopen("man.txt", "wb");
if (pfMan == NULL)
{
printf("the file can't be opened!");
return;
}
pstManNodeCur = pstManNodeHead->next;
while (pstManNodeCur != NULL)
{
if (fwrite(pstManNodeCur, sizeof(ManNode), 1, pfMan) == 1)
{
pstManNodeCur = pstManNodeCur->next;
count++;
}
else
{
iflg = 0;
break;
}
}
fclose(pfMan);
}
void SavePlane(PLNode pstPlaneNodeHead)//保存机票信息
{
FILE* pfPlane; //机票文件信息
PlaneNode* pstPlaneNodeCur;
int count = 0; //保存多少条信息
int iflg = 1; //是否写入信息
pfPlane = fopen("plane.txt", "wb");
if (pfPlane == NULL)
{
printf("the file can't be opened!");
return;
}
pstPlaneNodeCur = pstPlaneNodeHead->next;
while (pstPlaneNodeCur != NULL)
{
if (fwrite(pstPlaneNodeCur,sizeof(PlaneNode) ,1, pfPlane)==1)
{
pstPlaneNodeCur = pstPlaneNodeCur->next;
count++;
}
else
{
iflg = 0;
break;
}
}
if (iflg)
{
printf("you have save %d flights", count);
iSave = 0;
}
fclose(pfPlane);
}
void PrintfHead()
{
printf("|------------------------------------------------------------------------------|\n");
printf("|***********************************************************************|******|\n");
printf("|Flight|StartCity|DseCity|DepertureTime|ArrivalTime|***price***|Discount|number|\n");
printf("|******|*********|*******|*************|***********|***********|********|******|\n");
printf("|------------------------------------------------------------------------------|\n");
}
void PrintData(PLNode pstPlaneNodeCur)
{
PlaneNode* pst = pstPlaneNodeCur;
printf(" %3s%8s%8s%12s%12s%16f%7s%8d\n", pst->data.acFlight, pst->data.acOrigin, pst->data.acDest, pst->data.acTakeOffTime,
pst->data.acReverveTime, pst->data.fPrice, pst->data.acDiscount, pst->data.iNum);
}
void Show(PLNode pstPlaneNodeHead)//显示所有机票信息
{
PlaneNode* pstPlaneNodeCur = pstPlaneNodeHead->next;
PrintfHead();
if (pstPlaneNodeHead->next == NULL)
{
printf("no flight ticket!\n");
}
else
{
while (pstPlaneNodeCur != NULL)
{
PrintData(pstPlaneNodeCur);
pstPlaneNodeCur = pstPlaneNodeCur->next;
}
}
}
void Search(PLNode pstPlaneNodeHead)//查询机票信息
{
PlaneNode* pstPlaneNode;
int Sel = 0;
int count = 0;//计数器
char acFlight[10], acDes[10],acstart[10];//航班号和目的地
pstPlaneNode = pstPlaneNodeHead->next;
if (pstPlaneNode == NULL)
{
printf("is not have data");
return;
}
//按航班号查询
//按目的地查询
//按起始地查询
printf("Choose one way according to:\n1.flight number 2.Dest 3.Start\n");
scanf("%d", &Sel);
if (Sel == 1)
{
//按航班号查询
printf("input the right flight number:");
scanf("%s", acFlight);
PrintfHead();//机票信息头部打印
while (pstPlaneNode != NULL)
{
if (strcmp(pstPlaneNode->data.acFlight, acFlight) == 0)
{
PrintData(pstPlaneNode);
break;//航班号唯一
}
else
{
pstPlaneNode = pstPlaneNode->next;
}
}
//遍历结束,没有break,则没有用户记录
if (pstPlaneNode == NULL)
{
printf("Sorry,no record!\n");
return;
}
}
else if (Sel == 2)
{
//按目的地查询
printf("input the right Dest:");
scanf("%s", acDes);
PrintfHead();//机票信息头部打印
while (pstPlaneNode != NULL)
{
if (strcmp(pstPlaneNode->data.acDest, acDes) == 0)
{
PrintData(pstPlaneNode);
count++;
}
pstPlaneNode = pstPlaneNode->next;
}
//遍历结束,计数器为0,则没有记录
if (count ==0)
{
printf("Sorry,no record!\n");
return;
}
}
else if (Sel == 3)
{
//按起始地查询
printf("input the right Start:");
scanf("%s", acstart);
PrintfHead();//机票信息头部打印
while (pstPlaneNode != NULL)
{
if (strcmp(pstPlaneNode->data.acOrigin, acstart) == 0)
{
PrintData(pstPlaneNode);
count++;
}
pstPlaneNode = pstPlaneNode->next;
}
//遍历结束,计数器为0,则没有记录
if (count == 0)
{
printf("Sorry,no record!\n");
return;
}
}
else
{
printf("Sorry,please input right number 1-3:\n");
return;
}
}
void Book(MANNode pstManNodeHead, PLNode pstPlaneNodeHead)//订票
{
//思路:输入起始地和目的地,显示是否有票若有,多条航班(存入数据到结构体中)
//订票:输入订票人信息
//订票:选择航班号
PlaneNode * pstPlaneNodeCur,*astPlane[10]; //保存数据临时结构体数组
ManNode* pstManNodeCur,*pstManNodeTemp=NULL;
char acOrigin[10], acDest[10], acID[20], acName[20], acSex[10], acDescision[2], acFlight[10];
int iNum = 0, Record = 0, k = 0, flg = 0;
//接受订票人信息头指针
pstManNodeCur=pstManNodeHead;
while (pstManNodeCur->next != NULL)
{
pstManNodeCur = pstManNodeCur->next;
}//将订票人结构体指向尾巴
//输入起始地和目的地
printf("input the start city:");
scanf("%s",acOrigin);
printf("input the Dest city:");
scanf("%s",acDest);
//查找起始地和目的地,存入临时结构体数组中
pstPlaneNodeCur = pstPlaneNodeHead->next;
while (pstPlaneNodeCur != NULL)
{
if (strcmp(pstPlaneNodeCur->data.acOrigin,acOrigin) == 0&&strcmp(pstPlaneNodeCur->data.acDest,acDest) == 0)
{
astPlane[Record++] = pstPlaneNodeCur;
}
pstPlaneNodeCur = pstPlaneNodeCur->next;
}
//打印数据
printf("there are %d flights you can choose!\n",Record);
PrintfHead();
for (k = 0; k < Record; k++)
{
PrintData(astPlane[k]);
}
if (Record == 0)
{
printf("Sorry,no flights you can book\*/\n");
}
//订票
else
{
printf("do you want to book it?(y(Y))/n(N))\n");
scanf("%s", acDescision);
getchar();
if (strcmp(acDescision, "y") == 0 || strcmp(acDescision, "Y") == 0)
{
printf("input your information!\n");
pstManNodeTemp = (ManNode*)malloc(sizeof(ManNode));
printf("input your name:");
scanf("%s", acName);
strcpy(pstManNodeTemp->data.acName, acName);
printf("input your id:");
scanf("%s", acID);
strcpy(pstManNodeTemp->data.acID, acID);
printf("input your sex(M/W):");
scanf("%s", acSex);
strcpy(pstManNodeTemp->data.acSex, acSex);
printf("input your want to book flight number:");
scanf("%s", acFlight);
strcpy(pstManNodeTemp->data.acBookFilight,acFlight);
for (k = 0; k < Record; k++)
{
if (strcmp(astPlane[k]->data.acFlight, acFlight) == 0)
{
if (astPlane[k]->data.iNum < 1)
{
printf("no ticket!");
return;
}
printf("remain %d tickets!\n", astPlane[k]->data.iNum);
flg = 1;
break;
}
}
if (flg == 0)
{
printf("error\n");
return;
}
printf("Input the book number:");
scanf("%d", &iNum);//订购几张票
astPlane[k]->data.iNum = astPlane[k]->data.iNum - iNum;
pstManNodeTemp->data.iBookNum = iNum;
pstManNodeCur->next = pstManNodeTemp;
pstManNodeTemp->next = NULL;
pstManNodeCur = pstManNodeTemp;//可以不要
printf("success!\n");
iSave = 1;
}
}
}
void Modify(PLNode pstPlaneNodeHead)//修改机票信息
{
PlaneNode* pstPlaneNodeCur;
char acFlight[10];
pstPlaneNodeCur = pstPlaneNodeHead->next;
if (pstPlaneNodeCur == NULL)
{
printf("no flight to be modify!");
return;
}
else
{
printf("Input the flight number you want to modify!:");
scanf("%s", acFlight);
while (pstPlaneNodeCur)
{
if (strcmp(pstPlaneNodeCur->data.acFlight, acFlight) == 0)
{
break;
}
else
{
pstPlaneNodeCur = pstPlaneNodeCur->next;
}
}
if (pstPlaneNodeCur)
{
printf("input the new start city:");
scanf("%s", pstPlaneNodeCur->data.acOrigin);
printf("input the new arrval city:");
scanf("%s", pstPlaneNodeCur->data.acDest);
printf("input the new dicount:");
scanf("%s", pstPlaneNodeCur->data.acDiscount);
printf("input the new acTakeOffTime:");
scanf("%s", pstPlaneNodeCur->data.acTakeOffTime);
printf("input the new acReverveTime:");
scanf("%s", pstPlaneNodeCur->data.acReverveTime);
printf("input the new fPrice:");
scanf("%f", &pstPlaneNodeCur->data.fPrice);
printf("input the new iNum:");
scanf("%d", &pstPlaneNodeCur->data.iNum);
printf("modify successful!\n");
iSave = 1;
}
}
}
void Recommed(PLNode pstPlaneNodeHead)//推荐机票信息
{
PlaneNode* pstPlaneNodeCur;
char acDest[10], acTime[10],acOrigin[10];
int iNum=0;
pstPlaneNodeCur = pstPlaneNodeHead->next;
printf("input your take city:");
scanf("%s", acOrigin);
printf("input your destination city:");
scanf("%s", acDest);
printf("input the earlist time you can take:");
scanf("%s", acTime);
PrintfHead();
while (pstPlaneNodeCur != NULL)
{
if (strcmp(pstPlaneNodeCur->data.acOrigin, acOrigin) == 0 && strcmp(pstPlaneNodeCur->data.acDest, acDest) == 0&& strcmp(acTime, pstPlaneNodeCur->data.acTakeOffTime) < 0)
{
PrintData(pstPlaneNodeCur);
iNum++;
}
pstPlaneNodeCur = pstPlaneNodeCur->next;
}
printf("there are %d flights you can choose!\n", iNum);
if (iNum != 0)
{
printf("please choose 3rd operation to book it!\n");
}
}
//找到id号相同的订票人记录,返回订票人节点
MANNode FindMan(MANNode pstManNodeHead, char acID[20])
{
ManNode* pstManNodeCur = pstManNodeHead->next;
while (pstManNodeCur)
{
if (strcmp(pstManNodeCur->data.acID, acID) == 0)
{
return pstManNodeCur;
}
pstManNodeCur = pstManNodeCur->next;
}
return NULL;
}
//找到订票人信息中的航班号记录,找到相应机票信息节点
PLNode FindPlane(PLNode pstPlaneNodeHead, char* acBookFlight)
{
PlaneNode* pstPlaneNodeCur = pstPlaneNodeHead->next;
while (pstPlaneNodeCur)
{
if (strcmp(pstPlaneNodeCur->data.acFlight, acBookFlight) == 0)
{
return pstPlaneNodeCur;
}
pstPlaneNodeCur = pstPlaneNodeCur->next;
}
return NULL;
}
void Refund(MANNode pstManNodeHead, PLNode pstPlaneNodeHead)//退票
{
ManNode* pstManNodeCur, * pstManNodeFind = NULL;
PlaneNode* pstPlaneNodeFind = NULL;
char acID[20],acdescison[2];
int iNum;//剩余票数
int iBooknum;//定了几个票
printf("input your id number :");
scanf("%s", acID);
//找到订票人的结构体
pstManNodeFind = FindMan(pstManNodeHead, acID);
if (pstManNodeFind == NULL)
{
printf("can't find!\n");
}
else//退票
{
printf("this is your tickets:\n");
printf("id number is :%s\n", pstManNodeFind->data.acID);
printf("name is :%s\n", pstManNodeFind->data.acName);
printf("sex is :%s\n", pstManNodeFind->data.acSex);
printf("book flights :%s\n", pstManNodeFind->data.acBookFilight);
printf("book number :%d\n", pstManNodeFind->data.iBookNum);
printf("if you want to cancel it (y/n)?: ");
scanf("%s", acdescison);
if (strcmp(acdescison, "y") == 0 || strcmp(acdescison, "Y") == 0)
{
//找到前驱
pstManNodeCur = pstManNodeHead;
while (pstManNodeCur->next != pstManNodeFind)
{
pstManNodeCur = pstManNodeCur->next;
}
//找到该订票人对应航班记录
pstPlaneNodeFind =FindPlane(pstPlaneNodeHead, pstManNodeFind->data.acBookFilight);
//退票
if (pstPlaneNodeFind != NULL)
{
iNum = pstPlaneNodeFind->data.iNum;//机票剩余票数
iBooknum = pstManNodeFind->data.iBookNum;//订购人定票数
pstPlaneNodeFind->data.iNum = iNum + iBooknum;
}
//删除订票人节点
pstManNodeCur->next = pstManNodeFind->next;
free(pstManNodeFind);
printf("successful refund!\n");
iSave = 1;
}
}
}
void NowTime()//显示当前时间
{
time_t It;
It = time(NULL);
printf("现在的时间是:%s ", ctime(&It));
}
int main()
{
PlaneNode pstPlaneNodeHead;//机票信息头结点
pstPlaneNodeHead.next = NULL;
ManNode pstManNodeHead; //订票人头结点
pstManNodeHead.next = NULL;
int res;
res = Init(&pstPlaneNodeHead, &pstManNodeHead);//将文件的数据加载到内存中
if (res < 0)
{
return 0;
}
int iSel;//用于接收用户对于功能的选择
char c1; //是否保存
while(1)
{
system("cls");
Menu();
printf("Input 0-9 operations:");
scanf("%d", &iSel);
getchar();
system("cls");
switch(iSel)
{
case 1:
Insert(&pstPlaneNodeHead);//添加机票信息
break;
case 2:
Search(&pstPlaneNodeHead);//查询机票信息
break;
case 3:
Book(&pstManNodeHead, &pstPlaneNodeHead);//预定机票系统
break;
case 4:
Modify(&pstPlaneNodeHead);//修改机票信息
break;
case 5:
Show(&pstPlaneNodeHead);//显示所有机票信息
break;
case 6:
Recommed(&pstPlaneNodeHead);//推荐机票信息
break;
case 7:
Refund(&pstManNodeHead, &pstPlaneNodeHead);//退票操作
break;
case 8:
NowTime();//显示当前时间
break;
case 9:
SaveMan(&pstManNodeHead);//保存订票人信息
SavePlane(&pstPlaneNodeHead);//保存机票信息
case 0:
if (iSave == 1)
{
printf("Do you want to save message (y/n)");
scanf("%c", &c1);
getchar();
if (c1 == 'y' || c1 == 'Y')
{
SaveMan(&pstManNodeHead);//保存订票人的信息
SavePlane(&pstPlaneNodeHead);//保存机票信息
}
}
//Destroy(pstManNodeHead,pstPlaneNodeHead);
return 0;
}
printf("please press any key continue...");
_getch();
}
//Destroy(pstManNodeHead,pstPlaneNodeHead);
return 0;
}
如有错误还望指正!