📄 objarray.cpp
字号:
#include "ObjArray.h"
#include "BaseObj.h"
#include "string.h"
#include "Flight.h"
#include "Passenger.h"
#include "User.h"
#include "DataType.h"
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-----------------------------+
|以下这些函数很简单,不用注释 |
+-----------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
CObjArray::CObjArray()
{
arrayHead.nextObj = NULL;
count = 0;
}
CObjArray::CObjArray(ObjectTag tag)
{
arrayHead.nextObj = NULL;
count = 0;
this->tag = tag;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-----------------------------+
|析构函数, 释放内存空间 |
+-----------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
CObjArray::~CObjArray()
{
Object *p, *q;
p = q = arrayHead.nextObj;
if(USER == tag)
{
while(p)
{
q = p->nextObj;
if(p->objPoint)
delete ((CUser *)(p->objPoint));
delete p;
p = q;
count--;
}
}
if(tag == PASSENGER)
{
while(p)
{
q = p->nextObj;
if(p->objPoint)
delete ((CPassenger *)(p->objPoint));
delete p;
p = q;
count--;
}
}
if(tag == FLIGHT)
{
CBaseObj *flight;
while(p)
{
q = p->nextObj;
if((flight = p->objPoint))
{
PASS *ps1, *ps2;
ps1 = ps2 = ((CFlight *)flight)->GetPass().nextStation;
while(ps2)
{
ps1 = ps2;
ps2 = ps2->nextStation;
}
}
delete p;
p = q;
count--;
}
}
}
int CObjArray::GetCount()
{
return count;
}
ObjectTag CObjArray::GetTag()
{
return tag;
}
Object CObjArray::GetHead()
{
return arrayHead;
}
CBaseObj * CObjArray::operator[](int index)
{
int i = 0;
Object *p;
p = arrayHead.nextObj;
if(index < count)
{
while(p)
{
if(i == index)
return p->objPoint;
p = p->nextObj;
i++;
}
}
return NULL;
}
/*___________________________________
+-------------------+
|这个函数清空链表 |
+-------------------+
_____________________________________*/
void CObjArray::clear()
{
Object *p, *q;
p = q = arrayHead.nextObj;
if(tag != FLIGHT)
{
while(p)
{
q = p->nextObj;
if(p->objPoint)
delete p->objPoint;
delete p;
p = q;
count--;
}
}
else
{
while(p)
{
q = p->nextObj;
if(p->objPoint)
{
PASS *ps1, *ps2;
ps1 = ps2 = ((CFlight *)(p->objPoint))->GetPass().nextStation;
while(ps2)
{
ps1 = ps2;
ps2 = ps2->nextStation;
delete ps1;
}
}
delete p;
p = q;
count--;
}
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+-----------------------------------+
|这个函数按关键字的升序添加到链表中 |
+-----------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
void CObjArray::AddSort(CBaseObj *objPoint)
{
Object *p, *q,*p1,*p2;
q = new Object;
q->objPoint = objPoint;
q->nextObj = NULL;
p = arrayHead.nextObj;
p1 = p2 =p;
count++; //对象数目加一
if(tag == FLIGHT)
{
if(!p)
arrayHead.nextObj = q;
//插在首记录之前
else if(strcmp(((CFlight *)p)->GetFltNo(), ((CFlight *)(q->objPoint))->GetFltNo()) >= 0)
{
q->nextObj = p;
arrayHead.nextObj = q;
}
else
{
while(p2 && strcmp(((CFlight *)p2)->GetFltNo(), ((CFlight *)(q->objPoint))->GetFltNo()) <= 0)
{
p1 = p2;
p2 = p2->nextObj;
}
p1->nextObj = q;
q->nextObj = p2;
}
}
if(tag == PASSENGER)
{
if(!p)
arrayHead.nextObj = q;
else if(strcmp(((CPassenger *)p)->GetIdentity(), ((CPassenger *)(q->objPoint))->GetIdentity()) >= 0)
{
q->nextObj = p;
arrayHead.nextObj = q;
}
else
{
while(p2 && strcmp(((CPassenger *)p2)->GetIdentity(), ((CPassenger *)(q->objPoint))->GetIdentity()) <= 0)
{
p1 = p2;
p2 = p2->nextObj;
}
p1->nextObj = q;
q->nextObj = p2;
}
}
if(tag == USER)
{
if(!p)
arrayHead.nextObj = q;
else if(strcmp(((CUser *)p)->GetUserID(), ((CUser *)(q->objPoint))->GetUserID()) >= 0)
{
q->nextObj = p;
arrayHead.nextObj = q;
}
else
{
while(p2 && strcmp(((CUser *)p)->GetUserID(), ((CUser *)(q->objPoint))->GetUserID()) <= 0)
{
p1 = p2;
p2 = p2->nextObj;
}
p1->nextObj = q;
q->nextObj = p2;
}
}
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+---------------------------------------+
|此函数按关键字在链表中查找信息, |
|返回Object *的指针 |
+---------------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
Object * CObjArray::Find(char *key)
{
Object *p;
p = arrayHead.nextObj;
if(tag == FLIGHT)
{
while(p)
{
if(0 == strcmp(((CFlight *)(p->objPoint))->GetFltNo(), key))
return p;
p = p->nextObj;
}
}
if(tag == PASSENGER)
{
while(p)
{
if(0 == strcmp(((CPassenger *)(p->objPoint))->GetIdentity(), key))
return p;
p = p->nextObj;
}
}
if(tag == USER)
{
while(p)
{
if(0 == strcmp(((CUser *)(p->objPoint))->GetUserID(), key))
return p;
p = p->nextObj;
}
}
return NULL;
}
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+---------------------------------------+
|此函数按关键字删除一个信息 |
+---------------------------------------+
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
bool CObjArray::Delete(char *key)
{
Object *p, *p1, *p2;
p = Find(key);
if(p)
{
p1 = p2 = arrayHead.nextObj;
while(p2)
{
if(p == p2)
{
if(p1 == p2) //删除的是第一个记录
{
arrayHead.nextObj = NULL;
delete p;
return true;
}
else
{
p1->nextObj = p2->nextObj;
delete p;
return true;
}
}
p1 = p2;
p2 = p2->nextObj;
}
}
return false;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -