C++实现航空订票系统课程设计

  #include

  #include

  #include

  #include

  using namespace std;

  typedef struct Node

  {

  int hangbanhao;//航班号

  char qifeichengshi[10];//起飞城市

  char jiangluochengshi[10];//降落城市

  char qifeishijian[10];//起飞时间

  char jiangluoshijian[10];//降落时间

  int zuoweishu;//座位数

  int piaojia;//票价

  struct Node *next;//结点的指针域

  }LNode,*LinkList;//定义航班信息 LinkList为指向结构体LNode的指针类型

  typedef struct CK

  {

  char name[10];//乘客姓名

  char id[18];//乘客身份证号

  struct CK *next;//结点的指针域

  }ck,*cke;//乘客信息

  void import(int n,LinkList &L)//录入航班函数: n为所要录入航班的数量:

  {//建立一个带头结点的单链表L

  L=(LinkList)malloc(sizeof(LNode));//申请表空间

  L->next=NULL;//头结点的指针域置空

  LNode * tail=L;//将尾赋给尾指针,等价LinkList tail=L;

  for(int i=0; i

  {

  LNode *p=(LinkList)malloc(sizeof(LNode));//创建一个p结点

  cout<<"请输入第"<

  cin>>p->hangbanhao;

  cout<<"请输入第"<

  cin>>p->qifeichengshi;

  cout<<"请输入第"<

  cin>>p->jiangluochengshi;

  cout<<"请输入第"<

  cin>>p->qifeishijian;

  cout<<"请输入第"<

  cin>>p->jiangluoshijian;

  cout<<"请输入第"<

  cin>>p->zuoweishu;

  cout<<"请输入第"<

  cin>>p->piaojia;

  p->next=NULL;//头结点的指针域置空

  tail->next=p;//将新结点插入尾部

  tail=p;//插入的结点变为尾结点,尾插法

  }

  }

  //写入本地文件,并读取输出显示

  void show_L(LinkList &L)//输出浏览机票信息

  {

  ofstream out("out.txt");//实例化一个对象

  if (out.is_open())

  {

  LinkList p=L->next;

  while(p)

  {

  out<<"航班号:";

  out<hangbanhao;

  out<<" 起飞城市:";

  out <qifeichengshi;

  out<<" 降落城市:";

  out <jiangluochengshi;

  out<<" 起飞时间:";

  out <qifeishijian;

  out<<" 降落时间:";

  out <jiangluoshijian;

  out<<" 座位数:";

  out<zuoweishu;

  out<<" 票价:";

  out<piaojia;

  out<< "

  ";//用于换行,是下面in.getline的关键

  p=p->next;

  }

  }

  out.close(); //写完

  char buffer[256];

  ifstream in("out.txt");

  if (! in.is_open())

  { cout << "Error opening file"; exit (1); }

  while (!in.eof() )

  {

  in.getline (buffer,100);

  cout << buffer << endl;

  }

  }

  //按航班号查找

  LinkList GetElem_L(LinkList &L,int e)

  {

  LinkList p=L->next;

  while(p)

  {

  if(p->hangbanhao!=e)

  p=p->next;

  else return p;

  }

  return 0;

  }

  //按航班起降城市查找

  LinkList GetElem_Lc(LinkList &L,char qi[10],char ji[10])

  {

  LinkList p=L->next;

  while(p)

  {

  if(strcmp(p->qifeichengshi,qi)!=0||strcmp(p->jiangluochengshi,ji)!=0)

  p=p->next;

  else return p;

  }

  return 0;

  }

  //删除

  int ListDelete_L(LinkList &L,int e){

  LinkList p=L;

  while(p->next&&p->next->hangbanhao!=e){

  p=p->next;//直到查找到要删除的结点

  }

  if(!p->next)

  return 0;

  LinkList q=p->next;

  p->next=q->next;//p->next=p->next->next;

  free(q);//本题q是需要删除的结点

  return 1;

  }

  //插入

  int ListInsert_L(LinkList &L,int i){

  LinkList p=L;//i为插入的位置

  int j=0;

  while(p&&j

  p=p->next;

  ++j;

  }

  if(!p||j>i-1)

  return 0;

  LNode *s=(LinkList)malloc(sizeof(LNode));

  cout<<"输入航班号:";

  cin>>s->hangbanhao;

  cout<<"输入起飞城市:";

  cin>>s->qifeichengshi;

  cout<<"输入降落城市:";

  cin>>s->jiangluochengshi;

  cout<<"输入起飞时间:";

  cin>>s->qifeishijian;

  cout<<"输入降落时间:";

  cin>>s->jiangluoshijian;

  cout<<"输入座位数:";

  cin>>s->zuoweishu;

  cout<<"输入票价:";

  cin>>s->piaojia;

  s->next=p->next;

  p->next=s;//s->next=p->next;p->next=s;

  return 1;

  }

  //修改

  LinkList xiugai(LinkList &L,int yxg)

  {

  LinkList q=L->next;

  while(q)

  {

  if(q->hangbanhao!=yxg)

  q=q->next;

  else return q;

  }

  return 0;

  }

  //乘客信息录入

  void importren(int n,cke &C)//录入航班函数: n为所要录入航班的数量:

  {

  C=(cke)malloc(sizeof(ck));

  C->next=NULL;

  ck*ta=C;

  for(int i=0; i

  {

  ck *p=(cke)malloc(sizeof(ck));//就是创建一个p结点,关键就是写法,LNdoe *p;

  cout<<"请输入第"<

  cin>>p->name;

  cout<<"请输入第"<

  cin>>p->id;

  p->next=NULL;

  ta->next=p;

  ta=p;//尾插法,根据循环画图可知,tail指针始终在最后

  }

  }

  //订票乘客信息和航班信息写入本地和读取

  void show_dp(cke &C,LinkList &R)

  {

  ofstream out("dinpiao.txt");//实例化一个对象

  if (out.is_open())

  {

  cke p=C->next;

  while(p){

  out<<"姓名 ";

  out<name;

  out<<"  身份证ID ";

  out<id;

  out<< "

  ";//用于换行,是下面in.getline的关键

  p=p->next;

  }

  if(R->zuoweishu-1>=0)

  {

  out<<"航班号:"<hangbanhao;

  out<<" 起飞城市:"<qifeichengshi;

  out<<" 降落城市:"<jiangluochengshi;

  out<<" 起飞时间:"<qifeishijian;

  out<<" 降落时间:"<jiangluoshijian;

  out<<" 座位数:"<zuoweishu-1;//订票之后座位数减一

  out<<" 票价:"<piaojia;

  out<< "

  ";//用于换行,是下面in.getline的关键

  out<<"订票成功";

  out<< "

  ";//用于换行,是下面in.getline的关键

  }

  else

  {

  out<<"航班号:"<hangbanhao;

  out<<" 起飞城市:"<qifeichengshi;

  out<<" 降落城市:"<jiangluochengshi;

  out<<" 起飞时间:"<qifeishijian;

  out<<" 降落时间:"<jiangluoshijian;

  out<<" 座位数:"<zuoweishu;

  out<<" 票价:"<piaojia;

  out<< "

  ";//用于换行,是下面in.getline的关键

  out<<"该航班暂无票,请选择其他航班";

  out<< "

  ";//用于换行,是下面in.getline的关键

  }

  }

  out.close(); //写完

  char buffer[256];

  ifstream in("dinpiao.txt");

  if (! in.is_open())

  { cout << "Error opening file"; exit (1); }

  while (!in.eof() )

  {

  in.getline (buffer,100);

  cout << buffer << endl;

  }

  }

  //退票乘客信息和航班信息写入本地和读取

  void show_tp(cke &C,LinkList &R)

  {

  ofstream out("dinpiao.txt");//实例化一个对象

  if (out.is_open())

  {

  cke p=C->next;

  while(p){

  out<<"姓名 ";

  out<name;

  out<<"身份证ID ";

  out<id;

  out<< "

  ";//用于换行,是下面in.getline的关键

  p=p->next;

  }

  out<<"航班号 "<hangbanhao;

  out<<" 起飞城市:"<qifeichengshi;

  out<<" 降落城市:"<jiangluochengshi;

  out<<" 起飞时间:"<qifeishijian;

  out<<" 降落时间:"<jiangluoshijian;

  out<<" 座位数:"<zuoweishu;//退票之后不需要加1,用最初的座位数;

  out<<" 票价:"<piaojia;

  out<< "

  ";//用于换行,是下面in.getline的关键

  out<<"退票成功";

  out<< "

  ";//用于换行,是下面in.getline的关键

  }

  out.close(); //写完

  char buffer[256];

  ifstream in("dinpiao.txt");

  if (! in.is_open())

  { cout << "Error opening file"; exit (1); }

  while (!in.eof() )

  {

  in.getline (buffer,100);

  cout << buffer << endl;

  }

  }

  void menu()//显示菜单界面

  {

  cout<<"=================================欢迎使用航空订票系统==============================="<

  cout<<"*                                1请先录入航班信息                                 *"<

  cout<<"*                                2根据航班号查找航班                               *"<

  cout<<"*                                3根据起降城市查找航班                             *"<

  cout<<"*                                4删除航班                                         *"<

  cout<<"*                                5插入航班                                         *"<

  cout<<"*                                6修改航班                                         *"<

  cout<<"*                                7订票录入乘客信息                                 *"<

  cout<<"*                                8退票                                             *"<

  cout<<"===================================================================================="<

  }

  int main()

  {

  LinkList L;//L是指针 航班

  cke C;//乘客

  while(1)

  {

  menu();

  int caozuo;

  cout<<"请选择操作";

  cin>>caozuo;

  switch(caozuo)

  {

  case 1:

  //创建

  int num;

  cout<<"请输入要录入的航班数:";

  cin>>num;

  cout<

  import(num,L);//录入航班函数: n为所要录入航班的数量:

  cout<

  cout<<"航班信息录入成功";

  cout<

  //写入本地文件,并读取输出显示

  show_L(L);

  break;

  case 2:

  //根据航班号查找

  int dchbh;//根据航班号查找

  printf("请输入待查航班号:");

  cin>>dchbh;

  LinkList p;

  p=GetElem_L(L,dchbh);//查找

  cout<<"待查航班为:";

  cout<<"航班号:"<hangbanhao;

  cout<<" 起飞城市:"<qifeichengshi;

  cout<<" 降落城市:"<jiangluochengshi;

  cout<<" 起飞时间:"<qifeishijian;

  cout<<" 降落时间:"<jiangluoshijian;

  cout<<" 座位数:"<zuoweishu;

  cout<<" 票价:"<piaojia;

  cout<

  break;

  case 3:

  //根据起降城市查找

  char qi[10];

  char ji[10];

  printf("请输入待查航班起降城市:");

  cout<<"输入起飞城市:";

  cin>>qi;

  cout<<"输入降落城市:";

  cin>>ji;

  LinkList J;

  J=GetElem_Lc(L,qi,ji);//查找

  cout<<"待查航班为:";

  cout<<"航班号:"<hangbanhao;

  cout<<" 起飞城市:"<qifeichengshi;

  cout<<" 降落城市:"<jiangluochengshi;

  cout<<" 起飞时间:"<qifeishijian;

  cout<<" 降落时间:"<jiangluoshijian;

  cout<<" 座位数:"<zuoweishu;

  cout<<" 票价:"<piaojia;

  cout<

  break;

  case 4:

  //删除

  int shanchu;

  printf("请输入要删除的航班号:");

  scanf("%d",&shanchu);

  ListDelete_L(L,shanchu);//删除

  show_L(L);

  cout<

  break;

  case 5:

  //插入

  //这里位置始终在第一行

  ListInsert_L(L,1);//插入

  show_L(L);

  cout<

  break;

  case 6:

  //修改

  printf("请输入要修改的航班号:");

  int yxg;

  cin>>yxg;

  LinkList q;

  q=xiugai(L,yxg);//修改

  cout<<"航班号修改为:";

  cin>>q->hangbanhao;

  cout<<"航班起飞城市修改为:";

  cin>>q->qifeichengshi;

  cout<<"航班降落城市修改为:";

  cin>>q->jiangluochengshi;

  cout<<"航班起飞时间修改为:";

  cin>>q->qifeishijian;

  cout<<"航班降落时间修改为:";

  cin>>q->jiangluoshijian;

  cout<<"航班座位数修改为:";

  cin>>q->zuoweishu;

  cout<<"航班票价修改为:";

  cin>>q->piaojia;

  show_L(L);

  cout<

  break;

  case 7:

  //订票

  int renshu;

  cout<<"请选择您要订票的人数:";

  cin>>renshu;

  cout<

  importren(renshu,C);//录入乘客信息

  cout<

  cout<<"乘客信息录入成功";

  cout<

  int m;

  cout<<"请输入您要订的航班号:";

  cin>>m;

  cout<

  LinkList R;

  R=GetElem_L(L,m);//查找乘客订的航班

  show_dp(C,R);//写入本地文件,并读取输出显示

  cout<

  break;

  case 8:

  //退票

  cout<<"请输入您要退票的航班号:";

  int yt;

  cin>>yt;

  cout<

  LinkList K;

  K=GetElem_L(L,yt);//查找乘客订的航班

  show_tp(C,K);//写入本地文件,并读取输出显示

  cout<

  break;

  }//swith的大括号

  }//while的大括号

  return 0;

  }//主函数的大括号