2.3.6 查询航线:终点站名:shanghai
3 调试分析
3.1 本次的设计比较困难,需要实现较多的功能,所以在调试过程中不太顺利,主要是指针的修改。经过反复调试以后才得以解决。
3.2 本程序航线采用数组的存储结构,每条航线包含8个域,其中乘员名单域为指向乘员名单链表的头指针,等候替补的客户名单域为分别指向对头和对尾的指针。
3.3 订票函数是在退票业务模块中使用
4 经验和体会
通过这次的程序设计,进一步理解了链表和队列结构的实现和应用。尤其需要注意的是:对于指针的修改要仔细,否则会发生意想不到的结果。
5 源程序清单和运行结果
5.1 程序清单
#include<iostream.h>
#include<iomanip.h>
#include<string.h>
#include<stdio.h>
#include<conio.h>
#define FLIGHT_NUM 100//航线最大数量
typedef struct Al_Custom //已订票客户
{
char name[15];//姓名
int count;//订票量
int level;//舱位等级
Al_Custom *next;//下一节点指针
}Al_Custom,*Al_CustomLink;
typedef struct Wait_Custom//等候替补的客户
{
char name[15];//姓名
int count;//所需票量
Wait_Custom *next;//下一节点指针
}Wait_Custom;
typedef struct Wait_Queue//等待队列
{
Wait_Custom *front;//队列头指针
Wait_Custom *rear;//尾指针
}Wait_Queue;
typedef struct Flight//航线
{
char terminus[15];//终点站名
char flight_no[10];//航班号
char plane_no[10];//飞机号
int week;//飞行周日
int count;//乘客定额
int rest;//余票量
Al_CustomLink Al_link;//指向成员名单链表的头指针
Wait_Queue wait_queue;//等待替补队列
}Flight;
void Custom_init(Al_CustomLink &L)
{
L=new Al_Custom;
L->next=0;
}
void Custom_insert(Al_CustomLink &L,Al_Custom& custom)
{
Al_Custom *p=L,*newnode=new Al_Custom;
memcpy((void*)newnode,&custom,sizeof(Al_Custom));
newnode->next=p->next;
p->next=newnode;
}
void copyCustomLink(Al_CustomLink &dest,Al_CustomLink &source)//复制已订票客户链表
{
Al_CustomLink p=source;
Al_CustomLink q;
Al_Custom *pnew;
Custom_init(dest);
q=dest;
while(p->next)
{
pnew=new Al_Custom;
memcpy(pnew,p->next,sizeof(Al_Custom));
pnew->next=0;
q->next=pnew;
q=pnew;
p=p->next;
}
}
void Waiter_init(Wait_Queue &Q)
{
Q.front=Q.rear=new Wait_Custom;
Q.front->next=0;
}
void Waiter_En(Wait_Queue &Q,Wait_Custom& custom)
{
Wait_Custom *newnode=new Wait_Custom;
memcpy(newnode,&custom,sizeof(Wait_Custom));
newnode->next=0;
Q.rear->next=newnode;
Q.rear=newnode;
}
bool Waiter_De(Wait_Queue &Q,Wait_Custom& custom)
{
if(Q.rear==Q.front)
return false;
memcpy(&custom,Q.front,sizeof(Wait_Custom));
Wait_Custom *p=Q.front->next;
Q.front->next=p->next;
if(Q.rear!=Q.front)
Q.rear=Q.front;
delete p;
custom.next=0;
return true;
}
void copyWait_Queue(Wait_Queue &dest,Wait_Queue& source)//复制等待队列
{
Wait_Custom *p=source.front;
Waiter_init(dest);
while(p->next)
{
Waiter_En(dest,*p);
p=p->next;
}
}
int flight_no;//航线数量
Flight flight[FLIGHT_NUM];//航线数组
void initFlight(Flight &f)//初始化一条航线
{