www.pudn.com > Flight_Book.rar > 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; 
}