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

📄 objarray.cpp

📁 近日做C++课程设计时写的一个民航订票系统
💻 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 + -