用C写的航空客运订票系统

#include 
#include 
#include 
#define MAXSIZE 6 /*定义航线量的最大值*/

typedef struct waiting
{  char name[10];/*姓名*/
   int wait_ask_number;/*订票量*/
   struct waiting *next;
}qnode,*qptr;

typedef struct pqueue
{  qptr front;/*等候替补客户名单域的头指针*/
   qptr rear;/*等候替补客户名单域的属指针*/
}linkqueue;

typedef struct ordered_people
{  char name[10];/*客户姓名*/
   int ordering_number;/*订票量*/
   int grade;/*舱位等级*/
   struct ordered_people *next;
}linklist;

typedef struct airline
{   char end_station[10];/*终点站名 */
    char air_num[10];/*航班号*/
    char plane_num[10];/*飞机号*/
    char day[7];/*飞行周日(星期几)*/
    int people_quota;/*乘员定额*/
    int more_ticket;/*余票量*/
    linklist *order;/*乘员名单域,指向乘员名单链表的头指针*/
    linkqueue wait;/*等候替补的客户名单域,分别指向排队等候名单队头队尾的指针*/
}lineinfo;/*在后面加,*start的意思是定义一种start类型,跟int型一样。*/
struct airline *start; /*定义 airline类型的一个start指针*/


void list()/*打印全部航线信息*/
{ 
   void display(struct airline *info);  
   struct airline *info;
   int i=0;
   info=start;
   printf("终点站名\t航班号\t飞机号\t飞行周日\t乘员定额\t余票量\n");
   while(iprintf("\n\n");
}

void display(struct airline *info)
/*打印每条航线的基本信息*/
{printf("%8s\t%3s\t%s\t%4s\t\t%3d\t%10d\n",info->end_station,info->air_num,info->plane_num,info->day,info->people_quota,info->more_ticket);
}


void search()
/*根据客户提出的终点站名输出航线信息*/
{  struct airline *info,*find_air_num();
   char name[10];
   int i=0;
   info=start;
   printf("请输入终点站名:");
   scanf("%s",name);
   printf("终点站名\t航班号\t飞机号\t飞行周日\t乘员定额\t余票量\n");
   while(iif(!strcmp(name,info->end_station))/*strcmp函数是比较两个字符串,相同的话返回0*/ 

     display(info);

     info++;
     i++;
   }
   if(i>MAXSIZE)
     printf("对不起,该航线未找到!\n");

}

struct airline *find_air_num()
/*根据系统提出的航班号查询并以指针形式返回*/
{  struct airline *info;
   char number[10];
   int i=0;
   info=start;
   printf("请输入航班号:");
   scanf("%s",number);
   while(iif(!strcmp(number,info->air_num)) return info;
     info++;
     i++;
   }
   printf("对不起,该航线末找到!\n");
   return NULL;
}

void prtlink()
/*打印订票乘员名单域的客户名单信息*/
{  linklist *p;
   struct airline *info;
   info=find_air_num();
   p=info->order;
   if(p!=NULL){
   printf("客户姓名   订票数额   舱位等级\n");
    while(p){
      printf("%s\t\t%d\t%d\n",p->name,p->ordering_number,p->grade);
      p=p->next;
     }
    }
   else
      printf("该航线没有客户信息!!\n");
}

linkqueue appendqueue(linkqueue q,char name[],int amount)
/*增加排队等候的客户名单域*/
{ qptr new;
  new=(qptr)malloc(sizeof(qnode));
  strcpy(new->name,name);
  new->wait_ask_number=amount;
  new->next=NULL;
  if(q.front==NULL)/*若原排队等候客户名单域为空*/
    q.front=new;
  else
    q.rear->next=new;
  q.rear=new;
  return q;
}

linklist *insertlink(linklist *head,int amount,char name[],int grade)
/*增加订票乘员名单域的客户信息*/

{  linklist *p1,*new;
   p1=head;
   new=(linklist *)malloc(sizeof(linklist));
   if(!new) {printf("\n系统出现错误\n");return NULL;}
   strcpy(new->name,name);
   new->ordering_number=amount;
   new->grade=grade;
   new->next=NULL;
   if(head==NULL)/*若原无订票客户信息*/
     {head=new;new->next=NULL;}
   else
     head=new;
     new->next=p1;
   return head;
}



void ordering()
/*办理订票业务*/
{  struct airline *info;
   int amount,grade;
   char name[10];
   char r;
   info=start;
   if(!(info=find_air_num())) return;/*根据客户提供的航班号进行查询,如为空,退出该模块*/
   printf("请输入你订票所需要的数量:");
   scanf("%d",&amount);
   if(amount>info->people_quota)/*若客户订票额超过乘员定票总额,退出*/
   {  printf("\n对不起,您输入的票的数量已经超过乘员定额!");
      return;
   }
   if(amount<=info->more_ticket)/*若客户订票额末超过余票量,订票成功并等记信息*/
   {
     int i;
  printf("请输入您的姓名(订票客户):");
     scanf("%s",name);
  printf("请输入%s票的舱位等级:",name);
     scanf("%d",&grade);
     info->order=insertlink(info->order,amount,name,grade);/*在订票乘员名单域中添加客户信息*/
     for(i=0;i/*依次输出该订票客户的座位号*/
       printf("%s的座位号是:%d\n",name,info->people_quota-info->more_ticket+i+1);
     info->more_ticket-=amount;/*该航线的余票量应减掉该客户的订票量*/
  printf("\n祝您乘坐愉快!\n");
   }
   else       /*若满员或余票额少于订票额,询问客户是否需要进行排队等候*/
   {  
     printf("\n已经没有更多的票,您需要排队等候吗?(Y/N)");
     r=getch();
     printf("%c",r);
     if(r=='Y'||r=='y')
     {  printf("\n请输入您的姓名(排队订票客户):");
         scanf("%s",name);
      info->wait=appendqueue(info->wait,name,amount);/*在排队等候乘员名单域中添加客户信息*/
      printf("\n注册成功!\n");
     }
     else 
     {  

        printf("\n\n您想要查询的航线没有满足你的要求,是否愿意输入终点站名查询别的航班信息?(Y/N)\n");
        r=getch();
        printf("%c\n",r);
       if(r=='Y'||r=='y')
         search();
       else 
       {
         printf("\n欢迎您下次再次订购!\n");
       }

    }

   }
}

void return_ticket()
/*退票模块*/
{  struct airline *info;
   qnode *t,*back,*f,*r;
   int grade;
   linklist *p1,*p2,*head;
   char cusname[10];
   if(!(info=find_air_num())) return;/*调用查询函数,根据客户提供的航线进行搜索*/
   head=info->order;
   p1=head;
   printf("请输入你的姓名(退票客户):");
   scanf("%s",cusname);
   while(p1!=NULL) {/*根据客户提供的姓名到订票客户名单域进行查询*/
     if(!strcmp(cusname,p1->name)) break;
     p2=p1;p1=p1->next;
   }
   if(p1==NULL){ printf("对不起,你没有订过票!\n");return;}/*若未找到,退出本模块*/
   else{/*若信息查询成功,删除订票客户名单域中的信息*/
        if(p1==head) head=p1->next;
        else p2->next=p1->next;
        info->more_ticket+=p1->ordering_number;
  grade=p1->grade;
  printf("%s成功退票!\n",p1->name);
        free(p1);
   }
   info->order=head;/*重新将航线名单域指向订票单链表的头指针 */
   f=(info->wait).front;/*f指向排队等候名单队列的头结点*/
   r=(info->wait).rear;/*r指向排队等候名单队列的尾结点*/
   t=f;/*t为当前满点条件的排队候补名单域*/
   while(t)
   {
    if(info->more_ticket>=info->wait.front->wait_ask_number){/*若满足条件者为头结点*/
    int i;
    info->wait.front=t->next;
    printf("%s订票成功!\n",t->name);
    for(i=0;iwait_ask_number;i++)/*输出座位号*/
         printf("%s的座位号是:%d\n",t->name,info->people_quota-info->more_ticket+i+1);
    info->more_ticket-=t->wait_ask_number;
          info->order=insertlink(info->order,t->wait_ask_number,t->name,grade);/*插入到订票客户名单链表中*/
    free(t);
    break;
   }
      back=t;t=t->next;
      if((info->more_ticket)>=(t->wait_ask_number)&&t!=NULL)/*若满足条件者不为头结点*/
      {  int i;
      back->next=t->next;
   printf("%s订票成功!\n",t->name);
      for(i=0;iwait_ask_number;i++)/*输出座位号*/
         printf("%s的座位号是:%d\n",t->name,(info->more_ticket)-i);
      info->more_ticket-=t->wait_ask_number;
   info->order=insertlink(info->order,t->wait_ask_number,t->name,grade);/*插入到订票客户名单链表中*/
      free(t);break;
   }
   if(f==r) break;
   }
}

int menu_select()
/*菜单界面*/
{  int c;
   char s[10];
   printf("\n\t\t\t航空客运订票系统\n");
   printf("\t******************************************\t\n");
   printf("\t\t\t1.浏览航线信息\n");
   printf("\t\t\t2.浏览已订票客户信息\n");
   printf("\t\t\t3.查询航线\n");
   printf("\t\t\t4.办理订票业务:\n");
   printf("\t\t\t5.办理退票业务\n");
   printf("\t\t\t6.退出系统\n");
   printf("\t*******************************************\t\n");
   do{
     printf("请选择:");
     scanf("%s",s);
     c=atoi(s);/*字符串转换成长整型数的一种函数*/
   }while(c<0||c>7);
   return c;
}

main()

{   

    struct airline air[MAXSIZE]={{"beijing","1","B8571","SUN",6,1},
    {"guangzhou","2","S1002","MON",2,2},
    {"shenzhen","3","L1003","FRI",1,1},
    {"beijing","4","D1005","TUE",5,1},
    {"beijing","5","G1006","SUN",6,3},
    {"leizhou","6","A1007","SUN",6,5}};/*初始化航线信息*/

  start=air;
  //printf("航空客运订票系统\n学号:3213006253\n班级:软件工程1班\n名字:黄骎\n");
    printf("\t\t=============航空客运订票系统=============\n"); 
    printf("\n");
    printf("\n");
    printf("\t\t=            学号:3213006253            =\n");
    printf("\n");
    printf("\n");
    printf("\t\t=            班级:软件工程1班           =\n");
    printf("\n");
    printf("\n");
    printf("\t\t=            名字:黄骎                  =\n");
    printf("\t\t==========================================\n");
    printf("\n");
    printf("\n");
  for(;;)
  {
    switch(menu_select())
    {
       case 1:list();break;
       case 2:prtlink();break;
       case 3:search();break;
       case 4:ordering();break;
       case 5:return_ticket();break;
       case 6:printf("\n欢迎使用本系统,再见!\n");exit(0);
    }
    printf("\nPress any key to continue!\n");
    getchar();
  }

}

你可能感兴趣的:(数据结构,c)