⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 airsys.cpp

📁 机票售票系统
💻 CPP
字号:
//////////////////////////////////////////////////////////////////////////
//		航空客运售票系统核心类(airsys.cpp)								//
//////////////////////////////////////////////////////////////////////////

#include "stdafx.h"		//MFC支持库
#include "string.h"		//字符串函数库
#include "airsys.h"		//结构体和类定义

//////////////////////////////////////////////////////////////////////////
//			类成员函数实现												//
//////////////////////////////////////////////////////////////////////////

personlist::personlist()
{
	first=NULL;
}

personlist::~personlist()
{
	clear();
}

void personlist::clear()
{
	short a,b;
	while(first)							//循环删除第一个客户
		delperson(first->name,a,b);
}

person *personlist::addperson(char *vname,short vnum,short vlevel)
{
	static long nowindex=0;
	person *p=first,*np=new person,*pp;		//pp是p的前一个结点
	if(np==NULL) return NULL;				//无法申请空间则返回NULL
	strncpy(np->name,vname,11);
	np->name[10]=NULL;
	np->num=vnum;
	np->level=vlevel;
	np->index=++nowindex;
	while(p)
	{
//		if(strcmp(vname,p->name)==0)
//			return NULL;					//已经有此结点则返回NULL
		if(strcmp(vname,p->name)<0)
			break;
		pp=p;
		p=(person *)p->next;
	}
	np->next=p;
	if(p==first)
		first=np;
	else
		pp->next=np;
	return np;								//插入后返回1
}

int personlist::delperson(char *vname,short &vnum,short &vlevel)
{
	person *p=first,*pp;					//pp是p的前一个结点
	while(p)
	{
		if(strcmp(vname,p->name)==0)
		{
			if(p==first)
				first=(person *)p->next;
			else
				pp->next=p->next;
			vnum=p->num;
			vlevel=p->level;
			delete p;
			return 1;						//删除后返回1
		}
		pp=p;
		p=(person *)p->next;
	}
	return 0;								//查找无结点则返回0
}

//////////////////////////////////////////////////////////////////////////

personqueue::personqueue()
{
	first=NULL;
	num=0;
}

personqueue::~personqueue()
{
	clear();
}

void personqueue::clear()
{
	while(first)							//循环删除队头客户
		delperson();
}

person *personqueue::addperson(char *vname,short vnum,short vlevel)
{
	person *p=first,*np=new person;
	if(np==NULL)
		return NULL;							//无法申请空间则返回0
	num++;
	strncpy(np->name,vname,11);
	np->name[10]=NULL;
	np->num=vnum;
	np->level=vlevel;
	np->next=NULL;
	if(p==NULL)
		first=np;
	else
	{
		while(p->next)
			p=(person *)p->next;
		p->next=np;
	}
	return np;
}

int personqueue::delperson()
{
	person *p=first;
	if(p==NULL)
		return 0;
	first=(person *)p->next;
	num--;
	delete p;
	return 1;
}

int personqueue::delperson(char *vname)	//算法同personlist::delperson()
{
	person *p=first,*pp;					//pp是p的前一个结点
	while(p)
	{
		if(strcmp(vname,p->name)==0)
		{
			if(p==first)
				first=(person *)p->next;
			else
				pp->next=p->next;
			num--;
			delete p;
			return 1;						//删除后返回1
		}
		pp=p;
		p=(person *)p->next;
	}
	return 0;								//查找无结点则返回0
}

person *personqueue::popperson()
{
	person *p=first;
	if(p)
	{
		num--;
		first=(person *)p->next;
	}
	return p;
}

//////////////////////////////////////////////////////////////////////////

flight::flight()
{
	short i,j;
	for(i=0;i<3;i++)
		for(j=0;j<=1000;j++)
			pos[i][j]=0;
}

flight::~flight()
{
	clear();
}

void flight::clear()
{
	pay.clear();
	wait.clear();
	space[0]=num[0];
	space[1]=num[1];
	space[2]=num[2];
}

short flight::getpos(short vlevel)
{
	for(short i=1;i<=num[vlevel];i++)
		if(pos[vlevel][i]==0)
			return i;
	return 0;
}

long flight::getn(char *vname)
{
	person *p=pay.first;
	while(p)
	{
		if(strcmp(p->name,vname)==0)
			return p->index;
		p=(person *)p->next;
	}
	return 0;
}

person *flight::addperson(char *vname,short vnum,short vlevel)
{
	if(space[vlevel]>=vnum)
	{
		person *p=pay.addperson(vname,vnum,vlevel);
		if(p)
			space[vlevel]-=vnum;
		for(short i=0;i<vnum;i++)
			pos[vlevel][getpos(vlevel)]=getn(vname);
		return p;
	}
	return NULL;
}

