📄 queue.cpp
字号:
// Queue.cpp: implementation of the Queue class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "AviationBS.h"
#include <fstream.h>
#include "Queue.h"
#include "UsedLine.h"
#include "SysLine.h"
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
extern UsedLine usedLine;
extern SysLine sysLine;
//////////////////////////////////////////////////////////////////////
// Construction/Destruction of BuildQLink
QLink* BuildQLink::Append(const Queuer &item) //用于读文件时独个创建
{
return tail=tail->next=new QLink(item);
}
void BuildQLink::insert(COleDateTime time,CString name,CString id,int FcNum,int TcNum,bool Try)
{
int i;
for(i=0;i<5;i++)
if(qFlight[i].FlyTime==time)break;
if(i==5)return;
else {
Queuer temp;
for(int j=0;j<20;j++)
{
if(j<name.GetLength())temp.name[j]=name.GetAt(j);
else temp.name[j]=' ';
if(j<id.GetLength())temp.ID[j]=id.GetAt(j);
else temp.ID[j]=' ';
}
temp.FCNum=FcNum;
temp.TCNum=TcNum;
temp.isTry=Try;
if(Size==0)
{
tail=tail->next=new QLink(temp,NULL);
qFlight[i].end=qFlight[i].start=tail;
}
else if(qFlight[i].start==NULL)
{
for(j=i;j>=0;j--)
if(qFlight[j].size!=0)break;
if(j>=0){
qFlight[j].end->next=new QLink(temp,qFlight[i].end->next);
qFlight[i].start=qFlight[i].end=qFlight[j].end->next;
}
else {
head->next=new QLink(temp,head->next);
qFlight[i].start=qFlight[i].end=head->next;
}
}
else qFlight[i].end=qFlight[i].end->next=new QLink(temp,qFlight[i].end->next);
if(qFlight[i].end->next==NULL)tail=qFlight[i].end; //在队伍尾部增加客户
qFlight[i].size++;
Size++;
}
}
//退票后,处理候票队伍时,查找航班
int BuildQLink::Find(COleDateTime time)
{
for(int i=0;i<5;i++)
if(time==qFlight[i].FlyTime)
return i;
return -1;
}
//退票后,处理候票队伍时,删除已出列的客户
void BuildQLink::remove(QLink *item,int index)
{
QLink* temp=item;
item=qFlight[index].start;
if(item==temp) //删除的是第一个结点
{
for(int i=index;i>=0;i--)
if(qFlight[i].size!=0)break;
if(i>=0)qFlight[i].end->next=qFlight[index].start->next;
else head->next=qFlight[index].start->next;
qFlight[index].start=qFlight[index].start->next;
if(qFlight[index].size==1)qFlight[index].end=qFlight[index].start;
}
else{
while(item->next!=temp)item=item->next;
if(qFlight[index].end==temp)qFlight[index].end=item; //更新航班内末结点地址
item->next=item->next->next;
}
if(item->next==NULL)tail=item;
qFlight[index].size--;
Size--;
delete temp;
}
//新增航班时,对应的排队队列应调整
void BuildQLink::addFlight(int index,COleDateTime time)
{
for(int i=index;i<4;i++)
qFlight[i+1]=qFlight[i];
qFlight[index].size=0;
qFlight[index].start=qFlight[index].end=NULL;
qFlight[index].FlyTime=time;
}
// Construction/Destruction of Queue
//从文件中读取
void Queue::readFile(int dayInWeek)
{
COleDateTime Now=COleDateTime::GetCurrentTime();
char FilePath[20]={'D','a','t','a','B','a','s','e','/','Q','u','e','u','e',' ','.','d','a','t','\0'};
FilePath[14]=dayInWeek+48;
fstream file(FilePath,ios::binary | ios::in);
file.seekp(0,ios::beg);
long beg=file.tellp();
file.seekp(0,ios::end);
long end=file.tellp();
if(end!=beg)
{
Queuer temp;
QueueInFile temp1;
file.seekp(sizeof(COleDateTime),ios::beg);
while(file.tellp()!=end)
{
file.read((char*)& temp1,long(sizeof(QueueInFile)));
queueData[dayInWeek].LineLink[temp1.line].Size=temp1.size;
for(int i=0;i<5;i++)
{
if(temp1.FSize[i]==0)continue;
//航班已过期跳过
if(Now>=queueData[dayInWeek].LineLink[temp1.line].qFlight[i].FlyTime)
{
file.seekp(temp1.FSize[i]*sizeof(Queuer),ios::cur);
queueData[dayInWeek].LineLink[temp1.line].Size-=temp1.FSize[i];
continue;
}
queueData[dayInWeek].LineLink[temp1.line].qFlight[i].size=temp1.FSize[i];
file.read((char *)& temp,long(sizeof(Queuer)));
//start标记第i个航班的第一个排队客户的地址
queueData[dayInWeek].LineLink[temp1.line].qFlight[i].start=
queueData[dayInWeek].LineLink[temp1.line].Append(temp);
//读出其他的客户
for(int j=1;j<temp1.FSize[i]-1;j++)
{
file.read((char *)& temp,long(sizeof(Queuer)));
queueData[dayInWeek].LineLink[temp1.line].Append(temp);
}
//end标记第i个航班的最后一个客户的地址
if(temp1.FSize[i]==1)
queueData[dayInWeek].LineLink[temp1.line].qFlight[i].end=
queueData[dayInWeek].LineLink[temp1.line].qFlight[i].start;
else{
file.read((char *)& temp,long(sizeof(Queuer)));
queueData[dayInWeek].LineLink[temp1.line].qFlight[i].end=
queueData[dayInWeek].LineLink[temp1.line].Append(temp);
}
}
}
}
file.close();
}
////////////////////////////////////////////////////////////////////
void Queue::OnCreate()
{
COleDateTime Date;
int dayInWeek,i;
for(i=0;i<7;i++)
{
Date=usedLine.GetNextNDay(i);
dayInWeek=Date.GetDayOfWeek()-1;
queueData[dayInWeek].Date=Date;
for(int j=0;j<sysLine.LineSz;j++)
{
for(int k=0;k<sysLine.flightArray[j].flightN;k++) //初始化航班
{
queueData[dayInWeek].LineLink[j].qFlight[k].FlyTime.SetDateTime(
Date.GetYear(),Date.GetMonth(),Date.GetDay(),
sysLine.flightArray[j].flightInfo[k].FlyTime.GetHour(),
sysLine.flightArray[j].flightInfo[k].FlyTime.GetMinute(),
sysLine.flightArray[j].flightInfo[k].FlyTime.GetSecond());
}
}
}
long beg,end;
COleDateTime Time;
for(i=6;i>=0;i--)
{
dayInWeek=usedLine.GetNextNDay(i).GetDayOfWeek()-1;
char FilePath[20]={'D','a','t','a','B','a','s','e','/','Q','u','e','u','e',' ','.','d','a','t','\0'};
FilePath[14]=dayInWeek+48;
fstream file(FilePath,ios::binary | ios::in);
file.seekp(0,ios::beg);
beg=file.tellp();
file.seekp(0,ios::end);
end=file.tellp();
if(beg!=end)
{
file.seekp(0,ios::beg);
file.read((char *)& Time,long(sizeof(COleDateTime)));
if(Time==queueData[dayInWeek].Date){readFile(dayInWeek);file.close();}
else {file.close();DeleteFile(FilePath);} //从当前开始第i天都已过期,清空文件
}
}
}
void Queue::Save()
{
int dayInWeek;
for(int i=0;i<7;i++)
{
dayInWeek=usedLine.GetNextNDay(i).GetDayOfWeek()-1;
if(queueData[dayInWeek].isChange==false)continue;
char FilePath[20]={'D','a','t','a','B','a','s','e','/','Q','u','e','u','e',' ','.','d','a','t','\0'};
FilePath[14]=dayInWeek+48;
fstream file(FilePath,ios::out | ios::binary);
file.seekp(0,ios::beg);
file.write((char *)& queueData[dayInWeek].Date,long(sizeof(COleDateTime)));
QueueInFile temp1;
for(int k=0;k<sysLine.LineSz;k++)
{
temp1.size=queueData[dayInWeek].LineLink[k].Size;
if(temp1.size==0)continue;
temp1.line=k;
for(int j=0;j<5;j++)
temp1.FSize[j]=queueData[dayInWeek].LineLink[k].qFlight[j].size;
file.write((char*)& temp1,long(sizeof(QueueInFile)));
QLink *temp=queueData[dayInWeek].LineLink[k].head->next;
while(temp!=NULL)
{
file.write((char*)& temp->queuer,long(sizeof(Queuer)));
temp=temp->next;
}
}
file.close();
}
}
//删除航线
void Queue::deleteLine(int index)
{
for(int i=0;i<7;i++)
{
for(int j=index;j<sysLine.LineSz-1;j++)
queueData[i].LineLink[j]=queueData[i].LineLink[j+1];
queueData[i].isChange=true;
}
}
//新增航班时可能导致航班的增加,对应的排队队列应调整
void Queue::addLine(int Lindex,int Findex,COleDateTime time)
{
COleDateTime temp; //记录飞机起飞时间
int size=sysLine.LineSz-1; //新增加航线之前原航线的总数
for(int i=0;i<7;i++)
{
for(int j=size;j>Lindex;j--) //整理出空间存放新增的航线
queueData[i].LineLink[j]=queueData[i].LineLink[j-1];
}
//增加到每一天的对应所在的航线中
addFlight(Lindex,Findex,time);
}
//新增航班时,对应的排队队列应调整
void Queue::addFlight(int Lindex,int Findex,COleDateTime time)
{
COleDateTime temp; //记录飞机起飞时间
for(int i=0;i<7;i++)
{
temp.SetDateTime(queueData[i].Date.GetYear(),queueData[i].Date.GetMonth(),
queueData[i].Date.GetDay(),time.GetHour(),time.GetMinute(),time.GetSecond());
//增加到每一天的对应所在的航线中
queueData[i].LineLink[Lindex].addFlight(Findex,temp);
queueData[i].isChange=true;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -