题目:火车售票系统的设计与实现
任务:通过此系统可以实现售票、退票、车票剩余情况查询等功能。每张车票包含 车次、座位信息。
要求:在售票、退票、查询剩余票等环节中,都必须显示出车票的信息,即车次、座位情况。
为简单起见,在此假设所有出售的车票均为同一车次的车票。
退票时,必须是车站售出的车票才能退,否则视为无效票,不能退票。
定义如下:
#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
#include<string.h>
#define MAXSIZE 3 //定义火车车程量最大值
typedef struct wat_ros
{
char name[10];//姓名
int req_amt; //订票量
struct wat_ros *next;
}qnode,*qptr;
typedef struct pqueue
{
qptr front; //等候替补客户名单域的头指针
qptr rear; //等候替补客户名单域的尾指针
}linkqueue;
typedef struct ord_ros
{
char name[10]; //客户姓名
int ord_amt; //订票量
int grade; //车厢号
struct ord_ros *next;
}linklist;
struct trainline
{
char ter_name[50]; //终点站名
char train_num[50]; //车次
char day[50]; //运行周日
int tkt_amt; //乘员定额
int tkt_sur; //余票数量
linklist *order; //乘员名单域,指向乘员名单链表的头指针
linkqueue wait; //乘员名单域,分别指向排队等候名单队头队尾指针
}lineinfo;
struct trainline *start;
打印基本信息:
void display(struct trainline *info)
{
//打印基本信息
printf("%8s\t%3s\t%s\t\t%3d\t%10d\n",info->ter_name,info->train_num,info->day,info->tkt_amt,info->tkt_sur);
}
显示车次信息:
void list()
{
struct trainline *info;
int i=0;
info=start;
printf("终点 车次 运行时间 成员数量 剩余数量\n");
while(i<MAXSIZE)
{
display(info);
info++;
i++;
}
printf("\n\n");
}
搜索功能(根据客户提出的终点站名输出车次信息):
void search()
{ //根据客户提出的终点站名输出车次信息
struct trainline *info,*find();
char name[10];
int i=0;
info=start;
printf("请输入您要去的终点站名:\n");
scanf("%s",name);
while(i<MAXSIZE)
{
if(!strcmp(name,info->ter_name))
break;
info++;
i++;
}
if(i>MAXSIZE)
printf("没有找到该终点站!\n");
else
{
printf("终点 车次 运行时间 成员数量 剩余数量\n");
display(info);
}
}
查询功能(根据系统提供的车次号进行查询并且以指针形式返回):
struct trainline *find()
{
//根据系统提供的车次号进行查询并且以指针形式返回
struct trainline *info;
char number[10];
int i=0;
info=start;
printf("请输入你的车次号");
scanf("%s",number);
while(i<MAXSIZE)
{
if(!strcmp(number,info->train_num))
return info;
info++;
i++;
}
printf("抱歉,没有找到车次");
return NULL;
}
打印功能(打印订票乘员名单域的客户名单信息):
void prtlink()
{
//打印订票乘员名单域的客户名单信息
linklist *p;
struct trainline *info;
info=find();
p=info->order;
if(p!=NULL)
{
printf("乘员姓名 已购票数 座位号\n");
while(p)
{
printf("%s\t\t%d\t%d\n",p->name,p->ord_amt,p->grade);
p=p->next;
}
}
else
printf("已购票人员为0!\n");
}
订票功能(添加订票乘员名单域的客户信息):
linklist *insertlink(linklist *head,int amount, char name[],int grade)
{
//添加订票乘员名单域的客户信息
linklist *p1,*news;
p1=head;
news=(linklist*)malloc(sizeof(linklist));
if(!news)
{
printf("\n 没有空间!\n");
return NULL;
}
strcmp(news->name,name);
news->ord_amt=amount;
news->grade=grade;
news->next=NULL;
if(head==NULL)
{
head=news; //若原没有乘客订票
news->next=NULL;
}
else
head=news;
news->next=p1;
return head;
}
增加排队等候的客户的名单域 功能:
linkqueue appendqueue(linkqueue q,char name[],int amount)
{
//增加排队等候的客户的名单域
qptr news;
news=(qptr)malloc(sizeof(qnode));
strcpy(news->name,name);
news->req_amt=amount;
news->next=NULL;
if(q.front==NULL)
q.front=news;
else
q.rear->next=news;
q.rear=news;
return q;
}