int flight::delperson(char *vname)
{
	short tnum,tlevel;
	long n=getn(vname);
	int r=pay.delperson(vname,tnum,tlevel);
	if(r)
	{
		space[tlevel]+=tnum;
		for(short i=1;i<=num[tlevel];i++)
			if(pos[tlevel][i]==n)
				pos[tlevel][i]=0;
	}
	else
		return wait.delperson(vname);
	return 1;
}

void flight::movewtop()
{
	short i;
	person *p;
	for(i=0;i<wait.num;i++)
	{
		p=wait.popperson();
		addperson(p->name,p->num,p->level);
		delete p;
	}
}

person *flight::getpay(short n)
{
	if(n<0)
		return NULL;
	person *p=pay.first;
	while(p&&n--)
		p=(person *)p->next;
	return p;
}

person *flight::getwait(short n)
{
	if(n<0)
		return NULL;
	person *p=wait.first;
	while(p&&n--)
		p=(person *)p->next;
	return p;
}

short flight::findpay(person *p)
{
	short n=0;
	person *pp=pay.first;
	while(pp!=p && pp!=NULL)
	{
		pp=(person *)pp->next;
		n++;
	}
	if(pp==NULL)
		return -1;
	return n;
}

short flight::findwait(person *p)
{
	short n=0;
	person *pp=wait.first;
	while(pp!=p && pp!=NULL)
	{
		pp=(person *)pp->next;
		n++;
	}
	if(pp==NULL)
		return -1;
	return n;
}

//////////////////////////////////////////////////////////////////////////

city::city()
{
	first=NULL;	
}

city::~city()
{
	clear();
}

void city::clear()
{
	while(first)
		delflight(first->name);
}

flight *city::addflight(char *vcname,char *vfname,char *vpname,short vday,short vnum1,short vnum2,short vnum3)
{
	flight *f=first,*nf=new flight;
	if(nf==NULL)
		return NULL;
	strncpy(nf->cname,vcname,11);
	nf->cname[10]=NULL;
	strncpy(nf->name,vfname,11);
	nf->name[10]=NULL;
	strncpy(nf->pname,vpname,11);
	nf->pname[10]=NULL;
	nf->day=vday;
	nf->num[0]=nf->space[0]=vnum1;
	nf->num[1]=nf->space[1]=vnum2;
	nf->num[2]=nf->space[2]=vnum3;
	nf->next=NULL;
	if(f==NULL)
		first=nf;
	else
	{
		while(f->next)
			f=f->next;
		f->next=nf;
	}
	return nf;
}

int city::delflight(char *vfname)
{
	flight *p=first,*pp;					//pp是p的前一个结点
	while(p)
	{
		if(strcmp(vfname,p->name)==0)
		{
			if(p==first)
				first=p->next;
			else
				pp->next=p->next;
			delete p;
			return 1;						//删除后返回1
		}
		pp=p;
		p=p->next;
	}
	return 0;								//查找无结点则返回0
}

flight *city::get(short n)
{
	if(n<0)
		return NULL;
	flight *f=first;
	while(f&&n--)
		f=f->next;
	return f;
}

short city::find(flight *f)
{
	short n=0;
	flight *ff=first;
	while(ff!=f && ff!=NULL)
	{
		ff=ff->next;
		n++;
	}
	if(ff==NULL)
		return -1;
	return n;
}

//////////////////////////////////////////////////////////////////////////

airsystem::airsystem()
{
	first=NULL;
}

airsystem::~airsystem()
{
	clear();
}

void airsystem::clear()
{
	while(first)
		delcity(first->name);
}

city *airsystem::addcity(char *vname)
{
	city *c=first,*nc=new city;
	if(nc==NULL)
		return NULL;
	strncpy(nc->name,vname,11);
	nc->name[10]=NULL;
	nc->next=NULL;
	if(c==NULL)
		first=nc;
	else
	{
		while(c->next)
			c=c->next;
		c->next=nc;
	}
	return nc;
}

int airsystem::delcity(char *vname)
{
	city *p=first,*pp;						//pp是p的前一个结点
	while(p)
	{
		if(strcmp(vname,p->name)==0)
		{
			if(p==first)
				first=p->next;
			else
				pp->next=p->next;
			delete p;
			return 1;						//删除后返回1
		}
		pp=p;
		p=p->next;
	}
	return 0;								//查找无结点则返回0
}

city *airsystem::get(short n) 
{
	if(n<0)
		return NULL;
	city *c=first;
	while(c&&n--)
		c=c->next;
	return c;
}

short airsystem::find(city *c)
{
	short n=0;
	city *cc=first;
	while(cc!=c && cc!=NULL)
	{
		cc=cc->next;
		n++;
	}
	if(cc==NULL)
		return -1;
	return n;
}

//////////////////////////////////////////////////////////////////////////
//		The End															//
//////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -